From 30b9a16569d0e5e13e2f283bb8bc80512a7d0175 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 18 Apr 2024 18:47:21 +0700 Subject: [PATCH 01/65] start on nft support --- .../document/v0/document-meta.json | 18 ++ packages/rs-dpp/src/document/accessors/mod.rs | 37 ++++ .../rs-dpp/src/document/accessors/v0/mod.rs | 9 + packages/rs-dpp/src/document/fields.rs | 3 + packages/rs-dpp/src/document/v0/accessors.rs | 13 ++ packages/rs-dpp/src/document/v0/mod.rs | 18 ++ .../document_delete_transition/v0/mod.rs | 89 -------- .../document_replace_transition/v0/mod.rs | 204 ------------------ .../from_document.rs | 43 ++++ .../document_transfer_transition/mod.rs | 19 ++ .../v0/from_document.rs | 36 ++++ .../document_transfer_transition/v0/mod.rs | 44 ++++ .../v0/v0_methods.rs | 66 ++++++ .../v0_methods.rs | 55 +++++ .../document_transition/mod.rs | 124 ++--------- .../mod.rs | 87 ++++++++ .../state_v0/mod.rs | 66 ++++++ .../structure_v0/mod.rs | 42 ++++ .../documents_batch/action_validation/mod.rs | 1 + .../documents_batch/transformer/v0/mod.rs | 98 +++++++-- ...tion.rs => document_replace_transition.rs} | 0 .../document/document_transfer_transition.rs | 51 +++++ .../drive/batch/transitions/document/mod.rs | 3 +- .../document_replace_transition_action/mod.rs | 2 +- .../mod.rs | 89 ++++++++ .../transformer.rs | 36 ++++ .../v0/mod.rs | 33 +++ .../v0/transformer.rs | 52 +++++ .../document_transition/mod.rs | 7 + .../src/version/dpp_versions.rs | 1 + .../src/version/drive_abci_versions.rs | 2 + 31 files changed, 926 insertions(+), 422 deletions(-) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs rename packages/rs-drive/src/drive/batch/transitions/document/{document_update_transition.rs => document_replace_transition.rs} (100%) create mode 100644 packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index e802b7825af..90f0f8e7516 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -481,6 +481,24 @@ ], "description": "Public key security level. 0 - Master, 1 - Critical, 2 - High, 3 - Medium. If none specified, High level is used" }, + "transferable": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "description": "Transferable without a marketplace sell. 0 - Never, 1 - Always, 2 - Yes, but individual documents can be marked at creation as non transferable." + }, + "marketplace": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "description": "Built in marketplace system. 0 - None, 1 - Public Offer, a user will make an offer that needs to be accepted, 2 - Private Offer, a user will make an offer that needs to be accepted, 3 - Direct purchase (The user can buy the item without the need for an approval), 4 - Public Bidding, 5 - Private Bidding, 6 - Set at Document Level." + }, "requiresIdentityEncryptionBoundedKey": { "type": "integer", "enum": [ diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index 363f0c16962..1ae7acb658b 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -69,6 +69,12 @@ impl DocumentV0Getters for Document { } } + fn transferred_at(&self) -> Option { + match self { + Document::V0(v0) => v0.transferred_at, + } + } + fn created_at_block_height(&self) -> Option { match self { Document::V0(v0) => v0.created_at_block_height, @@ -81,6 +87,12 @@ impl DocumentV0Getters for Document { } } + fn transferred_at_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.transferred_at_block_height, + } + } + fn created_at_core_block_height(&self) -> Option { match self { Document::V0(v0) => v0.created_at_core_block_height, @@ -92,6 +104,12 @@ impl DocumentV0Getters for Document { Document::V0(v0) => v0.updated_at_core_block_height, } } + + fn transferred_at_core_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.transferred_at_core_block_height, + } + } } impl DocumentV0Setters for Document { @@ -131,6 +149,12 @@ impl DocumentV0Setters for Document { } } + fn set_transferred_at(&mut self, transferred_at: Option) { + match self { + Document::V0(v0) => v0.transferred_at = transferred_at, + } + } + fn set_created_at_block_height(&mut self, created_at_block_height: Option) { match self { Document::V0(v0) => v0.created_at_block_height = created_at_block_height, @@ -143,6 +167,13 @@ impl DocumentV0Setters for Document { } } + fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option) { + match self { + Document::V0(v0) => v0.transferred_at_block_height = transferred_at_block_height, + } + } + + fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option) { match self { Document::V0(v0) => v0.created_at_core_block_height = created_at_core_block_height, @@ -154,4 +185,10 @@ impl DocumentV0Setters for Document { Document::V0(v0) => v0.updated_at_core_block_height = updated_at_core_block_height, } } + + fn set_transferred_at_core_block_height(&mut self, transferred_at_core_block_height: Option) { + match self { + Document::V0(v0) => v0.transferred_at_core_block_height = transferred_at_core_block_height, + } + } } diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index 08f82607234..d9edf9d64f1 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -3,6 +3,7 @@ use platform_value::btreemap_extensions::{ }; use platform_value::Value; use std::collections::BTreeMap; +use crate::document::Document; use crate::identity::TimestampMillis; use crate::prelude::Identifier; @@ -30,6 +31,9 @@ pub trait DocumentV0Getters { /// Returns the time in milliseconds that the document was last updated. fn updated_at(&self) -> Option; + /// Returns the time in milliseconds that the document was last transferred. + fn transferred_at(&self) -> Option; + /// Retrieves the field specified by the path. /// Returns `None` if the path is empty or if the field is not present. fn get(&self, path: &str) -> Option<&Value> { @@ -40,8 +44,10 @@ pub trait DocumentV0Getters { fn properties_consumed(self) -> BTreeMap; fn created_at_block_height(&self) -> Option; fn updated_at_block_height(&self) -> Option; + fn transferred_at_block_height(&self) -> Option; fn created_at_core_block_height(&self) -> Option; fn updated_at_core_block_height(&self) -> Option; + fn transferred_at_core_block_height(&self) -> Option; } pub trait DocumentV0Setters: DocumentV0Getters { @@ -131,4 +137,7 @@ pub trait DocumentV0Setters: DocumentV0Getters { fn set_updated_at_block_height(&mut self, updated_at_block_height: Option); fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option); fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option); + fn set_transferred_at_core_block_height(&mut self, transferred_at_core_block_height: Option); + fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option); + fn set_transferred_at(&mut self, transferred_at: Option); } diff --git a/packages/rs-dpp/src/document/fields.rs b/packages/rs-dpp/src/document/fields.rs index 3933bfeb104..f4d7afee699 100644 --- a/packages/rs-dpp/src/document/fields.rs +++ b/packages/rs-dpp/src/document/fields.rs @@ -7,10 +7,13 @@ pub mod property_names { pub const OWNER_ID: &str = "$ownerId"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const TRANSFERRED_AT: &str = "$transferredAt"; pub const CREATED_AT_BLOCK_HEIGHT: &str = "$createdAtBlockHeight"; pub const UPDATED_AT_BLOCK_HEIGHT: &str = "$updatedAtBlockHeight"; + pub const TRANSFERRED_AT_BLOCK_HEIGHT: &str = "$transferredAtBlockHeight"; pub const CREATED_AT_CORE_BLOCK_HEIGHT: &str = "$createdAtCoreBlockHeight"; pub const UPDATED_AT_CORE_BLOCK_HEIGHT: &str = "$updatedAtCoreBlockHeight"; + pub const TRANSFERRED_AT_CORE_BLOCK_HEIGHT: &str = "$transferredAtCoreBlockHeight"; } pub const IDENTIFIER_FIELDS: [&str; 3] = [ diff --git a/packages/rs-dpp/src/document/v0/accessors.rs b/packages/rs-dpp/src/document/v0/accessors.rs index fb924bf364b..88836b725cb 100644 --- a/packages/rs-dpp/src/document/v0/accessors.rs +++ b/packages/rs-dpp/src/document/v0/accessors.rs @@ -181,6 +181,10 @@ impl DocumentV0Setters for DocumentV0 { self.updated_at = updated_at; } + fn set_transferred_at(&mut self, transferred_at: Option) { + self.transferred_at = transferred_at; + } + /// Sets the block height at which the document was created. This is applicable if the document's /// schema requires this information. /// @@ -201,6 +205,10 @@ impl DocumentV0Setters for DocumentV0 { self.updated_at_block_height = updated_at_block_height; } + fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option) { + self.transferred_at_block_height = transferred_at_block_height; + } + /// Sets the core network block height at which the document was created. This is applicable if the /// document's schema requires this information. /// @@ -220,4 +228,9 @@ impl DocumentV0Setters for DocumentV0 { fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option) { self.updated_at_core_block_height = updated_at_core_block_height; } + + fn set_transferred_at_core_block_height(&mut self, transferred_at_core_block_height: Option) { + self.transferred_at_core_block_height = transferred_at_core_block_height; + } + } diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index 32d39577808..68aab663b38 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -60,6 +60,12 @@ pub struct DocumentV0 { serde(rename = "$updatedAt", default) )] pub updated_at: Option, + /// The time in milliseconds that the document was last transferred, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$transferredAt", default) + )] + pub transferred_at: Option, /// The block that the document was created, if it is set as required by the document type schema. #[cfg_attr( feature = "document-serde-conversion", @@ -72,6 +78,12 @@ pub struct DocumentV0 { serde(rename = "$updatedAtBlockHeight", default) )] pub updated_at_block_height: Option, + /// The block that the document was last transferred to a new identity, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$transferredAtBlockHeight", default) + )] + pub transferred_at_block_height: Option, /// The core block that the document was created, if it is set as required by the document type schema. #[cfg_attr( feature = "document-serde-conversion", @@ -84,6 +96,12 @@ pub struct DocumentV0 { serde(rename = "$updatedAtCoreBlockHeight", default) )] pub updated_at_core_block_height: Option, + /// The core block that the document was last transferred to a new identity, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$transferredAtCoreBlockHeight", default) + )] + pub transferred_at_core_block_height: Option, } impl DocumentGetRawForContractV0 for DocumentV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs index 83c1b4b49bc..813ea0b2ddf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs @@ -22,92 +22,3 @@ pub struct DocumentDeleteTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, } -// -// impl DocumentTransitionObjectLike for DocumentDeleteTransitionV0 { -// #[cfg(feature = "state-transition-json-conversion")] -// fn from_json_object( -// json_value: JsonValue, -// data_contract: DataContract, -// ) -> Result { -// let mut document: DocumentDeleteTransitionV0 = serde_json::from_value(json_value)?; -// document.base.data_contract = data_contract; -// -// Ok(document) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_object( -// raw_transition: Value, -// data_contract: DataContract, -// ) -> Result { -// let base = DocumentBaseTransition::from_object(raw_transition, data_contract)?; -// -// Ok(DocumentDeleteTransitionV0 { base }) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_value_map( -// mut map: BTreeMap, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let base = DocumentBaseTransition::from_value_map_consume(&mut map, data_contract)?; -// -// Ok(DocumentDeleteTransitionV0 { base }) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_object(&self) -> Result { -// self.base.to_object() -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_value_map(&self) -> Result, ProtocolError> { -// self.base.to_value_map() -// } -// -// #[cfg(feature = "state-transition-json-conversion")] -// fn to_json(&self) -> Result { -// self.base.to_json() -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_cleaned_object(&self) -> Result { -// self.base.to_cleaned_object() -// } -// } -// -// #[cfg(test)] -// mod test { -// use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0Methods; -// use super::*; -// -// fn init() { -// let _ = env_logger::builder() -// .filter_level(log::LevelFilter::Debug) -// .try_init(); -// } -// -// #[test] -// fn test_deserialize_serialize_to_json() { -// init(); -// let transition_json = r#"{ -// "$action": 3, -// "$dataContractId": "5wpZAEWndYcTeuwZpkmSa8s49cHXU5q2DhdibesxFSu8", -// "$id": "6oCKUeLVgjr7VZCyn1LdGbrepqKLmoabaff5WQqyTKYP", -// "$type": "note" -// }"#; -// -// let cdt: DocumentDeleteTransitionV0 = -// serde_json::from_str(transition_json).expect("no error"); -// -// assert_eq!(cdt.base.document_type_name(), "note"); -// -// let mut json_no_whitespace = transition_json.to_string(); -// json_no_whitespace.retain(|v| !v.is_whitespace()); -// -// assert_eq!(cdt.to_json().unwrap().to_string(), json_no_whitespace); -// } -// } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 0af9315b29e..8e57b364e4f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -43,210 +43,6 @@ pub struct DocumentReplaceTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub data: BTreeMap, } -// -// impl DocumentReplaceTransitionV0 { -// pub(crate) fn to_document_for_dry_run( -// &self, -// owner_id: Identifier, -// ) -> Result { -// let properties = self.data.clone().unwrap_or_default(); -// Ok(Document { -// id: self.base.id, -// owner_id, -// properties, -// created_at: self.updated_at, // we can use the same time, as it can't be worse -// updated_at: self.updated_at, -// revision: Some(self.revision), -// }) -// } -// -// pub(crate) fn to_extended_document_for_dry_run( -// &self, -// owner_id: Identifier, -// platform_version -// ) -> Result { -// Ok(ExtendedDocument { -// feature_version: LATEST_PLATFORM_VERSION -// .extended_document -// .default_current_version, -// document_type_name: self.base.document_type_name.clone(), -// data_contract_id: self.base.data_contract_id, -// document: self.to_document_for_dry_run(owner_id)?, -// data_contract: self.base.data_contract.clone(), -// metadata: None, -// entropy: Bytes32::default(), -// }) -// } -// -// pub(crate) fn replace_document(&self, document: &mut Document) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.revision = Some(self.revision); -// document.updated_at = self.updated_at; -// document.properties = properties; -// Ok(()) -// } -// -// pub(crate) fn replace_extended_document( -// &self, -// document: &mut ExtendedDocument, -// ) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.document.revision = Some(self.revision); -// document.document.updated_at = self.updated_at; -// document.document.properties = properties; -// Ok(()) -// } -// -// pub(crate) fn patch_document(self, document: &mut Document) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.revision = Some(self.revision); -// document.updated_at = self.updated_at; -// document.properties.extend(properties); -// Ok(()) -// } -// -// pub(crate) fn patch_extended_document( -// self, -// document: &mut ExtendedDocument, -// ) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.document.revision = Some(self.revision); -// document.document.updated_at = self.updated_at; -// document.document.properties.extend(properties); -// Ok(()) -// } -// } -// -// impl DocumentTransitionObjectLike for DocumentReplaceTransitionV0 { -// #[cfg(feature = "state-transition-json-conversion")] -// fn from_json_object( -// json_value: JsonValue, -// data_contract: DataContract, -// ) -> Result { -// let value: Value = json_value.into(); -// let mut map = value -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// -// let document_type = map.get_str("$type")?; -// -// let (identifiers_paths, binary_paths): (Vec<_>, Vec<_>) = -// data_contract.get_identifiers_and_binary_paths_owned(document_type)?; -// -// map.replace_at_paths(binary_paths.into_iter(), ReplacementType::BinaryBytes)?; -// -// map.replace_at_paths( -// identifiers_paths -// .into_iter() -// .chain(IDENTIFIER_FIELDS.iter().map(|a| a.to_string())), -// ReplacementType::Identifier, -// )?; -// let document = Self::from_value_map(map, data_contract)?; -// -// Ok(document) -// } -// -// fn from_object( -// raw_transition: Value, -// data_contract: DataContract, -// ) -> Result { -// let map = raw_transition -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// Self::from_value_map(map, data_contract) -// } -// -// fn from_value_map( -// mut map: BTreeMap, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// Ok(DocumentReplaceTransitionV0 { -// base: DocumentBaseTransition::from_value_map_consume(&mut map, data_contract)?, -// revision: map -// .remove_integer(property_names::REVISION) -// .map_err(ProtocolError::ValueError)?, -// updated_at: map -// .remove_optional_integer(property_names::UPDATED_AT) -// .map_err(ProtocolError::ValueError)?, -// data: Some(map), -// }) -// } -// -// fn to_object(&self) -> Result { -// Ok(self.to_value_map()?.into()) -// } -// -// fn to_value_map(&self) -> Result, ProtocolError> { -// let mut transition_base_map = self.base.to_value_map()?; -// transition_base_map.insert( -// property_names::REVISION.to_string(), -// Value::U64(self.revision), -// ); -// if let Some(updated_at) = self.updated_at { -// transition_base_map.insert( -// property_names::UPDATED_AT.to_string(), -// Value::U64(updated_at), -// ); -// } -// if let Some(properties) = self.data.clone() { -// transition_base_map.extend(properties) -// } -// Ok(transition_base_map) -// } -// -// fn to_json(&self) -> Result { -// self.to_cleaned_object()? -// .try_into() -// .map_err(ProtocolError::ValueError) -// } -// -// fn to_cleaned_object(&self) -> Result { -// Ok(self.to_value_map()?.into()) -// } -// } -// -// #[cfg(test)] -// mod test { -// use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0Methods; -// use super::*; -// -// fn init() { -// let _ = env_logger::builder() -// .filter_level(log::LevelFilter::Debug) -// .try_init(); -// } -// -// #[test] -// fn test_deserialize_serialize_to_json() { -// init(); -// let transition_json = r#"{ -// "$action": 1, -// "$dataContractId": "5wpZAEWndYcTeuwZpkmSa8s49cHXU5q2DhdibesxFSu8", -// "$id": "6oCKUeLVgjr7VZCyn1LdGbrepqKLmoabaff5WQqyTKYP", -// "$revision" : 1, -// "$type": "note", -// "message": "example_message_replace" -// }"#; -// -// let cdt: DocumentReplaceTransitionV0 = -// serde_json::from_str(transition_json).expect("no error"); -// -// assert_eq!(cdt.base.document_type_name(), "note"); -// assert_eq!(cdt.revision, 1); -// assert_eq!( -// cdt.data.as_ref().unwrap().get_str("message").unwrap(), -// "example_message_replace" -// ); -// -// let mut json_no_whitespace = transition_json.to_string(); -// json_no_whitespace.retain(|v| !v.is_whitespace()); -// -// assert_eq!(cdt.to_json().unwrap().to_string(), json_no_whitespace); -// } -// } /// document from replace transition v0 pub trait DocumentFromReplaceTransitionV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs new file mode 100644 index 00000000000..abfbf806df5 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs @@ -0,0 +1,43 @@ +use platform_value::Identifier; +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document}; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::{DocumentTransferTransition, DocumentTransferTransitionV0}; + +impl DocumentTransferTransition { + pub fn from_document( + document: Document, + document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, + recipient_owner_id: Identifier, + platform_version: &PlatformVersion, + feature_version: Option, + base_feature_version: Option, + ) -> Result { + match feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .document_transfer_state_transition + .bounds + .default_current_version, + ) { + 0 => Ok(DocumentTransferTransitionV0::from_document( + document, + document_type, + identity_contract_nonce, + recipient_owner_id, + platform_version, + base_feature_version, + )? + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentTransferTransition::from_document".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs new file mode 100644 index 00000000000..26ac77dfa4d --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs @@ -0,0 +1,19 @@ +mod from_document; +pub mod v0; +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( +feature = "state-transition-serde-conversion", +derive(Serialize, Deserialize) +)] +pub enum DocumentTransferTransition { + #[display(fmt = "V0({})", "_0")] + V0(DocumentTransferTransitionV0), +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs new file mode 100644 index 00000000000..77a4d59c6d3 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs @@ -0,0 +1,36 @@ +use platform_value::Identifier; +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document, DocumentV0Getters}; +use crate::document::errors::DocumentError; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; + +impl DocumentTransferTransitionV0 { + pub(crate) fn from_document( + document: Document, + document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, + recipient_owner_id: Identifier, + platform_version: &PlatformVersion, + base_feature_version: Option, + ) -> Result { + Ok(DocumentTransferTransitionV0 { + base: DocumentBaseTransition::from_document( + &document, + document_type, + identity_contract_nonce, + platform_version, + base_feature_version, + )?, + revision: document.revision().ok_or_else(|| { + ProtocolError::Document(Box::new(DocumentError::DocumentNoRevisionError { + document: Box::new(document.clone()), + })) + })?, + recipient_owner_id, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs new file mode 100644 index 00000000000..1a8303256d6 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs @@ -0,0 +1,44 @@ +mod from_document; +pub mod v0_methods; + +use crate::prelude::Revision; +use bincode::{Decode, Encode}; +use derive_more::Display; + +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; + +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; +use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +mod property_names { + pub const REVISION: &str = "$revision"; + + pub const RECIPIENT_OWNER_ID: &str = "recipientOwnerId"; +} + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( +feature = "state-transition-serde-conversion", +derive(Serialize, Deserialize), +serde(rename_all = "camelCase") +)] +#[display(fmt = "Base: {}, Revision: {}, Recipient: {:?}", "base", "revision", "recipient_owner_id")] +pub struct DocumentTransferTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: DocumentBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$revision") + )] + pub revision: Revision, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "recipientOwnerId") + )] + pub recipient_owner_id: Identifier, +} \ No newline at end of file diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..6e4b8331155 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs @@ -0,0 +1,66 @@ +use platform_value::Identifier; + +use crate::prelude::Revision; + +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; + +pub trait DocumentTransferTransitionV0Methods { + /// Returns a reference to the `base` field of the `DocumentReplaceTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + /// Returns a mut reference to the `base` field of the `DocumentReplaceTransitionV0`. + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentReplaceTransitionV0`. + fn set_base(&mut self, base: DocumentBaseTransition); + + /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. + fn revision(&self) -> Revision; + + /// Sets the value of the `revision` field in the `DocumentReplaceTransitionV0`. + fn set_revision(&mut self, revision: Revision); + + /// Returns the `recipient_owner_id` field of the `DocumentReplaceTransitionV0`. + fn recipient_owner_id(&self) -> Identifier; + + /// Returns a reference to the `recipient_owner_id` field of the `DocumentReplaceTransitionV0`. + fn recipient_owner_id_ref(&self) -> &Identifier; + + /// Sets the value of the `recipient_owner_id` field in the `DocumentReplaceTransitionV0`. + fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier); +} + +impl DocumentTransferTransitionV0Methods for DocumentTransferTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base; + } + + fn revision(&self) -> Revision { + self.revision + } + + fn set_revision(&mut self, revision: Revision) { + self.revision = revision; + } + + fn recipient_owner_id(&self) -> Identifier { + self.recipient_owner_id + } + + fn recipient_owner_id_ref(&self) -> &Identifier { + &self.recipient_owner_id + } + + fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier) { + self.recipient_owner_id = recipient_owner_id; + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs new file mode 100644 index 00000000000..d52099ed6b6 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs @@ -0,0 +1,55 @@ +use platform_value::Identifier; +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; + +impl DocumentTransferTransitionV0Methods for DocumentTransferTransition { + fn base(&self) -> &DocumentBaseTransition { + match self { + DocumentTransferTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + match self { + DocumentTransferTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + match self { + DocumentTransferTransition::V0(v0) => v0.base = base, + } + } + + fn revision(&self) -> Revision { + match self { + DocumentTransferTransition::V0(v0) => v0.revision, + } + } + + fn set_revision(&mut self, revision: Revision) { + match self { + DocumentTransferTransition::V0(v0) => v0.revision = revision, + } + } + + fn recipient_owner_id(&self) -> Identifier { + match self { + DocumentTransferTransition::V0(v0) => v0.recipient_owner_id + } + } + + fn recipient_owner_id_ref(&self) -> &Identifier { + match self { + DocumentTransferTransition::V0(v0) => &v0.recipient_owner_id + } + } + + fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier) { + match self { + DocumentTransferTransition::V0(v0) => v0.recipient_owner_id = recipient_owner_id, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 8eb647444d0..94ab51afd78 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -13,6 +13,7 @@ pub mod document_base_transition; pub mod document_create_transition; pub mod document_delete_transition; pub mod document_replace_transition; +pub mod document_transfer_transition; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; @@ -20,11 +21,13 @@ use derive_more::Display; pub use document_create_transition::DocumentCreateTransition; pub use document_delete_transition::DocumentDeleteTransition; pub use document_replace_transition::DocumentReplaceTransition; +pub use document_transfer_transition::DocumentTransferTransition; use platform_value::Value; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; +use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; pub const PROPERTY_ACTION: &str = "$action"; @@ -75,115 +78,10 @@ pub enum DocumentTransition { #[display(fmt = "DeleteDocumentTransition({})", "_0")] Delete(DocumentDeleteTransition), -} -// -// impl AsRef for DocumentTransition { -// fn as_ref(&self) -> &Self { -// self -// } -// } -// -// macro_rules! call_method { -// ($state_transition:expr, $method:ident, $args:tt ) => { -// match $state_transition { -// DocumentTransition::Create(st) => st.$method($args), -// DocumentTransition::Replace(st) => st.$method($args), -// DocumentTransition::Delete(st) => st.$method($args), -// } -// }; -// ($state_transition:expr, $method:ident ) => { -// match $state_transition { -// DocumentTransition::Create(st) => st.$method(), -// DocumentTransition::Replace(st) => st.$method(), -// DocumentTransition::Delete(st) => st.$method(), -// } -// }; -// } -// -// impl DocumentTransitionObjectLike for DocumentTransition { -// #[cfg(feature = "state-transition-json-conversion")] -// fn from_json_object( -// json_value: JsonValue, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let action: Action = TryFrom::try_from(json_value.get_u64(PROPERTY_ACTION)? as u8) -// .context("invalid document transition action")?; -// -// Ok(match action { -// Action::Create => DocumentTransition::Create( -// DocumentCreateTransition::from_json_object(json_value, data_contract)?, -// ), -// Action::Replace => DocumentTransition::Replace( -// DocumentReplaceTransitionV0::from_json_object(json_value, data_contract)?, -// ), -// Action::Delete => DocumentTransition::Delete( -// DocumentDeleteTransition::from_json_object(json_value, data_contract)?, -// ), -// }) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_object( -// raw_transition: Value, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let map = raw_transition -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// Self::from_value_map(map, data_contract) -// } -// -// #[cfg(feature = "state-transition-json-conversion")] -// fn to_json(&self) -> Result { -// call_method!(self, to_json) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_value_map(&self) -> Result, ProtocolError> { -// call_method!(self, to_value_map) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_object(&self) -> Result { -// call_method!(self, to_object) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_cleaned_object(&self) -> Result { -// call_method!(self, to_cleaned_object) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_value_map( -// map: BTreeMap, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let action: Action = map.get_integer::(PROPERTY_ACTION)?.try_into()?; -// Ok(match action { -// Action::Create => DocumentTransition::Create(DocumentCreateTransition::from_value_map( -// map, -// data_contract, -// )?), -// Action::Replace => DocumentTransition::Replace( -// DocumentReplaceTransitionV0::from_value_map(map, data_contract)?, -// ), -// Action::Delete => DocumentTransition::Delete(DocumentDeleteTransition::from_value_map( -// map, -// data_contract, -// )?), -// }) -// } -// } + #[display(fmt = "TransferDocumentTransition({})", "_0")] + Transfer(DocumentTransferTransition), +} impl DocumentTransition { pub fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { @@ -216,6 +114,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base(), DocumentTransition::Replace(t) => t.base(), DocumentTransition::Delete(t) => t.base(), + DocumentTransition::Transfer(t) => t.base(), } } @@ -224,6 +123,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.data().get(path), DocumentTransition::Replace(t) => t.data().get(path), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(t) => None, } } @@ -244,6 +144,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => Some(t.data()), DocumentTransition::Replace(t) => Some(t.data()), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, } } @@ -252,6 +153,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(_) => Some(1), DocumentTransition::Replace(t) => Some(t.revision()), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(t) => Some(t.revision()), } } @@ -260,6 +162,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base().identity_contract_nonce(), DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), + DocumentTransition::Transfer(t) => t.base().identity_contract_nonce(), } } @@ -277,6 +180,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { .insert(property_name, value); } DocumentTransition::Delete(_) => {} + DocumentTransition::Transfer(_) => {} } } @@ -289,6 +193,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base_mut(), DocumentTransition::Replace(t) => t.base_mut(), DocumentTransition::Delete(t) => t.base_mut(), + DocumentTransition::Transfer(t) => t.base_mut(), } } @@ -297,6 +202,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => Some(t.data_mut()), DocumentTransition::Replace(t) => Some(t.data_mut()), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, } } @@ -305,6 +211,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(_) => {} DocumentTransition::Replace(ref mut t) => t.set_revision(revision), DocumentTransition::Delete(_) => {} + DocumentTransition::Transfer(_) => {} } } @@ -313,6 +220,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Replace(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Delete(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::Transfer(t) => t.base_mut().set_identity_contract_nonce(nonce), } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs new file mode 100644 index 00000000000..376932cb421 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs @@ -0,0 +1,87 @@ +use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::state_v0::DocumentTransferTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::structure_v0::DocumentTransferTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait DocumentTransferTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentTransferTransitionActionValidation for DocumentTransferTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentTransferTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentTransferTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..2eaada0c4fd --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -0,0 +1,66 @@ +use dpp::block::epoch::Epoch; +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::platform_types::platform::PlatformStateRef; + +pub(super) trait DocumentTransferTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentTransferTransitionActionStateValidationV0 for DocumentTransferTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + + let contract = &contract_fetch_info.contract; + + let document_type_name = self.base().document_type_name(); + + let Some(document_type) = contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; + + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + + // The rest of state validation is actually happening in documents batch transition transformer + // TODO: Think more about this architecture + + platform + .drive + .validate_document_transfer_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..0a5f01295c8 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs @@ -0,0 +1,42 @@ +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::validation::DataContractValidationMethodsV0; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(super) trait DocumentTransferTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentTransferTransitionActionStructureValidationV0 for DocumentTransferTransitionAction { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + if data_contract + .document_type_optional_for_name(document_type_name) + .is_none() + { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + } + + // Validate user defined properties + + data_contract + .validate_document_properties(document_type_name, self.data().into(), platform_version) + .map_err(Error::Protocol) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs index 5689698caaf..152a7612984 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs @@ -1,3 +1,4 @@ pub(crate) mod document_create_transition_action; pub(crate) mod document_delete_transition_action; pub(crate) mod document_replace_transition_action; +pub(crate) mod document_transfer_transition_action; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 64f5d94939d..b7aa2a37669 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -18,6 +18,7 @@ use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0Getters}; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; +use dpp::prelude::Revision; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; @@ -36,7 +37,9 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchTransitionTransformerV0 @@ -89,12 +92,13 @@ trait DocumentsBatchTransitionInternalTransformerV0 { fetched_documents: &'a [Document], ) -> ConsensusValidationResult<&'a Document>; fn check_ownership_of_old_replaced_document_v0( - document_transition: &DocumentReplaceTransition, + document_id: Identifier, fetched_document: &Document, owner_id: &Identifier, ) -> SimpleConsensusValidationResult; fn check_revision_is_bumped_by_one_during_replace_v0( - document_transition: &DocumentReplaceTransition, + transition_revision: Revision, + document_id: Identifier, original_document: &Document, ) -> SimpleConsensusValidationResult; } @@ -261,15 +265,15 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )); }; - let replace_transitions = document_transitions + let replace_and_transfer_transitions = document_transitions .iter() - .filter(|transition| matches!(transition, DocumentTransition::Replace(_))) + .filter(|transition| matches!(transition, DocumentTransition::Replace(_) | DocumentTransition::Transfer(_))) .copied() .collect::>(); - // We fetch documents only for replace transitions + // We fetch documents only for replace and transfer transitions // since we need them to create transition actions - // Below we also perform state validation for replace transitions only + // Below we also perform state validation for replace and transfer transitions only // other transitions are validated in their validate_state functions // TODO: Think more about this architecture let fetched_documents_validation_result = @@ -277,7 +281,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition platform.drive, data_contract, document_type, - replace_transitions.as_slice(), + replace_and_transfer_transitions.as_slice(), transaction, platform_version, )?; @@ -377,7 +381,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition original_document.created_at_core_block_height(); let validation_result = Self::check_ownership_of_old_replaced_document_v0( - document_replace_transition, + document_replace_transition.base().id(), original_document, &owner_id, ); @@ -392,7 +396,8 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition // for example when we already applied the state transition action // and we are just validating it happened let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( - document_replace_transition, + document_replace_transition.revision(), + document_replace_transition.base().id(), original_document, ); @@ -424,6 +429,62 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition })?; Ok(DocumentTransitionAction::DeleteAction(action).into()) } + DocumentTransition::Transfer(document_transfer_transition) => { + let mut result = ConsensusValidationResult::::new(); + + let validation_result = + Self::find_replaced_document_v0(transition, replaced_documents); + + if !validation_result.is_valid_with_data() { + result.merge(validation_result); + return Ok(result); + } + + let original_document = validation_result.into_data()?; + + let validation_result = Self::check_ownership_of_old_replaced_document_v0( + document_transfer_transition.base().id(), + original_document, + &owner_id, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + + if validate_against_state { + //there are situations where we don't want to validate this against the state + // for example when we already applied the state transition action + // and we are just validating it happened + let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( + document_transfer_transition.revision(), + document_transfer_transition.base().id(), + original_document, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + } + + let document_transfer_action = + DocumentTransferTransitionAction::try_from_borrowed_document_replace_transition( + document_replace_transition, + original_document_created_at, + original_document_created_at_block_height, + original_document_created_at_core_block_height, + block_info, + |_identifier| Ok(data_contract_fetch_info.clone()), + )?; + + if result.is_valid() { + Ok(DocumentTransitionAction::TransferAction(document_transfer_transition).into()) + } else { + Ok(result) + } + } } } @@ -447,7 +508,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition } fn check_ownership_of_old_replaced_document_v0( - document_transition: &DocumentReplaceTransition, + document_id: Identifier, fetched_document: &Document, owner_id: &Identifier, ) -> SimpleConsensusValidationResult { @@ -455,7 +516,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition if fetched_document.owner_id() != owner_id { result.add_error(ConsensusError::StateError( StateError::DocumentOwnerIdMismatchError(DocumentOwnerIdMismatchError::new( - document_transition.base().id(), + document_id, owner_id.to_owned(), fetched_document.owner_id(), )), @@ -464,33 +525,32 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition result } fn check_revision_is_bumped_by_one_during_replace_v0( - document_transition: &DocumentReplaceTransition, + transition_revision: Revision, + document_id: Identifier, original_document: &Document, ) -> SimpleConsensusValidationResult { let mut result = SimpleConsensusValidationResult::default(); - let revision = document_transition.revision(); - // If there was no previous revision this means that the document_type is not update-able // However this should have been caught earlier let Some(previous_revision) = original_document.revision() else { result.add_error(ConsensusError::StateError( StateError::InvalidDocumentRevisionError(InvalidDocumentRevisionError::new( - document_transition.base().id(), + document_id, None, - revision, + transition_revision, )), )); return result; }; // no need to check bounds here, because it would be impossible to hit the end on a u64 let expected_revision = previous_revision + 1; - if revision != expected_revision { + if transition_revision != expected_revision { result.add_error(ConsensusError::StateError( StateError::InvalidDocumentRevisionError(InvalidDocumentRevisionError::new( - document_transition.base().id(), + document_id, Some(previous_revision), - revision, + transition_revision, )), )) } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs similarity index 100% rename from packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs rename to packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs new file mode 100644 index 00000000000..95b80c25e62 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs @@ -0,0 +1,51 @@ +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::flags::StorageFlags; +use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::error::Error; +use dpp::block::epoch::Epoch; + +use dpp::document::DocumentV0Getters; +use dpp::prelude::Identifier; +use std::borrow::Cow; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentFromTransferTransitionAction, DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionAction { + fn into_high_level_document_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let document = self.document_owned(); + + // we are transferring the document so the new storage flags should be on the new owner + + let new_document_owner_id = document.owner_id(); + + let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(new_document_owner_id.to_buffer())); + + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(new_document_owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + ]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs index 6e865020e1a..54ad2b9868b 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs @@ -7,8 +7,9 @@ use dpp::version::PlatformVersion; mod document_create_transition; mod document_delete_transition; mod document_transition; -mod document_update_transition; +mod document_replace_transition; mod documents_batch_transition; +mod document_transfer_transition; /// A converter that will get High Level Drive Operations from State transitions pub trait DriveHighLevelDocumentOperationConverter { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs index 5f9ac7d1c48..a868fd2c8fc 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs @@ -14,7 +14,7 @@ pub use v0::*; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; -/// tranformer +/// transformer pub mod transformer; /// action diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs new file mode 100644 index 00000000000..24d8b4be418 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs @@ -0,0 +1,89 @@ +mod v0; + +use std::collections::BTreeMap; + +use derive_more::From; + +use dpp::document::Document; +use dpp::identity::TimestampMillis; +use dpp::platform_value::{Identifier, Value}; +use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; +use dpp::ProtocolError; +pub use v0::*; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use dpp::version::PlatformVersion; + +/// transformer +pub mod transformer; + +/// action +#[derive(Debug, Clone, From)] +pub enum DocumentTransferTransitionAction { + /// v0 + V0(DocumentTransferTransitionActionV0), +} + +impl DocumentTransferTransitionActionAccessorsV0 for DocumentTransferTransitionAction { + fn base(&self) -> &DocumentBaseTransitionAction { + match self { + DocumentTransferTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> DocumentBaseTransitionAction { + match self { + DocumentTransferTransitionAction::V0(v0) => v0.base, + } + } + + fn document(&self) -> &Document { + match self { + DocumentTransferTransitionAction::V0(v0) => &v0.document, + } + } + + fn document_owned(self) -> Document { + match self { + DocumentTransferTransitionAction::V0(v0) => v0.document, + } + } +} + +/// document from transfer transition +pub trait DocumentFromTransferTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentTransferTransitionAction` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentTransferTransitionAction` containing information about the document being transferd. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_transfer_transition_action( + document_transfer_transition_action: &DocumentTransferTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentTransferTransitionAction` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentTransferTransitionAction` instance containing information about the document being transferd. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_transfer_transition_action( + document_transfer_transition_action: DocumentTransferTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} \ No newline at end of file diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs new file mode 100644 index 00000000000..65af87ea3d9 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs @@ -0,0 +1,36 @@ +use dpp::block::block_info::BlockInfo; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::identity::TimestampMillis; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionV0}; + +impl DocumentTransferTransitionAction { + /// try from borrowed + pub fn try_from_borrowed_document_transfer_transition( + document_transfer_transition: &DocumentTransferTransition, + originally_created_at: Option, + originally_created_at_block_height: Option, + originally_created_at_core_block_height: Option, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + match document_transfer_transition { + DocumentTransferTransition::V0(v0) => Ok( + DocumentTransferTransitionActionV0::try_from_borrowed_document_transfer_transition( + v0, + originally_created_at, + originally_created_at_block_height, + originally_created_at_core_block_height, + block_info, + get_data_contract, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs new file mode 100644 index 00000000000..b30bde826d2 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs @@ -0,0 +1,33 @@ +pub mod transformer; + +use dpp::document::{Document, DocumentV0}; +use dpp::identity::TimestampMillis; +use dpp::platform_value::{Identifier, Value}; +use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; +use dpp::ProtocolError; + +use std::collections::BTreeMap; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; + +/// document transfer transition action v0 +#[derive(Debug, Clone)] +pub struct DocumentTransferTransitionActionV0 { + /// Document Base Transition + pub base: DocumentBaseTransitionAction, + /// The new document to be inserted + pub document: Document, +} + +/// document transfer transition action accessors v0 +pub trait DocumentTransferTransitionActionAccessorsV0 { + /// base + fn base(&self) -> &DocumentBaseTransitionAction; + /// base owned + fn base_owned(self) -> DocumentBaseTransitionAction; + /// created at + fn document(&self) -> &Document; + fn document_owned(self) -> Document; +} \ No newline at end of file diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..b6e9cc1a012 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -0,0 +1,52 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::{Document, DocumentV0Setters, property_names}; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::v0::DocumentTransferTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; + +impl DocumentTransferTransitionActionV0 { + /// try from borrowed + pub fn try_from_borrowed_document_transfer_transition( + document_transfer_transition: &DocumentTransferTransitionV0, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + let DocumentTransferTransitionV0 { + base, + recipient_owner_id, + .. + } = document_transfer_transition; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base, + get_data_contract, + )?; + + let mut modified_document = original_document; + + modified_document.set_owner_id(*recipient_owner_id); + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { + modified_document.set_updated_at(Some(block_info.time_ms)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { + modified_document.set_updated_at_block_height(Some(block_info.height)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { + modified_document.set_updated_at_core_block_height(Some(block_info.core_height)); + } + + Ok(DocumentTransferTransitionActionV0 { + base, + document: modified_document, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index a6fabb8d4ed..d5df86cb324 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -7,6 +7,8 @@ pub mod document_create_transition_action; pub mod document_delete_transition_action; /// document_replace_transition_action pub mod document_replace_transition_action; +/// document_transfer_transition_action +pub mod document_transfer_transition_action; pub use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; @@ -17,6 +19,7 @@ use crate::state_transition_action::document::documents_batch::document_transiti use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; /// version @@ -31,6 +34,8 @@ pub enum DocumentTransitionAction { ReplaceAction(DocumentReplaceTransitionAction), /// delete DeleteAction(DocumentDeleteTransitionAction), + /// transfer + TransferAction(DocumentTransferTransitionAction), /// bump identity data contract nonce BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), } @@ -42,6 +47,7 @@ impl DocumentTransitionAction { DocumentTransitionAction::CreateAction(d) => Some(d.base()), DocumentTransitionAction::DeleteAction(d) => Some(d.base()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), + DocumentTransitionAction::TransferAction(d) => Some(d.base()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } @@ -52,6 +58,7 @@ impl DocumentTransitionAction { DocumentTransitionAction::CreateAction(d) => Some(d.base_owned()), DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), + DocumentTransitionAction::TransferAction(d) => Some(d.base_owned()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 4cc28cf36ca..5ad6d411ba6 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -126,6 +126,7 @@ pub struct StateTransitionSerializationVersions { pub document_create_state_transition: DocumentFeatureVersionBounds, pub document_replace_state_transition: DocumentFeatureVersionBounds, pub document_delete_state_transition: DocumentFeatureVersionBounds, + pub document_transfer_state_transition: DocumentFeatureVersionBounds, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 525fab27838..85f045288eb 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -109,9 +109,11 @@ pub struct DriveAbciDocumentsStateTransitionValidationVersions { pub document_create_transition_structure_validation: FeatureVersion, pub document_delete_transition_structure_validation: FeatureVersion, pub document_replace_transition_structure_validation: FeatureVersion, + pub document_transfer_transition_structure_validation: FeatureVersion, pub document_create_transition_state_validation: FeatureVersion, pub document_delete_transition_state_validation: FeatureVersion, pub document_replace_transition_state_validation: FeatureVersion, + pub document_transfer_transition_state_validation: FeatureVersion, } #[derive(Clone, Debug, Default)] From 0b4ab9c756e12fcdb6ad473682bdca9e2d3338be Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 19 Apr 2024 18:06:22 +0700 Subject: [PATCH 02/65] more work --- .../create_document_from_data/v0/mod.rs | 43 ++++- .../v0/mod.rs | 61 +++++-- .../src/data_contract/document_type/mod.rs | 1 + .../document_type/v0/random_document.rs | 9 +- packages/rs-dpp/src/document/accessors/mod.rs | 10 +- .../rs-dpp/src/document/accessors/v0/mod.rs | 6 +- packages/rs-dpp/src/document/v0/accessors.rs | 33 +++- packages/rs-dpp/src/document/v0/mod.rs | 12 +- packages/rs-dpp/src/document/v0/serialize.rs | 158 ++++++++++++++++-- .../document_transition/action_type.rs | 3 + .../document_create_transition/v0/mod.rs | 6 + .../document_replace_transition/mod.rs | 18 ++ .../document_replace_transition/v0/mod.rs | 18 ++ .../document_transfer_transition/mod.rs | 4 +- .../document_transfer_transition/v0/mod.rs | 26 +-- .../v0_methods.rs | 4 +- packages/rs-dpp/src/tests/json_document.rs | 4 + .../documents_batch/transformer/v0/mod.rs | 14 +- .../document/document_transfer_transition.rs | 11 +- .../drive/batch/transitions/document/mod.rs | 4 +- .../v0/mod.rs | 32 ++++ .../v0/mod.rs | 6 + .../transformer.rs | 6 + .../v0/mod.rs | 18 ++ .../v0/transformer.rs | 6 + .../mod.rs | 10 +- .../transformer.rs | 11 +- .../v0/mod.rs | 14 +- .../v0/transformer.rs | 12 +- .../v0/transformer.rs | 3 + .../src/version/mocks/v2_test.rs | 9 + .../src/version/mocks/v3_test.rs | 9 + .../rs-platform-version/src/version/v1.rs | 9 + 33 files changed, 483 insertions(+), 107 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index 447d9c88066..49b9e58f028 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -1,9 +1,9 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ - CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, - UPDATED_AT_CORE_BLOCK_HEIGHT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::{Document, DocumentV0, INITIAL_REVISION}; use crate::identity::TimestampMillis; @@ -47,6 +47,10 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at: Option = data + .get_optional_integer(TRANSFERRED_AT) + .map_err(ProtocolError::ValueError)?; + let mut created_at_block_height: Option = data .get_optional_integer(CREATED_AT_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; @@ -55,6 +59,10 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at_block_height: Option = data + .get_optional_integer(TRANSFERRED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let mut created_at_core_block_height: Option = data .get_optional_integer(CREATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; @@ -63,13 +71,20 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at_core_block_height: Option = data + .get_optional_integer(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let is_created_at_required = self.required_fields().contains(CREATED_AT); let is_updated_at_required = self.required_fields().contains(UPDATED_AT); + let is_transferred_at_required = self.required_fields().contains(TRANSFERRED_AT); let is_created_at_block_height_required = self.required_fields().contains(CREATED_AT_BLOCK_HEIGHT); let is_updated_at_block_height_required = self.required_fields().contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + self.required_fields().contains(TRANSFERRED_AT_BLOCK_HEIGHT); let is_created_at_core_block_height_required = self .required_fields() @@ -77,9 +92,13 @@ impl DocumentTypeV0 { let is_updated_at_core_block_height_required = self .required_fields() .contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = self + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); if (is_created_at_required && created_at.is_none()) - || (is_updated_at_required && updated_at.is_none()) + || (is_updated_at_required && updated_at.is_none() + || (is_transferred_at_required && transferred_at.is_none())) { //we want only one call to get current time let now = Utc::now().timestamp_millis() as TimestampMillis; @@ -91,6 +110,10 @@ impl DocumentTypeV0 { if is_updated_at_required { updated_at = updated_at.or(Some(now)); }; + + if is_transferred_at_required { + transferred_at = transferred_at.or(Some(now)); + }; }; if is_created_at_block_height_required { @@ -101,6 +124,10 @@ impl DocumentTypeV0 { updated_at_block_height = updated_at_block_height.or(Some(block_height)); }; + if is_transferred_at_block_height_required { + transferred_at_block_height = transferred_at_block_height.or(Some(block_height)); + }; + if is_created_at_core_block_height_required { created_at_core_block_height = created_at_core_block_height.or(Some(core_block_height)); }; @@ -109,6 +136,11 @@ impl DocumentTypeV0 { updated_at_core_block_height = updated_at_core_block_height.or(Some(core_block_height)); }; + if is_transferred_at_core_block_height_required { + transferred_at_core_block_height = + transferred_at_core_block_height.or(Some(core_block_height)); + }; + match platform_version .dpp .document_versions @@ -124,10 +156,13 @@ impl DocumentTypeV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }; document diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs index d9286ff6c11..3eda04234f7 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs @@ -1,6 +1,5 @@ -use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::document::{Document, DocumentV0}; -use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; +use crate::prelude::{BlockHeight, CoreBlockHeight}; use crate::ProtocolError; use chrono::Utc; use platform_value::Value; @@ -8,7 +7,8 @@ use platform_value::Value; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ - CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, + CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::INITIAL_REVISION; @@ -30,12 +30,16 @@ impl DocumentTypeV0 { platform_version: &PlatformVersion, ) -> Result { // Set timestamps if they are required and not exist - let mut created_at: Option = properties - .get_optional_integer(CREATED_AT) + let mut created_at: Option = properties + .get_optional_integer(crate::document::property_names::CREATED_AT) .map_err(ProtocolError::ValueError)?; - let mut updated_at: Option = properties - .get_optional_integer(UPDATED_AT) + let mut updated_at: Option = properties + .get_optional_integer(crate::document::property_names::UPDATED_AT) + .map_err(ProtocolError::ValueError)?; + + let mut transferred_at: Option = properties + .get_optional_integer(TRANSFERRED_AT) .map_err(ProtocolError::ValueError)?; let mut created_at_block_height: Option = properties @@ -46,6 +50,10 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at_block_height: Option = properties + .get_optional_integer(TRANSFERRED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let mut created_at_core_block_height: Option = properties .get_optional_integer(CREATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; @@ -54,13 +62,24 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; - let is_created_at_required = self.required_fields().contains(CREATED_AT); - let is_updated_at_required = self.required_fields().contains(UPDATED_AT); + let mut transferred_at_core_block_height: Option = properties + .get_optional_integer(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let is_created_at_required = self + .required_fields() + .contains(crate::document::property_names::CREATED_AT); + let is_updated_at_required = self + .required_fields() + .contains(crate::document::property_names::UPDATED_AT); + let is_transferred_at_required = self.required_fields().contains(TRANSFERRED_AT); let is_created_at_block_height_required = self.required_fields().contains(CREATED_AT_BLOCK_HEIGHT); let is_updated_at_block_height_required = self.required_fields().contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + self.required_fields().contains(TRANSFERRED_AT_BLOCK_HEIGHT); let is_created_at_core_block_height_required = self .required_fields() @@ -68,12 +87,16 @@ impl DocumentTypeV0 { let is_updated_at_core_block_height_required = self .required_fields() .contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = self + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); if (is_created_at_required && created_at.is_none()) - || (is_updated_at_required && updated_at.is_none()) + || (is_updated_at_required && updated_at.is_none() + || (is_transferred_at_required && transferred_at.is_none())) { //we want only one call to get current time - let now = Utc::now().timestamp_millis() as TimestampMillis; + let now = Utc::now().timestamp_millis() as crate::identity::TimestampMillis; if is_created_at_required { created_at = created_at.or(Some(now)); @@ -82,6 +105,10 @@ impl DocumentTypeV0 { if is_updated_at_required { updated_at = updated_at.or(Some(now)); }; + + if is_transferred_at_required { + transferred_at = transferred_at.or(Some(now)); + }; }; if is_created_at_block_height_required { @@ -92,6 +119,10 @@ impl DocumentTypeV0 { updated_at_block_height = updated_at_block_height.or(Some(block_height)); }; + if is_transferred_at_block_height_required { + transferred_at_block_height = transferred_at_block_height.or(Some(block_height)); + }; + if is_created_at_core_block_height_required { created_at_core_block_height = created_at_core_block_height.or(Some(core_block_height)); }; @@ -100,6 +131,11 @@ impl DocumentTypeV0 { updated_at_core_block_height = updated_at_core_block_height.or(Some(core_block_height)); }; + if is_transferred_at_core_block_height_required { + transferred_at_core_block_height = + transferred_at_core_block_height.or(Some(core_block_height)); + }; + let revision = if self.documents_mutable { Some(INITIAL_REVISION) } else { @@ -118,10 +154,13 @@ impl DocumentTypeV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index 8822ad75c01..eed70afb856 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -39,6 +39,7 @@ mod property_names { pub const REF: &str = "$ref"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const TRANSFERRED_AT: &str = "$transferredAt"; pub const MIN_ITEMS: &str = "minItems"; pub const MAX_ITEMS: &str = "maxItems"; pub const MIN_LENGTH: &str = "minLength"; diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 68964bd4642..93eb33ad517 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -4,7 +4,6 @@ //! create various types of random documents. //! -use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::data_contract::document_type::random_document::{ CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; @@ -12,8 +11,9 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use std::time::{SystemTime, UNIX_EPOCH}; use crate::document::property_names::{ - CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, - UPDATED_AT_CORE_BLOCK_HEIGHT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::{Document, DocumentV0}; use crate::identity::accessors::IdentityGettersV0; @@ -247,10 +247,13 @@ impl CreateRandomDocument for DocumentTypeV0 { revision, created_at, updated_at, + transferred_at: None, created_at_block_height, updated_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index 1ae7acb658b..ce005efd62d 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -173,7 +173,6 @@ impl DocumentV0Setters for Document { } } - fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option) { match self { Document::V0(v0) => v0.created_at_core_block_height = created_at_core_block_height, @@ -186,9 +185,14 @@ impl DocumentV0Setters for Document { } } - fn set_transferred_at_core_block_height(&mut self, transferred_at_core_block_height: Option) { + fn set_transferred_at_core_block_height( + &mut self, + transferred_at_core_block_height: Option, + ) { match self { - Document::V0(v0) => v0.transferred_at_core_block_height = transferred_at_core_block_height, + Document::V0(v0) => { + v0.transferred_at_core_block_height = transferred_at_core_block_height + } } } } diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index d9edf9d64f1..7717ee02f5e 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -3,7 +3,6 @@ use platform_value::btreemap_extensions::{ }; use platform_value::Value; use std::collections::BTreeMap; -use crate::document::Document; use crate::identity::TimestampMillis; use crate::prelude::Identifier; @@ -137,7 +136,10 @@ pub trait DocumentV0Setters: DocumentV0Getters { fn set_updated_at_block_height(&mut self, updated_at_block_height: Option); fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option); fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option); - fn set_transferred_at_core_block_height(&mut self, transferred_at_core_block_height: Option); + fn set_transferred_at_core_block_height( + &mut self, + transferred_at_core_block_height: Option, + ); fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option); fn set_transferred_at(&mut self, transferred_at: Option); } diff --git a/packages/rs-dpp/src/document/v0/accessors.rs b/packages/rs-dpp/src/document/v0/accessors.rs index 88836b725cb..4a14bea18a5 100644 --- a/packages/rs-dpp/src/document/v0/accessors.rs +++ b/packages/rs-dpp/src/document/v0/accessors.rs @@ -65,6 +65,15 @@ impl DocumentV0Getters for DocumentV0 { self.updated_at } + /// Returns the timestamp of the last time the document was transferred, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the transferred at time in milliseconds, or `None` if not available. + fn transferred_at(&self) -> Option { + self.transferred_at + } + /// Provides a reference to the document's unique identifier. /// /// # Returns @@ -107,6 +116,15 @@ impl DocumentV0Getters for DocumentV0 { self.updated_at_block_height } + /// Returns the block height of the last time the document was transferred, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the transfer block height, or `None` if not available. + fn transferred_at_block_height(&self) -> Option { + self.transferred_at_block_height + } + /// Returns the core network block height at which the document was created, if it is part /// of the document. The document will have this field if it's schema has it set as required. /// @@ -124,6 +142,15 @@ impl DocumentV0Getters for DocumentV0 { fn updated_at_core_block_height(&self) -> Option { self.updated_at_core_block_height } + + /// Returns the core network block height of the last time the document was transferred, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the transfer core block height, or `None` if not available. + fn transferred_at_core_block_height(&self) -> Option { + self.transferred_at_core_block_height + } } impl DocumentV0Setters for DocumentV0 { @@ -229,8 +256,10 @@ impl DocumentV0Setters for DocumentV0 { self.updated_at_core_block_height = updated_at_core_block_height; } - fn set_transferred_at_core_block_height(&mut self, transferred_at_core_block_height: Option) { + fn set_transferred_at_core_block_height( + &mut self, + transferred_at_core_block_height: Option, + ) { self.transferred_at_core_block_height = transferred_at_core_block_height; } - } diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index 68aab663b38..c68c01a42ac 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -62,8 +62,8 @@ pub struct DocumentV0 { pub updated_at: Option, /// The time in milliseconds that the document was last transferred, if it is set as required by the document type schema. #[cfg_attr( - feature = "document-serde-conversion", - serde(rename = "$transferredAt", default) + feature = "document-serde-conversion", + serde(rename = "$transferredAt", default) )] pub transferred_at: Option, /// The block that the document was created, if it is set as required by the document type schema. @@ -80,8 +80,8 @@ pub struct DocumentV0 { pub updated_at_block_height: Option, /// The block that the document was last transferred to a new identity, if it is set as required by the document type schema. #[cfg_attr( - feature = "document-serde-conversion", - serde(rename = "$transferredAtBlockHeight", default) + feature = "document-serde-conversion", + serde(rename = "$transferredAtBlockHeight", default) )] pub transferred_at_block_height: Option, /// The core block that the document was created, if it is set as required by the document type schema. @@ -98,8 +98,8 @@ pub struct DocumentV0 { pub updated_at_core_block_height: Option, /// The core block that the document was last transferred to a new identity, if it is set as required by the document type schema. #[cfg_attr( - feature = "document-serde-conversion", - serde(rename = "$transferredAtCoreBlockHeight", default) + feature = "document-serde-conversion", + serde(rename = "$transferredAtCoreBlockHeight", default) )] pub transferred_at_core_block_height: Option, } diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index b13ec9e46fe..259258fa4d4 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -2,7 +2,8 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::errors::DataContractError; use crate::document::property_names::{ - CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; @@ -56,7 +57,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend((1 as Revision).encode_var_vec()) } - let mut bitwise_exists_flag: u8 = 0; + let mut bitwise_exists_flag: u16 = 0; let mut time_fields_data_buffer = vec![]; @@ -86,9 +87,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAt + if let Some(transferred_at) = &self.transferred_at { + bitwise_exists_flag |= 4; + // dbg!("we pushed transferred at {}", hex::encode(transferred_at.to_be_bytes())); + time_fields_data_buffer.extend(transferred_at.to_be_bytes()); + } else if document_type.required_fields().contains(TRANSFERRED_AT) { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred at field is not present".to_string(), + ), + )); + } + // $createdAtBlockHeight if let Some(created_at_block_height) = &self.created_at_block_height { - bitwise_exists_flag |= 4; + bitwise_exists_flag |= 8; time_fields_data_buffer.extend(created_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -103,7 +117,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtBlockHeight if let Some(updated_at_block_height) = &self.updated_at_block_height { - bitwise_exists_flag |= 8; + bitwise_exists_flag |= 16; time_fields_data_buffer.extend(updated_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -116,9 +130,24 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAtBlockHeight + if let Some(transferred_at_block_height) = &self.transferred_at_block_height { + bitwise_exists_flag |= 32; + time_fields_data_buffer.extend(transferred_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_block_height field is not present".to_string(), + ), + )); + } + // $createdAtCoreBlockHeight if let Some(created_at_core_block_height) = &self.created_at_core_block_height { - bitwise_exists_flag |= 16; + bitwise_exists_flag |= 64; time_fields_data_buffer.extend(created_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -133,7 +162,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtCoreBlockHeight if let Some(updated_at_core_block_height) = &self.updated_at_core_block_height { - bitwise_exists_flag |= 32; + bitwise_exists_flag |= 128; time_fields_data_buffer.extend(updated_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -146,7 +175,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } - buffer.push(bitwise_exists_flag); + // $transferredAtCoreBlockHeight + if let Some(transferred_at_core_block_height) = &self.transferred_at_core_block_height { + bitwise_exists_flag |= 256; + time_fields_data_buffer.extend(transferred_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_core_block_height field is not present".to_string(), + ), + )); + } + + buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); // User defined properties @@ -217,7 +261,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { if let Some(revision) = self.revision { buffer.extend(revision.to_be_bytes()) } - let mut bitwise_exists_flag: u8 = 0; + let mut bitwise_exists_flag: u16 = 0; let mut time_fields_data_buffer = vec![]; @@ -247,9 +291,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAt + if let Some(transferred_at) = &self.transferred_at { + bitwise_exists_flag |= 4; + // dbg!("we pushed transferred at {}", hex::encode(transferred_at.to_be_bytes())); + time_fields_data_buffer.extend(transferred_at.to_be_bytes()); + } else if document_type.required_fields().contains(TRANSFERRED_AT) { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred at field is not present".to_string(), + ), + )); + } + // $createdAtBlockHeight if let Some(created_at_block_height) = &self.created_at_block_height { - bitwise_exists_flag |= 4; + bitwise_exists_flag |= 8; time_fields_data_buffer.extend(created_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -264,7 +321,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtBlockHeight if let Some(updated_at_block_height) = &self.updated_at_block_height { - bitwise_exists_flag |= 8; + bitwise_exists_flag |= 16; time_fields_data_buffer.extend(updated_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -277,9 +334,24 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAtBlockHeight + if let Some(transferred_at_block_height) = &self.transferred_at_block_height { + bitwise_exists_flag |= 32; + time_fields_data_buffer.extend(transferred_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_block_height field is not present".to_string(), + ), + )); + } + // $createdAtCoreBlockHeight if let Some(created_at_core_block_height) = &self.created_at_core_block_height { - bitwise_exists_flag |= 16; + bitwise_exists_flag |= 64; time_fields_data_buffer.extend(created_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -294,7 +366,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtCoreBlockHeight if let Some(updated_at_core_block_height) = &self.updated_at_core_block_height { - bitwise_exists_flag |= 32; + bitwise_exists_flag |= 128; time_fields_data_buffer.extend(updated_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -307,7 +379,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } - buffer.push(bitwise_exists_flag); + // $transferredAtCoreBlockHeight + if let Some(transferred_at_core_block_height) = &self.transferred_at_core_block_height { + bitwise_exists_flag |= 256; + time_fields_data_buffer.extend(transferred_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_core_block_height field is not present".to_string(), + ), + )); + } + + buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); // User defined properties @@ -404,7 +491,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let timestamp_flags = buf.read_u8().map_err(|_| { + let timestamp_flags = buf.read_u16::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading timestamp flags from serialized document".to_string(), ) @@ -430,7 +517,17 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let created_at_block_height = if timestamp_flags & 4 > 0 { + let transferred_at = if timestamp_flags & 4 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading transferred_at timestamp from serialized document".to_string(), + ) + })?) + } else { + None + }; + + let created_at_block_height = if timestamp_flags & 8 > 0 { Some(buf.read_u64::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading created_at_block_height from serialized document".to_string(), @@ -440,7 +537,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let updated_at_block_height = if timestamp_flags & 8 > 0 { + let updated_at_block_height = if timestamp_flags & 16 > 0 { Some(buf.read_u64::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading updated_at_block_height from serialized document".to_string(), @@ -450,7 +547,18 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let created_at_core_block_height = if timestamp_flags & 16 > 0 { + let transferred_at_block_height = if timestamp_flags & 32 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading transferred_at_block_height from serialized document" + .to_string(), + ) + })?) + } else { + None + }; + + let created_at_core_block_height = if timestamp_flags & 64 > 0 { Some(buf.read_u32::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading created_at_core_block_height from serialized document" @@ -461,7 +569,18 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let updated_at_core_block_height = if timestamp_flags & 32 > 0 { + let updated_at_core_block_height = if timestamp_flags & 128 > 0 { + Some(buf.read_u32::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading updated_at_core_block_height from serialized document" + .to_string(), + ) + })?) + } else { + None + }; + + let transferred_at_core_block_height = if timestamp_flags & 256 > 0 { Some(buf.read_u32::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading updated_at_core_block_height from serialized document" @@ -508,10 +627,13 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }) } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs index c07846f37b0..9052109dca2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs @@ -7,6 +7,7 @@ pub enum DocumentTransitionActionType { Create, //the entropy used Replace, Delete, + Transfer, IgnoreWhileBumpingRevision, } @@ -20,6 +21,7 @@ impl TransitionActionTypeGetter for DocumentTransition { DocumentTransition::Create(_) => DocumentTransitionActionType::Create, DocumentTransition::Delete(_) => DocumentTransitionActionType::Delete, DocumentTransition::Replace(_) => DocumentTransitionActionType::Replace, + DocumentTransition::Transfer(_) => DocumentTransitionActionType::Transfer, } } } @@ -32,6 +34,7 @@ impl TryFrom<&str> for DocumentTransitionActionType { "create" => Ok(DocumentTransitionActionType::Create), "replace" => Ok(DocumentTransitionActionType::Replace), "delete" => Ok(DocumentTransitionActionType::Delete), + "transfer" => Ok(DocumentTransitionActionType::Transfer), action_type => Err(ProtocolError::Generic(format!( "unknown action type {action_type}" ))), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 52cc32c665a..63e03389fa7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -290,10 +290,13 @@ impl DocumentFromCreateTransitionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at, + transferred_at: None, created_at_block_height, updated_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -388,10 +391,13 @@ impl DocumentFromCreateTransitionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at, + transferred_at: None, created_at_block_height, updated_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index ddfebec72a7..8e805318b5e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -55,6 +55,9 @@ pub trait DocumentFromReplaceTransition { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -90,6 +93,9 @@ pub trait DocumentFromReplaceTransition { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -105,6 +111,9 @@ impl DocumentFromReplaceTransition for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -116,6 +125,9 @@ impl DocumentFromReplaceTransition for Document { created_at, created_at_block_height, created_at_core_block_height, + transferred_at, + transferred_at_block_height, + transferred_at_core_block_height, block_info, document_type, platform_version, @@ -129,6 +141,9 @@ impl DocumentFromReplaceTransition for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -140,6 +155,9 @@ impl DocumentFromReplaceTransition for Document { created_at, created_at_block_height, created_at_core_block_height, + transferred_at, + transferred_at_block_height, + transferred_at_core_block_height, block_info, document_type, platform_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 8e57b364e4f..2c7f96e8e4c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -72,6 +72,9 @@ pub trait DocumentFromReplaceTransitionV0 { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -104,6 +107,9 @@ pub trait DocumentFromReplaceTransitionV0 { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -119,6 +125,9 @@ impl DocumentFromReplaceTransitionV0 for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -173,10 +182,13 @@ impl DocumentFromReplaceTransitionV0 for Document { revision: Some(*revision), created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -193,6 +205,9 @@ impl DocumentFromReplaceTransitionV0 for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -246,10 +261,13 @@ impl DocumentFromReplaceTransitionV0 for Document { revision: Some(revision), created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs index 26ac77dfa4d..e2185f76b08 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs @@ -10,8 +10,8 @@ pub use v0::*; #[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] #[cfg_attr( -feature = "state-transition-serde-conversion", -derive(Serialize, Deserialize) + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) )] pub enum DocumentTransferTransition { #[display(fmt = "V0({})", "_0")] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs index 1a8303256d6..c51f80cdb7b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs @@ -9,10 +9,7 @@ use platform_value::Identifier; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; -use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; - pub use super::super::document_base_transition::IDENTIFIER_FIELDS; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; mod property_names { @@ -23,22 +20,27 @@ mod property_names { #[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] #[cfg_attr( -feature = "state-transition-serde-conversion", -derive(Serialize, Deserialize), -serde(rename_all = "camelCase") + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display( + fmt = "Base: {}, Revision: {}, Recipient: {:?}", + "base", + "revision", + "recipient_owner_id" )] -#[display(fmt = "Base: {}, Revision: {}, Recipient: {:?}", "base", "revision", "recipient_owner_id")] pub struct DocumentTransferTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "$revision") + feature = "state-transition-serde-conversion", + serde(rename = "$revision") )] pub revision: Revision, #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "recipientOwnerId") + feature = "state-transition-serde-conversion", + serde(rename = "recipientOwnerId") )] pub recipient_owner_id: Identifier, -} \ No newline at end of file +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs index d52099ed6b6..adeff540c05 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs @@ -37,13 +37,13 @@ impl DocumentTransferTransitionV0Methods for DocumentTransferTransition { fn recipient_owner_id(&self) -> Identifier { match self { - DocumentTransferTransition::V0(v0) => v0.recipient_owner_id + DocumentTransferTransition::V0(v0) => v0.recipient_owner_id, } } fn recipient_owner_id_ref(&self) -> &Identifier { match self { - DocumentTransferTransition::V0(v0) => &v0.recipient_owner_id + DocumentTransferTransition::V0(v0) => &v0.recipient_owner_id, } } diff --git a/packages/rs-dpp/src/tests/json_document.rs b/packages/rs-dpp/src/tests/json_document.rs index 75addad411d..3f6fb11a304 100644 --- a/packages/rs-dpp/src/tests/json_document.rs +++ b/packages/rs-dpp/src/tests/json_document.rs @@ -140,10 +140,14 @@ pub fn json_document_to_document( revision: data.remove_optional_integer("$revision")?, created_at: data.remove_optional_integer("$createdAt")?, updated_at: data.remove_optional_integer("$updatedAt")?, + transferred_at: data.remove_optional_integer("$transferredAt")?, created_at_block_height: data.remove_optional_integer("$createdAtBlockHeight")?, updated_at_block_height: data.remove_optional_integer("$updatedAtBlockHeight")?, + transferred_at_block_height: data.remove_optional_integer("$transferredAtBlockHeight")?, created_at_core_block_height: data.remove_optional_integer("$createdAtCoreBlockHeight")?, updated_at_core_block_height: data.remove_optional_integer("$updatedAtCoreBlockHeight")?, + transferred_at_core_block_height: data + .remove_optional_integer("$transferredAtCoreBlockHeight")?, }; data.replace_at_paths( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index b7aa2a37669..593995b0da4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -16,9 +16,9 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0Getters}; +use dpp::prelude::Revision; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; -use dpp::prelude::Revision; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; @@ -267,7 +267,12 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let replace_and_transfer_transitions = document_transitions .iter() - .filter(|transition| matches!(transition, DocumentTransition::Replace(_) | DocumentTransition::Transfer(_))) + .filter(|transition| { + matches!( + transition, + DocumentTransition::Replace(_) | DocumentTransition::Transfer(_) + ) + }) .copied() .collect::>(); @@ -480,7 +485,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )?; if result.is_valid() { - Ok(DocumentTransitionAction::TransferAction(document_transfer_transition).into()) + Ok( + DocumentTransitionAction::TransferAction(document_transfer_transition) + .into(), + ) } else { Ok(result) } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs index 95b80c25e62..e16715f4db0 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs @@ -11,7 +11,7 @@ use dpp::document::DocumentV0Getters; use dpp::prelude::Identifier; use std::borrow::Cow; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentFromTransferTransitionAction, DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionAction { @@ -25,13 +25,14 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionActi let document_type_name = self.base().document_type_name().clone(); let identity_contract_nonce = self.base().identity_contract_nonce(); let document = self.document_owned(); - + // we are transferring the document so the new storage flags should be on the new owner - + let new_document_owner_id = document.owner_id(); - let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(new_document_owner_id.to_buffer())); - + let storage_flags = + StorageFlags::new_single_epoch(epoch.index, Some(new_document_owner_id.to_buffer())); + Ok(vec![ IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { identity_id: owner_id.into_buffer(), diff --git a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs index 54ad2b9868b..b7df757580c 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs @@ -6,10 +6,10 @@ use dpp::version::PlatformVersion; mod document_create_transition; mod document_delete_transition; -mod document_transition; mod document_replace_transition; -mod documents_batch_transition; mod document_transfer_transition; +mod document_transition; +mod documents_batch_transition; /// A converter that will get High Level Drive Operations from State transitions pub trait DriveHighLevelDocumentOperationConverter { diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index f0eb680a005..9c0e4202b8a 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -24,6 +24,7 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_replace_transition::DocumentFromReplaceTransition; use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedPartialIdentity}; use platform_version::TryIntoPlatformVersioned; @@ -152,6 +153,9 @@ impl Drive { document.created_at(), //we can trust the created at (as we don't care) document.created_at_block_height(), //we can trust the created at block height (as we don't care) document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + document.created_at(), //we can trust the created at (as we don't care) + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) block_info, &document_type, platform_version, @@ -169,6 +173,34 @@ impl Drive { VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), )) } + DocumentTransition::Transfer(transfer_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (transfer)", transfer_transition.base().id()))))?; + let expected_document = Document::try_from_tran( + replace_transition, + documents_batch_transition.owner_id(), + document.created_at(), //we can trust the created at (as we don't care) + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + document.created_at(), //we can trust the created at (as we don't care) + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + block_info, + &document_type, + platform_version, + )?; + + if !document.is_equal_ignoring_time_based_fields( + &expected_document, + platform_version, + )? { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after transfer with id {}", transfer_transition.base().id())))); + } + + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } DocumentTransition::Delete(delete_transition) => { if document.is_some() { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution contained document after delete with id {}", delete_transition.base().id())))); diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index 92ab780a113..79dc6b8546e 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -127,10 +127,13 @@ impl DocumentFromCreateTransitionActionV0 for Document { revision: document_type.initial_revision(), created_at: *created_at, updated_at: *created_at, + transferred_at: None, created_at_block_height: *created_at_block_height, updated_at_block_height: *created_at_block_height, + transferred_at_block_height: None, created_at_core_block_height: *created_at_core_block_height, updated_at_core_block_height: *created_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -181,10 +184,13 @@ impl DocumentFromCreateTransitionActionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at: created_at, + transferred_at: None, created_at_block_height, updated_at_block_height: created_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height: created_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs index 25eea910993..4c5cfa6316f 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs @@ -16,6 +16,9 @@ impl DocumentReplaceTransitionAction { originally_created_at: Option, originally_created_at_block_height: Option, originally_created_at_core_block_height: Option, + originally_transferred_at: Option, + originally_transferred_at_block_height: Option, + originally_transferred_at_core_block_height: Option, block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { @@ -26,6 +29,9 @@ impl DocumentReplaceTransitionAction { originally_created_at, originally_created_at_block_height, originally_created_at_core_block_height, + originally_transferred_at, + originally_transferred_at_block_height, + originally_transferred_at_core_block_height, block_info, get_data_contract, )? diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index c28811dd63b..c1643a292f2 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -22,14 +22,20 @@ pub struct DocumentReplaceTransitionActionV0 { pub created_at: Option, /// The time the document was last updated pub updated_at: Option, + /// The time the document was last transferred + pub transferred_at: Option, /// The block height at which the document was created pub created_at_block_height: Option, /// The block height at which the document was last updated pub updated_at_block_height: Option, + /// The block height at which the document was last transferred + pub transferred_at_block_height: Option, /// The core block height at which the document was created pub created_at_core_block_height: Option, /// The core block height at which the document was last updated pub updated_at_core_block_height: Option, + /// The core block height at which the document was last transferred + pub transferred_at_core_block_height: Option, /// Document properties pub data: BTreeMap, } @@ -111,10 +117,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, data, } = value; @@ -132,10 +141,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision: Some(*revision), created_at: *created_at, updated_at: *updated_at, + transferred_at: *transferred_at, created_at_block_height: *created_at_block_height, updated_at_block_height: *updated_at_block_height, + transferred_at_block_height: *transferred_at_block_height, created_at_core_block_height: *created_at_core_block_height, updated_at_core_block_height: *updated_at_core_block_height, + transferred_at_core_block_height: *transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -156,10 +168,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, data, } = value; @@ -177,10 +192,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision: Some(revision), created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs index a092683adaa..8127c39532a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs @@ -18,6 +18,9 @@ impl DocumentReplaceTransitionActionV0 { originally_created_at: Option, originally_created_at_block_height: Option, originally_created_at_core_block_height: Option, + originally_transferred_at: Option, + originally_transferred_at_block_height: Option, + originally_transferred_at_core_block_height: Option, block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { @@ -58,10 +61,13 @@ impl DocumentReplaceTransitionActionV0 { revision: *revision, created_at: originally_created_at, updated_at, + transferred_at: originally_transferred_at, created_at_block_height: originally_created_at_block_height, updated_at_block_height, + transferred_at_block_height: originally_transferred_at_block_height, created_at_core_block_height: originally_created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: originally_transferred_at_core_block_height, data: data.clone(), }) } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs index 24d8b4be418..d9a38534ca9 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs @@ -1,13 +1,9 @@ mod v0; -use std::collections::BTreeMap; - use derive_more::From; - use dpp::document::Document; -use dpp::identity::TimestampMillis; -use dpp::platform_value::{Identifier, Value}; -use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; + +use dpp::platform_value::Identifier; use dpp::ProtocolError; pub use v0::*; @@ -86,4 +82,4 @@ pub trait DocumentFromTransferTransitionAction { ) -> Result where Self: Sized; -} \ No newline at end of file +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs index 65af87ea3d9..16bbaa4822a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs @@ -1,9 +1,8 @@ use dpp::block::block_info::BlockInfo; +use dpp::document::Document; use dpp::platform_value::Identifier; use std::sync::Arc; -use dpp::identity::TimestampMillis; -use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; use crate::drive::contract::DataContractFetchInfo; @@ -13,9 +12,7 @@ impl DocumentTransferTransitionAction { /// try from borrowed pub fn try_from_borrowed_document_transfer_transition( document_transfer_transition: &DocumentTransferTransition, - originally_created_at: Option, - originally_created_at_block_height: Option, - originally_created_at_core_block_height: Option, + original_document: Document, block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { @@ -23,9 +20,7 @@ impl DocumentTransferTransitionAction { DocumentTransferTransition::V0(v0) => Ok( DocumentTransferTransitionActionV0::try_from_borrowed_document_transfer_transition( v0, - originally_created_at, - originally_created_at_block_height, - originally_created_at_core_block_height, + original_document, block_info, get_data_contract, )? diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs index b30bde826d2..034917b028b 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs @@ -1,16 +1,8 @@ pub mod transformer; -use dpp::document::{Document, DocumentV0}; -use dpp::identity::TimestampMillis; -use dpp::platform_value::{Identifier, Value}; -use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; -use dpp::ProtocolError; +use dpp::document::Document; -use std::collections::BTreeMap; - -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; -use dpp::version::PlatformVersion; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; /// document transfer transition action v0 #[derive(Debug, Clone)] @@ -30,4 +22,4 @@ pub trait DocumentTransferTransitionActionAccessorsV0 { /// created at fn document(&self) -> &Document; fn document_owned(self) -> Document; -} \ No newline at end of file +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs index b6e9cc1a012..aec0832019b 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -1,5 +1,5 @@ use dpp::block::block_info::BlockInfo; -use dpp::document::{Document, DocumentV0Setters, property_names}; +use dpp::document::{property_names, Document, DocumentV0Setters}; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -27,21 +27,21 @@ impl DocumentTransferTransitionActionV0 { base, get_data_contract, )?; - + let mut modified_document = original_document; modified_document.set_owner_id(*recipient_owner_id); - + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { - modified_document.set_updated_at(Some(block_info.time_ms)); + modified_document.set_transferred_at(Some(block_info.time_ms)); } if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { - modified_document.set_updated_at_block_height(Some(block_info.height)); + modified_document.set_transferred_at_block_height(Some(block_info.height)); } if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { - modified_document.set_updated_at_core_block_height(Some(block_info.core_height)); + modified_document.set_transferred_at_core_block_height(Some(block_info.core_height)); } Ok(DocumentTransferTransitionActionV0 { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index f4137d13934..742476740cc 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -39,10 +39,13 @@ impl IdentityCreditWithdrawalTransitionActionV0 { revision: Some(1), created_at: Some(creation_time_ms), updated_at: Some(creation_time_ms), + transferred_at: None, created_at_block_height: None, updated_at_block_height: None, + transferred_at_block_height: None, created_at_core_block_height: None, updated_at_core_block_height: None, + transferred_at_core_block_height: None, } .into(); diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 6d6e27f9f9e..adfe1c938cb 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -693,9 +693,11 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { document_create_transition_structure_validation: 0, document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -901,6 +903,13 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 5ae94aac349..1b4d3a35776 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -693,9 +693,11 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { document_create_transition_structure_validation: 0, document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -901,6 +903,13 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index bde06330eb1..1a1288dcd20 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -692,9 +692,11 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { document_create_transition_structure_validation: 0, document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -900,6 +902,13 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, From eba768d50e3bbec71b3b9eb42df508e2fe043f0e Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 19 Apr 2024 19:52:06 +0700 Subject: [PATCH 03/65] more fixes --- .../rs-dpp/src/document/v0/cbor_conversion.rs | 21 ++++++ .../create_genesis_state/v0/mod.rs | 3 + .../structure_v0/mod.rs | 15 ++-- .../advanced_structure/v0/mod.rs | 18 ++++- .../documents_batch/state/v0/mod.rs | 10 +++ .../documents_batch/transformer/v0/mod.rs | 26 ++++--- .../src/query/system/path_elements/v0/mod.rs | 2 - .../src/test/helpers/fee_pools.rs | 3 + .../verify_state_transitions.rs | 23 +++++- .../document/document_transition.rs | 7 ++ .../validate_uniqueness_of_data/mod.rs | 6 ++ .../validate_uniqueness_of_data/v0/mod.rs | 29 +++++++- .../drive/document/index_uniqueness/mod.rs | 1 + .../v0/mod.rs | 3 + .../v0/mod.rs | 4 ++ .../mod.rs | 70 +++++++++++++++++++ .../v0/mod.rs | 64 +++++++++++++++++ .../validate_document_uniqueness/v0/mod.rs | 3 + .../v0/mod.rs | 21 +----- .../document_transition/action_type.rs | 1 + .../document_replace_transition_action/mod.rs | 18 +++++ .../v0/mod.rs | 10 +++ .../v0/mod.rs | 3 +- .../src/version/drive_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + 27 files changed, 320 insertions(+), 45 deletions(-) create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs diff --git a/packages/rs-dpp/src/document/v0/cbor_conversion.rs b/packages/rs-dpp/src/document/v0/cbor_conversion.rs index 2791de5e325..8fe0732ea2c 100644 --- a/packages/rs-dpp/src/document/v0/cbor_conversion.rs +++ b/packages/rs-dpp/src/document/v0/cbor_conversion.rs @@ -41,16 +41,22 @@ pub struct DocumentForCbor { pub created_at: Option, #[serde(rename = "$updatedAt")] pub updated_at: Option, + #[serde(rename = "$transferredAt")] + pub transferred_at: Option, #[serde(rename = "$createdAtBlockHeight")] pub created_at_block_height: Option, #[serde(rename = "$updatedAtBlockHeight")] pub updated_at_block_height: Option, + #[serde(rename = "$transferredAtBlockHeight")] + pub transferred_at_block_height: Option, #[serde(rename = "$createdAtCoreBlockHeight")] pub created_at_core_block_height: Option, #[serde(rename = "$updatedAtCoreBlockHeight")] pub updated_at_core_block_height: Option, + #[serde(rename = "$transferredAtCoreBlockHeight")] + pub transferred_at_core_block_height: Option, } #[cfg(feature = "cbor")] @@ -65,10 +71,13 @@ impl TryFrom for DocumentForCbor { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } = value; Ok(DocumentForCbor { id: id.to_buffer(), @@ -78,10 +87,13 @@ impl TryFrom for DocumentForCbor { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }) } } @@ -112,14 +124,20 @@ impl DocumentV0 { let created_at = document_map.remove_optional_integer(property_names::CREATED_AT)?; let updated_at = document_map.remove_optional_integer(property_names::UPDATED_AT)?; + let transferred_at = + document_map.remove_optional_integer(property_names::TRANSFERRED_AT)?; let created_at_block_height = document_map.remove_optional_integer(property_names::CREATED_AT_BLOCK_HEIGHT)?; let updated_at_block_height = document_map.remove_optional_integer(property_names::UPDATED_AT_BLOCK_HEIGHT)?; + let transferred_at_block_height = + document_map.remove_optional_integer(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)?; let created_at_core_block_height = document_map.remove_optional_integer(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)?; let updated_at_core_block_height = document_map.remove_optional_integer(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT)?; + let transferred_at_core_block_height = document_map + .remove_optional_integer(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)?; // dev-note: properties is everything other than the id and owner id Ok(DocumentV0 { @@ -129,10 +147,13 @@ impl DocumentV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 0bbbd8ace86..0b4bea3c2eb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -256,10 +256,13 @@ impl Platform { revision: None, created_at: None, updated_at: None, + transferred_at: None, created_at_block_height: None, updated_at_block_height: None, + transferred_at_block_height: None, created_at_core_block_height: None, updated_at_core_block_height: None, + transferred_at_core_block_height: None, } .into(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs index 0a5f01295c8..ec629492144 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs @@ -1,6 +1,5 @@ use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::validation::DataContractValidationMethodsV0; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; @@ -16,7 +15,7 @@ pub(super) trait DocumentTransferTransitionActionStructureValidationV0 { impl DocumentTransferTransitionActionStructureValidationV0 for DocumentTransferTransitionAction { fn validate_structure_v0( &self, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, ) -> Result { let contract_fetch_info = self.base().data_contract_fetch_info(); let data_contract = &contract_fetch_info.contract; @@ -27,16 +26,12 @@ impl DocumentTransferTransitionActionStructureValidationV0 for DocumentTransferT .document_type_optional_for_name(document_type_name) .is_none() { - return Ok(SimpleConsensusValidationResult::new_with_error( + Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), - )); + )) + } else { + Ok(SimpleConsensusValidationResult::default()) } - - // Validate user defined properties - - data_contract - .validate_document_properties(document_type_name, self.data().into(), platform_version) - .map_err(Error::Protocol) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 94bb7a799b4..1e0163bfd44 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -28,6 +28,7 @@ use drive::state_transition_action::system::bump_identity_data_contract_nonce_ac use crate::error::execution::ExecutionError; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { @@ -132,7 +133,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi let result = replace_action.validate_structure(platform_version)?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the replace action"), self.owner_id(), self.user_fee_increase()), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -145,7 +146,20 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi let result = delete_action.validate_structure(platform_version)?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the delete action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::TransferAction(transfer_action) => { + let result = transfer_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the transfer action"), self.owner_id(), self.user_fee_increase()), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index bb08be2e981..d65b0892893 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -17,6 +17,7 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; @@ -92,6 +93,15 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition transaction, platform_version, )?, + DocumentTransitionAction::TransferAction(transfer_action) => transfer_action + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::DeleteAction(delete_action) => delete_action .validate_state( platform, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 593995b0da4..3b6a0715d3d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -23,7 +23,7 @@ use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusV use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentReplaceTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; @@ -385,6 +385,14 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let original_document_created_at_core_block_height = original_document.created_at_core_block_height(); + let original_document_transferred_at = original_document.transferred_at(); + + let original_document_transferred_at_block_height = + original_document.transferred_at_block_height(); + + let original_document_transferred_at_core_block_height = + original_document.transferred_at_core_block_height(); + let validation_result = Self::check_ownership_of_old_replaced_document_v0( document_replace_transition.base().id(), original_document, @@ -418,6 +426,9 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition original_document_created_at, original_document_created_at_block_height, original_document_created_at_core_block_height, + original_document_transferred_at, + original_document_transferred_at_block_height, + original_document_transferred_at_core_block_height, block_info, |_identifier| Ok(data_contract_fetch_info.clone()), )?; @@ -475,20 +486,15 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition } let document_transfer_action = - DocumentTransferTransitionAction::try_from_borrowed_document_replace_transition( - document_replace_transition, - original_document_created_at, - original_document_created_at_block_height, - original_document_created_at_core_block_height, + DocumentTransferTransitionAction::try_from_borrowed_document_transfer_transition( + document_transfer_transition, + original_document.clone(), //todo: remove clone block_info, |_identifier| Ok(data_contract_fetch_info.clone()), )?; if result.is_valid() { - Ok( - DocumentTransitionAction::TransferAction(document_transfer_transition) - .into(), - ) + Ok(DocumentTransitionAction::TransferAction(document_transfer_action).into()) } else { Ok(result) } diff --git a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs index b917c3fc5c2..705375640bc 100644 --- a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs @@ -1,13 +1,11 @@ use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; use dapi_grpc::platform::v0::get_path_elements_response::get_path_elements_response_v0::Elements; use dapi_grpc::platform::v0::get_path_elements_response::{ get_path_elements_response_v0, GetPathElementsResponseV0, }; -use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::check_validation_result_with_data; use crate::error::query::QueryError; diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index 01148aae50b..5b5fb7aebe4 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -84,10 +84,13 @@ fn create_test_mn_share_document( revision: Some(INITIAL_REVISION), created_at: None, updated_at: None, + transferred_at: None, created_at_block_height: None, updated_at_block_height: None, + transferred_at_block_height: None, created_at_core_block_height: None, updated_at_core_block_height: None, + transferred_at_core_block_height: None, } .into(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index bb900789d02..13910492ef1 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -3,7 +3,7 @@ use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest}; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::document::Document; +use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; @@ -23,6 +23,7 @@ use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatch use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use drive_abci::execution::validation::state_transition::ValidationMode; @@ -383,6 +384,26 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { panic!("we should not have a bump identity data contract nonce"); } + DocumentTransitionAction::TransferAction(transfer_action) => { + if *was_executed { + // it's also possible we deleted something we replaced + if let Some(document) = document { + assert_eq!( + document.owner_id(), + transfer_action.document().owner_id() + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.owner_id(), + transfer_action.document().owner_id() + ); + } + } + } } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs index bb37226d10f..c141cae6c46 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs @@ -36,6 +36,13 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { platform_version, ) } + DocumentTransitionAction::TransferAction(document_transfer_transition) => { + document_transfer_transition.into_high_level_document_drive_operations( + epoch, + owner_id, + platform_version, + ) + } DocumentTransitionAction::BumpIdentityDataContractNonce( bump_identity_contract_nonce_action, ) => bump_identity_contract_nonce_action diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs index 081fc257729..32823a82e9c 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs @@ -40,14 +40,20 @@ pub(in crate::drive::document::index_uniqueness) struct UniquenessOfDataRequest< pub created_at: Option, /// Optional timestamp indicating the last time the document was updated. pub updated_at: Option, + /// Optional timestamp indicating the last time the document was transferred. + pub transferred_at: Option, /// Optional timestamp indicating the block height at which the document was created. pub created_at_block_height: Option, /// Optional timestamp indicating the last block height the document was updated. pub updated_at_block_height: Option, + /// Optional timestamp indicating the last block height the document was transferred. + pub transferred_at_block_height: Option, /// Optional timestamp indicating the core height at which the document was created. pub created_at_core_block_height: Option, /// Optional timestamp indicating the last core block height the document was updated. pub updated_at_core_block_height: Option, + /// Optional timestamp indicating the last core block height the document was transferred. + pub transferred_at_core_block_height: Option, /// The actual data to be checked for uniqueness, represented as a mapping. pub data: &'a BTreeMap, } diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs index 8a3b7c14791..228d1d06d26 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs @@ -49,10 +49,13 @@ impl Drive { allow_original, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, data, } = request; @@ -86,6 +89,13 @@ impl Drive { return None; } } + property_names::TRANSFERRED_AT => { + if let Some(transferred_at) = transferred_at { + platform_value!(transferred_at) + } else { + return None; + } + } property_names::CREATED_AT_BLOCK_HEIGHT => { if let Some(created_at_block_height) = created_at_block_height { platform_value!(created_at_block_height) @@ -100,6 +110,15 @@ impl Drive { return None; } } + property_names::TRANSFERRED_AT_BLOCK_HEIGHT => { + if let Some(transferred_at_block_height) = + transferred_at_block_height + { + platform_value!(transferred_at_block_height) + } else { + return None; + } + } property_names::CREATED_AT_CORE_BLOCK_HEIGHT => { if let Some(created_at_core_block_height) = created_at_core_block_height @@ -118,7 +137,15 @@ impl Drive { return None; } } - + property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT => { + if let Some(transferred_at_core_block_height) = + transferred_at_core_block_height + { + platform_value!(transferred_at_core_block_height) + } else { + return None; + } + } _ => { if let Some(value) = data.get(property.name.as_str()) { value.clone() diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs index 1e84677b018..ffeeab47df0 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs @@ -39,4 +39,5 @@ mod validate_document_create_transition_action_uniqueness; mod validate_document_replace_transition_action_uniqueness; +mod validate_document_transfer_transition_action_uniqueness; mod validate_document_uniqueness; diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index 64754144002..9fec5ec253c 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -37,10 +37,13 @@ impl Drive { allow_original: false, created_at: document_create_transition.created_at(), updated_at: document_create_transition.created_at(), + transferred_at: None, created_at_block_height: document_create_transition.created_at_block_height(), updated_at_block_height: document_create_transition.created_at_block_height(), + transferred_at_block_height: None, created_at_core_block_height: document_create_transition.created_at_core_block_height(), updated_at_core_block_height: document_create_transition.created_at_core_block_height(), + transferred_at_core_block_height: None, data: document_create_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs index 76682ed3c7a..8930e78be5c 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs @@ -37,12 +37,16 @@ impl Drive { allow_original: true, created_at: document_replace_transition.created_at(), updated_at: document_replace_transition.updated_at(), + transferred_at: document_replace_transition.transferred_at(), created_at_block_height: document_replace_transition.created_at_block_height(), updated_at_block_height: document_replace_transition.updated_at_block_height(), + transferred_at_block_height: document_replace_transition.transferred_at_block_height(), created_at_core_block_height: document_replace_transition .created_at_core_block_height(), updated_at_core_block_height: document_replace_transition .updated_at_core_block_height(), + transferred_at_core_block_height: document_replace_transition + .transferred_at_core_block_height(), data: document_replace_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs new file mode 100644 index 00000000000..b72f8d55ae2 --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs @@ -0,0 +1,70 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document transfer transition action would be unique in the state. + /// + /// # Arguments + /// + /// * `contract` - A `DataContract` object representing the contract. + /// * `document_type` - A `DocumentType` object representing the type of the document. + /// * `document_transfer_transition` - A `DocumentTransferTransitionAction` object representing the document transfer transition action. + /// * `owner_id` - An `Identifier` object representing the owner's ID. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result` - If successful, returns a `SimpleConsensusValidationResult` object representing the result of the validation. + /// If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn validate_document_transfer_transition_action_uniqueness( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_transfer_transition: &DocumentTransferTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .document + .index_uniqueness + .validate_document_transfer_transition_action_uniqueness + { + 0 => self.validate_document_transfer_transition_action_uniqueness_v0( + contract, + document_type, + document_transfer_transition, + owner_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "validate_document_transfer_transition_action_uniqueness".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs new file mode 100644 index 00000000000..a4a2551716c --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs @@ -0,0 +1,64 @@ +use dpp::data_contract::DataContract; + +use crate::drive::Drive; + +use crate::drive::document::index_uniqueness::internal::validate_uniqueness_of_data::UniquenessOfDataRequest; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use dpp::document::DocumentV0Getters; +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document transfer transition action would be unique in the state + #[inline(always)] + pub(super) fn validate_document_transfer_transition_action_uniqueness_v0( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_transfer_transition: &DocumentTransferTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let request = UniquenessOfDataRequest { + contract, + document_type, + owner_id, + document_id: document_transfer_transition.base().id(), + allow_original: true, + created_at: document_transfer_transition.document().created_at(), + updated_at: document_transfer_transition.document().updated_at(), + transferred_at: document_transfer_transition.document().transferred_at(), + created_at_block_height: document_transfer_transition + .document() + .created_at_block_height(), + updated_at_block_height: document_transfer_transition + .document() + .updated_at_block_height(), + transferred_at_block_height: document_transfer_transition + .document() + .transferred_at_block_height(), + created_at_core_block_height: document_transfer_transition + .document() + .created_at_core_block_height(), + updated_at_core_block_height: document_transfer_transition + .document() + .updated_at_core_block_height(), + transferred_at_core_block_height: document_transfer_transition + .document() + .transferred_at_core_block_height(), + data: document_transfer_transition.document().properties(), + }; + self.validate_uniqueness_of_data(request, transaction, platform_version) + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs index 8fdf2b5a39a..b4e6e8a8f38 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs @@ -35,10 +35,13 @@ impl Drive { allow_original, created_at: document.created_at(), updated_at: document.updated_at(), + transferred_at: document.transferred_at(), created_at_block_height: document.created_at_block_height(), updated_at_block_height: document.updated_at_block_height(), + transferred_at_block_height: document.transferred_at_block_height(), created_at_core_block_height: document.created_at_core_block_height(), updated_at_core_block_height: document.updated_at_core_block_height(), + transferred_at_core_block_height: document.transferred_at_core_block_height(), data: document.properties(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 9c0e4202b8a..d4d4e148e49 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -175,25 +175,10 @@ impl Drive { } DocumentTransition::Transfer(transfer_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (transfer)", transfer_transition.base().id()))))?; - let expected_document = Document::try_from_tran( - replace_transition, - documents_batch_transition.owner_id(), - document.created_at(), //we can trust the created at (as we don't care) - document.created_at_block_height(), //we can trust the created at block height (as we don't care) - document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) - document.created_at(), //we can trust the created at (as we don't care) - document.created_at_block_height(), //we can trust the created at block height (as we don't care) - document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) - block_info, - &document_type, - platform_version, - )?; + let recipient_owner_id = transfer_transition.recipient_owner_id(); - if !document.is_equal_ignoring_time_based_fields( - &expected_document, - platform_version, - )? { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after transfer with id {}", transfer_transition.base().id())))); + if document.owner_id() != recipient_owner_id { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", transfer_transition.base().id())))); } Ok(( diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs index e213385cb96..f2dda795254 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs @@ -9,6 +9,7 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::CreateAction(_) => DocumentTransitionActionType::Create, DocumentTransitionAction::DeleteAction(_) => DocumentTransitionActionType::Delete, DocumentTransitionAction::ReplaceAction(_) => DocumentTransitionActionType::Replace, + DocumentTransitionAction::TransferAction(_) => DocumentTransitionActionType::Transfer, DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { DocumentTransitionActionType::IgnoreWhileBumpingRevision } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs index a868fd2c8fc..f2dfc222e36 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs @@ -55,6 +55,12 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + fn transferred_at(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.transferred_at, + } + } + /// Returns the block height at which the document was created. fn created_at_block_height(&self) -> Option { match self { @@ -69,6 +75,12 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + fn transferred_at_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.transferred_at_block_height, + } + } + /// Returns the core block height at which the document was created. fn created_at_core_block_height(&self) -> Option { match self { @@ -83,6 +95,12 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + fn transferred_at_core_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.transferred_at_core_block_height, + } + } + fn data(&self) -> &BTreeMap { match self { DocumentReplaceTransitionAction::V0(v0) => &v0.data, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index c1643a292f2..299d71136f5 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -52,16 +52,26 @@ pub trait DocumentReplaceTransitionActionAccessorsV0 { fn created_at(&self) -> Option; /// updated at fn updated_at(&self) -> Option; + /// transferred at + fn transferred_at(&self) -> Option; /// Returns the block height at which the document was created. fn created_at_block_height(&self) -> Option; /// Returns the block height at which the document was last updated. fn updated_at_block_height(&self) -> Option; + + /// Returns the block height at which the document was last transferred. + fn transferred_at_block_height(&self) -> Option; + /// Returns the core block height at which the document was created. fn created_at_core_block_height(&self) -> Option; /// Returns the core block height at which the document was last updated. fn updated_at_core_block_height(&self) -> Option; + + /// Returns the core block height at which the document was last transferred. + fn transferred_at_core_block_height(&self) -> Option; + /// data fn data(&self) -> &BTreeMap; /// data owned diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs index 034917b028b..d23667dd298 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs @@ -19,7 +19,8 @@ pub trait DocumentTransferTransitionActionAccessorsV0 { fn base(&self) -> &DocumentBaseTransitionAction; /// base owned fn base_owned(self) -> DocumentBaseTransitionAction; - /// created at + /// the document to be inserted as a ref fn document(&self) -> &Document; + /// the document to be inserted as owned fn document_owned(self) -> Document; } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index bc985e87ef9..3b608473941 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -300,6 +300,7 @@ pub struct DriveDocumentIndexUniquenessMethodVersions { pub validate_document_uniqueness: FeatureVersion, pub validate_document_create_transition_action_uniqueness: FeatureVersion, pub validate_document_replace_transition_action_uniqueness: FeatureVersion, + pub validate_document_transfer_transition_action_uniqueness: FeatureVersion, pub validate_uniqueness_of_data: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index adfe1c938cb..0fc8a1d44bc 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -201,6 +201,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_document_uniqueness: 0, validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 1b4d3a35776..895c831cfd1 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -209,6 +209,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_document_uniqueness: 0, validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 1a1288dcd20..28ec40451d3 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -200,6 +200,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_document_uniqueness: 0, validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, From d8ba10d0e936a0e4af37df53a8d1e7392e2cafb2 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 19 Apr 2024 23:03:32 +0700 Subject: [PATCH 04/65] added some tests for document replace --- .../schema/v1/dashpay.schema.json | 1 + .../document_type/v0/random_document.rs | 5 +- .../document_transition/mod.rs | 2 +- .../state_transitions/documents_batch/mod.rs | 446 ++++++++++++++++++ .../documents_batch/transformer/v0/mod.rs | 43 +- .../tests/strategy_tests/main.rs | 180 +++++-- .../tests/strategy_tests/strategy.rs | 142 +++++- .../rs-drive/src/drive/document/query/mod.rs | 12 +- packages/strategy-tests/src/lib.rs | 140 +++++- packages/strategy-tests/src/operations.rs | 3 +- 10 files changed, 877 insertions(+), 97 deletions(-) diff --git a/packages/dashpay-contract/schema/v1/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json index c51ee225f03..d4281468ed9 100644 --- a/packages/dashpay-contract/schema/v1/dashpay.schema.json +++ b/packages/dashpay-contract/schema/v1/dashpay.schema.json @@ -131,6 +131,7 @@ "additionalProperties": false }, "contactRequest": { + "documentsMutable": false, "requiresIdentityEncryptionBoundedKey": 2, "requiresIdentityDecryptionBoundedKey": 2, "type": "object", diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 93eb33ad517..f14f022e916 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -11,9 +11,8 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use std::time::{SystemTime, UNIX_EPOCH}; use crate::document::property_names::{ - CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, - TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, - UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, + UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::{Document, DocumentV0}; use crate::identity::accessors::IdentityGettersV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 94ab51afd78..9ff8246a8ef 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -123,7 +123,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.data().get(path), DocumentTransition::Replace(t) => t.data().get(path), DocumentTransition::Delete(_) => None, - DocumentTransition::Transfer(t) => None, + DocumentTransition::Transfer(_) => None, } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index d09cd9e1757..41c3fbd2481 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -231,3 +231,449 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { } } } + +#[cfg(test)] +mod tests { + use crate::rpc::core::MockCoreRPCLike; + use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; + use dpp::data_contract::document_type::random_document::{ + CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, + }; + use dpp::document::document_methods::DocumentMethodsV0; + use dpp::document::DocumentV0Setters; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; + use dpp::platform_value::{Bytes32, Value}; + use dpp::prelude::Identifier; + use dpp::serialization::PlatformSerializable; + use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; + use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::SeedableRng; + use simple_signer::signer::SimpleSigner; + use std::collections::BTreeMap; + + fn setup_identity( + platform: &mut TempPlatform, + seed: u64, + ) -> (Identity, SimpleSigner, IdentityPublicKey, Vec) { + let platform_version = PlatformVersion::latest(); + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(seed); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key_with_rng( + 0, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key_with_rng( + 1, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(critical_public_key.clone(), private_key.clone()); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key.clone()), + ]), + balance: 10000000000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + (identity, signer, critical_public_key, private_key) + } + + #[test] + fn test_document_replace_on_document_type_that_is_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + assert!(profile.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5074230); + } + + #[test] + fn test_document_replace_on_document_type_that_is_not_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let (other_identity, ..) = setup_identity(&mut platform, 495); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(!contact_request_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 102690); + } + + #[test] + fn test_document_replace_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 3b6a0715d3d..0e0de59cb97 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -4,7 +4,9 @@ use std::sync::Arc; use crate::error::Error; use crate::platform_types::platform::PlatformStateRef; -use dpp::consensus::basic::document::{DataContractNotPresentError, InvalidDocumentTypeError}; +use dpp::consensus::basic::document::{ + DataContractNotPresentError, InvalidDocumentTransitionIdError, InvalidDocumentTypeError, +}; use dpp::consensus::basic::BasicError; use dpp::consensus::state::document::document_not_found_error::DocumentNotFoundError; @@ -16,7 +18,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0Getters}; -use dpp::prelude::Revision; +use dpp::prelude::{Revision, UserFeeIncrease}; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; @@ -40,6 +42,7 @@ use dpp::state_transition::documents_batch_transition::document_transition::docu use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchTransitionTransformerV0 @@ -163,15 +166,17 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { .collect::>>, Error>>()?; let validation_result = ConsensusValidationResult::flatten(validation_result); - if validation_result.is_valid() { + if validation_result.has_data() { + let (transitions, errors) = validation_result.into_data_and_errors()?; let batch_transition_action = DocumentsBatchTransitionActionV0 { owner_id, - transitions: validation_result.into_data()?, + transitions, user_fee_increase, } .into(); - Ok(ConsensusValidationResult::new_with_data( + Ok(ConsensusValidationResult::new_with_data_and_errors( batch_transition_action, + errors, )) } else { Ok(ConsensusValidationResult::new_with_errors( @@ -299,7 +304,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let replaced_documents = fetched_documents_validation_result.into_data()?; - let document_transition_actions_result = if !dry_run { + Ok(if !dry_run { let document_transition_actions_validation_result = document_transitions .iter() .map(|transition| { @@ -326,17 +331,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition result } else { ConsensusValidationResult::default() - }; - - if !document_transition_actions_result.is_valid() { - return Ok(document_transition_actions_result); - } - - let document_transition_actions = document_transition_actions_result.into_data()?; - - Ok(ConsensusValidationResult::new_with_data( - document_transition_actions, - )) + }) } /// The data contract can be of multiple difference versions @@ -369,8 +364,18 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition Self::find_replaced_document_v0(transition, replaced_documents); if !validation_result.is_valid_with_data() { - result.merge(validation_result); - return Ok(result); + // We can set the user fee increase to 0 here because it is decided by the Documents Batch instead + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( + document_replace_transition.base(), + owner_id, + 0, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action.into(), + validation_result.errors, + )); } let original_document = validation_result.into_data()?; diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 1b47dab90d9..67f53195fef 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1,32 +1,3 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Execution Tests //! @@ -79,7 +50,9 @@ mod tests { use dashcore_rpc::json::AssetUnlockStatusResult; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use std::sync::{Arc, Mutex}; - use strategy_tests::operations::DocumentAction::DocumentActionReplace; + use strategy_tests::operations::DocumentAction::{ + DocumentActionReplaceRandom, DocumentActionTransferRandom, + }; use strategy_tests::operations::{ DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, }; @@ -2302,7 +2275,7 @@ mod tests { let document_replace_op = DocumentOp { contract: contract.clone(), - action: DocumentActionReplace, + action: DocumentActionReplaceRandom, document_type: contract .document_type_for_name("contactRequest") .expect("expected a profile document type") @@ -2403,6 +2376,151 @@ mod tests { assert_eq!(balance_count, 19); // 1 epoch worth of proposers } + #[test] + fn run_chain_insert_many_new_identity_per_block_many_document_insertions_updates_transfers_and_deletions_with_epoch_change( + ) { + let platform_version = PlatformVersion::latest(); + let created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let contract = created_contract.data_contract(); + + let document_insertion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionInsertRandom( + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_replace_op = DocumentOp { + contract: contract.clone(), + action: DocumentActionReplaceRandom, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_transfer_op = DocumentOp { + contract: contract.clone(), + action: DocumentActionTransferRandom, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_deletion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionDelete, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![(created_contract, None)], + operations: vec![ + Operation { + op_type: OperationType::Document(document_insertion_op), + frequency: Frequency { + times_per_block_range: 1..40, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_replace_op), + frequency: Frequency { + times_per_block_range: 1..5, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_transfer_op), + frequency: Frequency { + times_per_block_range: 1..5, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_deletion_op), + frequency: Frequency { + times_per_block_range: 1..5, + chance_per_block: None, + }, + }, + ], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..6, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), + }, + + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let day_in_ms = 1000 * 60 * 60 * 24; + + let config = PlatformConfig { + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 100, + epoch_time_length_s: 1576800, + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + let block_count = 30; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); + assert_eq!(outcome.identities.len() as u64, 97); + assert_eq!(outcome.masternode_identity_balances.len(), 100); + let balance_count = outcome + .masternode_identity_balances + .into_iter() + .filter(|(_, balance)| *balance != 0) + .count(); + assert_eq!(balance_count, 19); // 1 epoch worth of proposers + } + #[test] fn run_chain_top_up_identities() { drive_abci::logging::init_for_tests(LogLevel::Silent); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index cd9ccdd195f..a52c42ac3db 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -55,9 +55,10 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition, DocumentsBatchTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; +use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransferTransition}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; @@ -527,6 +528,7 @@ impl NetworkStrategy { let mut operations = vec![]; let mut finalize_block_operations = vec![]; let mut replaced = vec![]; + let mut transferred = vec![]; let mut deleted = vec![]; for op in &self.strategy.operations { if op.frequency.check_hit(rng) { @@ -751,6 +753,8 @@ impl NetworkStrategy { items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -821,7 +825,7 @@ impl NetworkStrategy { } } OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionReplace, + action: DocumentAction::DocumentActionReplaceRandom, document_type, contract, }) => { @@ -843,6 +847,8 @@ impl NetworkStrategy { items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -920,6 +926,117 @@ impl NetworkStrategy { operations.push(document_batch_transition); } } + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionTransferRandom, + document_type, + contract, + }) => { + let any_item_query = + DriveQuery::any_item_query(contract, document_type.as_ref()); + let mut items = platform + .drive + .query_documents( + any_item_query, + Some(&block_info.epoch), + false, + None, + Some(platform_version.protocol_version), + ) + .expect("expect to execute query") + .documents_owned(); + + items.retain(|item| !deleted.contains(&item.id())); + + items.retain(|item| !replaced.contains(&item.id())); + + items.retain(|item| !transferred.contains(&item.id())); + + if !items.is_empty() { + let document = items.remove(0); + + transferred.push(document.id()); + + let random_index = rng.gen_range(0..current_identities.len()); + let mut random_identity_id = current_identities[random_index].id(); + + if random_identity_id == document.owner_id() { + if current_identities.len() == 1 { + continue; + } + if random_index == current_identities.len() - 1 { + // we are at the end + random_identity_id = current_identities[random_index - 1].id(); + } else { + random_identity_id = current_identities[random_index + 1].id(); + } + } + + let request = IdentityKeysRequest { + identity_id: document.owner_id().to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = platform + .drive + .fetch_identity_balance_with_keys(request, None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity"); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + let document_transfer_transition: DocumentTransferTransition = + DocumentTransferTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + revision: document + .revision() + .expect("expected to unwrap revision") + + 1, + recipient_owner_id: random_identity_id, + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_transfer_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + } + } OperationType::IdentityTopUp if !current_identities.is_empty() => { let indices: Vec = (0..current_identities.len()).choose_multiple(rng, count as usize); @@ -1044,11 +1161,11 @@ impl NetworkStrategy { ); // Create `doc_type_count` doc types - let doc_types = - Value::Map( - doc_type_range - .clone() - .filter_map(|_| match DocumentTypeV0::random_document_type( + let doc_types = Value::Map( + doc_type_range + .clone() + .map(|_| { + match DocumentTypeV0::random_document_type( params.clone(), contract_id, rng, @@ -1058,10 +1175,10 @@ impl NetworkStrategy { let doc_type_clone = new_document_type.schema().clone(); - Some(( + ( Value::Text(new_document_type.name().clone()), doc_type_clone, - )) + ) } Err(e) => { panic!( @@ -1069,9 +1186,10 @@ impl NetworkStrategy { e ); } - }) - .collect(), - ); + } + }) + .collect(), + ); let created_data_contract = match contract_factory.create( owner_id, diff --git a/packages/rs-drive/src/drive/document/query/mod.rs b/packages/rs-drive/src/drive/document/query/mod.rs index 421c2c03ca3..136092c5d6e 100644 --- a/packages/rs-drive/src/drive/document/query/mod.rs +++ b/packages/rs-drive/src/drive/document/query/mod.rs @@ -35,10 +35,11 @@ mod query_documents; pub use query_documents::*; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::block::block_info::BlockInfo; #[cfg(feature = "fixtures-and-mocks")] use dpp::block::epoch::Epoch; +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::data_contract::accessors::v0::DataContractV0Getters; #[cfg(feature = "fixtures-and-mocks")] #[cfg(feature = "fixtures-and-mocks")] @@ -46,9 +47,9 @@ use grovedb::TransactionArg; use crate::drive::Drive; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use crate::drive::verify::RootHash; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use crate::error::query::QuerySyntaxError; #[cfg(feature = "fixtures-and-mocks")] use crate::error::Error; @@ -61,12 +62,13 @@ use crate::query::DriveQuery; feature = "data-contract-cbor-conversion" ))] use dpp::data_contract::conversion::cbor::DataContractCborConversionMethodsV0; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::data_contract::document_type::DocumentTypeRef; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::data_contract::DataContract; #[cfg(feature = "fixtures-and-mocks")] use dpp::version::PlatformVersion; +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::version::PlatformVersionCurrentVersion; // TODO: Not using diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index d52dc2c3048..f8d1d96439c 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -58,8 +58,9 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition, DocumentsBatchTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; +use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransferTransition}; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; use simple_signer::signer::SimpleSigner; pub mod frequency; @@ -545,6 +546,7 @@ impl Strategy { // Lists to keep track of replaced and deleted documents let mut replaced = vec![]; + let mut transferred = vec![]; let mut deleted = vec![]; // Loop through the operations and generate state transitions based on frequency and type @@ -772,22 +774,13 @@ impl Strategy { document_type, }), ); - //// the following is removed in favor of the local document query callback above - // let mut items = drive - // .query_documents( - // any_item_query, - // Some(&block_info.epoch), - // false, - // None, - // Some(platform_version.protocol_version), - // ) - // .expect("expect to execute query") - // .documents_owned(); items.retain(|item| !deleted.contains(&item.id())); items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -858,7 +851,7 @@ impl Strategy { // Generate state transition for document replace operation OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionReplace, + action: DocumentAction::DocumentActionReplaceRandom, document_type, contract, }) => { @@ -868,23 +861,13 @@ impl Strategy { document_type, }), ); - // let any_item_query = - // DriveQuery::any_item_query(contract, document_type.as_ref()); - // let mut items = drive - // .query_documents( - // any_item_query, - // Some(&block_info.epoch), - // false, - // None, - // Some(platform_version.protocol_version), - // ) - // .expect("expect to execute query") - // .documents_owned(); items.retain(|item| !deleted.contains(&item.id())); items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -961,6 +944,113 @@ impl Strategy { } } + // Generate state transition for document replace operation + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionTransferRandom, + document_type, + contract, + }) => { + let mut items = document_query_callback( + LocalDocumentQuery::RandomDocumentQuery(RandomDocumentQuery { + data_contract: contract, + document_type, + }), + ); + + + + items.retain(|item| !deleted.contains(&item.id())); + + items.retain(|item| !replaced.contains(&item.id())); + + items.retain(|item| !transferred.contains(&item.id())); + + if !items.is_empty() { + let document = items.remove(0); + + let random_index = rng.gen_range(0..current_identities.len()); + let mut random_identity_id = current_identities[random_index].id(); + + if random_identity_id == document.owner_id() { + if current_identities.len() == 1 { + continue; + } + if random_index == current_identities.len() - 1 { + // we are at the end + random_identity_id = current_identities[random_index - 1].id(); + } else { + random_identity_id = current_identities[random_index + 1].id(); + } + } + + + transferred.push(document.id()); + + let request = IdentityKeysRequest { + identity_id: document.owner_id().to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = + identity_fetch_callback(request.identity_id.into(), Some(request)); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + + let document_transfer_transition: DocumentTransferTransition = + DocumentTransferTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + revision: document + .revision() + .expect("expected to unwrap revision") + + 1, + recipient_owner_id: random_identity_id, + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_transfer_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 1, + signature: BinaryData::default(), + } + .into(); + + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + } + } + // Generate state transition for identity top-up operation OperationType::IdentityTopUp if !current_identities.is_empty() => { // Use a cyclic iterator over the identities to ensure we can create 'count' transitions diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 854f3d8089b..2affeddf50c 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -37,7 +37,8 @@ pub enum DocumentAction { DocumentFieldFillSize, ), DocumentActionDelete, - DocumentActionReplace, + DocumentActionReplaceRandom, + DocumentActionTransferRandom, } #[derive(Clone, Debug, PartialEq)] From 33dd5458e5c21cbd76ea4ff0bdb0ab74b85c3a65 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 19 Apr 2024 23:31:59 +0700 Subject: [PATCH 05/65] more tests --- .../documents_batch_transition/methods/mod.rs | 44 +++ .../methods/v0/mod.rs | 14 + .../v0/v0_methods.rs | 43 ++- .../state_transitions/documents_batch/mod.rs | 363 ++++++++++++++++++ 4 files changed, 463 insertions(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 9871d087af4..190e9b0c13a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -125,4 +125,48 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { }), } } + + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_deletion_transition_from_document( + document, + document_type, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_deletion_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index dd366eb1125..672685cbd69 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -53,6 +53,20 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 base_feature_version: Option, ) -> Result; + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result; + fn contract_based_security_level_requirement( &self, get_data_contract_security_level_requirement: impl Fn( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index e561f10c815..a3818c01fbc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -22,13 +22,14 @@ use crate::state_transition::documents_batch_transition::document_transition::{ use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +use crate::state_transition::documents_batch_transition::{DocumentDeleteTransition, DocumentsBatchTransitionV0}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::state_transition::documents_batch_transition::document_delete_transition::DocumentDeleteTransitionV0; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { fn transitions(&self) -> &Vec { @@ -121,6 +122,46 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let delete_transition = DocumentDeleteTransition::from_document( + document, + document_type, + identity_contract_nonce, + platform_version, + delete_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![delete_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 41c3fbd2481..f84d4f110d2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -676,4 +676,367 @@ mod tests { assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); } + + #[test] + fn test_document_delete_on_document_type_that_is_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + assert!(profile.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5588830); + } + + #[test] + fn test_document_delete_on_document_type_that_is_not_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let (other_identity, ..) = setup_identity(&mut platform, 495); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(!contact_request_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1507670); + } + + #[test] + fn test_document_delete_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_delete_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_delete_serialized_transition = documents_batch_delete_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_delete_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } } From cccceda6c4c43e8eacdc6508208dba34a69ee6bc Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 20 Apr 2024 23:49:39 +0700 Subject: [PATCH 06/65] updated sdk --- .../document_type/accessors/mod.rs | 19 + .../document_type/accessors/v0/mod.rs | 4 + .../class_methods/try_from_schema/v0/mod.rs | 10 + .../v0/mod.rs | 3 +- .../document_type/methods/mod.rs | 5 +- .../methods/serialize_value_for_key/v0/mod.rs | 10 +- .../document_type/property/mod.rs | 43 +- .../document_type/v0/accessors.rs | 6 + .../src/data_contract/document_type/v0/mod.rs | 3 + .../document_type/v0/random_document.rs | 3 +- .../document_type/v0/random_document_type.rs | 3 + .../get_raw_for_document_type/v0/mod.rs | 39 +- packages/rs-dpp/src/document/mod.rs | 1 + packages/rs-dpp/src/document/transfer.rs | 41 ++ .../src/errors/consensus/basic/basic_error.rs | 5 +- .../consensus/basic/data_contract/mod.rs | 2 + .../unknown_transferable_type_error.rs | 47 ++ packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../documents_batch_transition/methods/mod.rs | 47 ++ .../methods/v0/mod.rs | 15 + .../v0/v0_methods.rs | 47 +- .../structure_v0/mod.rs | 31 +- .../structure_v0/mod.rs | 19 +- .../state_v0/mod.rs | 5 +- .../structure_v0/mod.rs | 21 +- .../state_transitions/documents_batch/mod.rs | 669 ++++++++++++++++++ .../rs-drive-abci/src/test/helpers/setup.rs | 36 + .../crypto-card-game-all-transferable.json | 94 +++ .../crypto-card-game-not-transferable.json | 94 +++ packages/rs-drive/src/drive/defaults.rs | 11 + .../add_document_to_primary_storage/v0/mod.rs | 2 +- .../rs-drive/src/drive/document/insert/mod.rs | 8 +- .../v0/mod.rs | 6 +- .../drive/object_size_info/document_info.rs | 20 +- packages/rs-sdk/src/platform/transition.rs | 1 + .../platform/transition/transfer_document.rs | 170 +++++ 36 files changed, 1493 insertions(+), 48 deletions(-) create mode 100644 packages/rs-dpp/src/document/transfer.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json create mode 100644 packages/rs-sdk/src/platform/transition/transfer_document.rs diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index fff37562487..58e43cd0fe6 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -12,6 +12,7 @@ use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; pub use v0::*; +use crate::document::transfer::Transferable; impl DocumentTypeV0Getters for DocumentType { fn name(&self) -> &String { @@ -86,6 +87,12 @@ impl DocumentTypeV0Getters for DocumentType { } } + fn documents_transferable(&self) -> Transferable { + match self { + DocumentType::V0(v0) => v0.documents_transferable(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentType::V0(v0) => v0.data_contract_id(), @@ -184,6 +191,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { } } + fn documents_transferable(&self) -> Transferable { + match self { + DocumentTypeRef::V0(v0) => v0.documents_transferable(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeRef::V0(v0) => v0.data_contract_id(), @@ -282,6 +295,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { } } + fn documents_transferable(&self) -> Transferable { + match self { + DocumentTypeMutRef::V0(v0) => v0.documents_transferable(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeMutRef::V0(v0) => v0.data_contract_id(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index d18abdfc91d..d57612d0092 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -8,6 +8,7 @@ use crate::data_contract::storage_requirements::keys_for_document_type::StorageK use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; +use crate::document::transfer::Transferable; pub trait DocumentTypeV0Getters { /// Returns the name of the document type. @@ -44,6 +45,9 @@ pub trait DocumentTypeV0Getters { /// Returns the documents mutable flag of the document type. fn documents_mutable(&self) -> bool; + /// Returns the documents transferable flag of the document type. + fn documents_transferable(&self) -> Transferable; + /// Returns the data contract id of the document type. fn data_contract_id(&self) -> Identifier; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 59b74046567..fbd57e3cb56 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -44,6 +44,7 @@ use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::{Identifier, Value}; +use crate::document::transfer::Transferable; const UNIQUE_INDEX_LIMIT_V0: usize = 16; const NOT_ALLOWED_SYSTEM_PROPERTIES: [&str; 1] = ["$id"]; @@ -209,6 +210,14 @@ impl DocumentTypeV0 { .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); + // Are documents of this type mutable? (Overrides contract value) + let documents_transferable_u8: u8 = + Value::inner_optional_integer_value(schema_map, "transferable") + .map_err(consensus_or_protocol_value_error)? + .unwrap_or_default(); + + let documents_transferable = documents_transferable_u8.try_into()?; + // Extract the properties let property_values = Value::inner_optional_index_map::( schema_map, @@ -491,6 +500,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_transferable, data_contract_id, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs index 3eda04234f7..1c8f53bb804 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs @@ -16,6 +16,7 @@ use crate::version::PlatformVersion; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::Identifier; use std::collections::BTreeMap; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl DocumentTypeV0 { /// Creates a document at the current time based on document type information @@ -136,7 +137,7 @@ impl DocumentTypeV0 { transferred_at_core_block_height.or(Some(core_block_height)); }; - let revision = if self.documents_mutable { + let revision = if self.requires_revision() { Some(INITIAL_REVISION) } else { None diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 394e1d3b144..dde3e2bc4f2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -19,6 +19,7 @@ use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::{Identifier, Value}; +use crate::document::transfer::Transferable; // TODO: Some of those methods are only for tests. Hide under feature pub trait DocumentTypeV0Methods { @@ -207,7 +208,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn initial_revision(&self) -> Option { - if self.documents_mutable { + if self.requires_revision() { Some(INITIAL_REVISION) } else { None @@ -215,7 +216,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn requires_revision(&self) -> bool { - self.documents_mutable + self.documents_mutable || self.documents_transferable != Transferable::Never } fn top_level_indices(&self) -> Vec<&IndexProperty> { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs index 00a384fce13..4d7c8ad5667 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs @@ -28,9 +28,15 @@ impl DocumentTypeV0 { Ok(bytes) } } - "$createdAt" | "$updatedAt" => DocumentPropertyType::encode_date_timestamp( + "$createdAt" | "$updatedAt" | "$transferredAt" => Ok(DocumentPropertyType::encode_date_timestamp( value.to_integer().map_err(ProtocolError::ValueError)?, - ), + )), + "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => Ok(DocumentPropertyType::encode_u64( + value.to_integer().map_err(ProtocolError::ValueError)?, + )), + "$createdAtCoreBlockHeight" | "$updatedAtCoreBlockHeight" | "$transferredAtCoreBlockHeight" => Ok(DocumentPropertyType::encode_u32( + value.to_integer().map_err(ProtocolError::ValueError)?, + )), _ => { let property = self.flattened_properties.get(key).ok_or_else(|| { DataContractError::DocumentTypeFieldNotFound(format!("expected contract to have field: {key}, contract fields are {} on document type {}", self.flattened_properties.keys().join(" | "), self.name)) diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index c544bfd62bd..e3a4003239b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -796,13 +796,13 @@ impl DocumentPropertyType { Ok(vec) } } - DocumentPropertyType::Date => DocumentPropertyType::encode_date_timestamp( + DocumentPropertyType::Date => Ok(DocumentPropertyType::encode_date_timestamp( value.to_integer().map_err(ProtocolError::ValueError)?, - ), + )), DocumentPropertyType::Integer => { let value_as_i64 = value.to_integer().map_err(ProtocolError::ValueError)?; - DocumentPropertyType::encode_signed_integer(value_as_i64) + Ok(DocumentPropertyType::encode_i64(value_as_i64)) } DocumentPropertyType::Number => Ok(Self::encode_float( value.to_float().map_err(ProtocolError::ValueError)?, @@ -915,11 +915,11 @@ impl DocumentPropertyType { } } - pub fn encode_date_timestamp(val: TimestampMillis) -> Result, ProtocolError> { - Self::encode_unsigned_integer(val) + pub fn encode_date_timestamp(val: TimestampMillis) -> Vec { + Self::encode_u64(val) } - pub fn encode_unsigned_integer(val: u64) -> Result, ProtocolError> { + pub fn encode_u64(val: u64) -> Vec { // Positive integers are represented in binary with the signed bit set to 0 // Negative integers are represented in 2's complement form @@ -941,10 +941,35 @@ impl DocumentPropertyType { // change was uniform across all elements wtr[0] ^= 0b1000_0000; - Ok(wtr) + wtr + } + + pub fn encode_u32(val: u32) -> Vec { + // Positive integers are represented in binary with the signed bit set to 0 + // Negative integers are represented in 2's complement form + + // Encode the integer in big endian form + // This ensures that most significant bits are compared first + // a bigger positive number would be greater than a smaller one + // and a bigger negative number would be greater than a smaller one + // maintains sort order for each domain + let mut wtr = vec![]; + wtr.write_u32::(val).unwrap(); + + // Flip the sign bit + // to deal with interaction between the domains + // 2's complement values have the sign bit set to 1 + // this makes them greater than the positive domain in terms of sort order + // to fix this, we just flip the sign bit + // so positive integers have the high bit and negative integers have the low bit + // the relative order of elements in each domain is still maintained, as the + // change was uniform across all elements + wtr[0] ^= 0b1000_0000; + + wtr } - pub fn encode_signed_integer(val: i64) -> Result, ProtocolError> { + pub fn encode_i64(val: i64) -> Vec { // Positive integers are represented in binary with the signed bit set to 0 // Negative integers are represented in 2's complement form @@ -966,7 +991,7 @@ impl DocumentPropertyType { // change was uniform across all elements wtr[0] ^= 0b1000_0000; - Ok(wtr) + wtr } pub fn encode_float(val: f64) -> Vec { diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index 015c50a8e81..7a44a9bf401 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -10,6 +10,7 @@ use crate::data_contract::storage_requirements::keys_for_document_type::StorageK use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; +use crate::document::transfer::Transferable; impl DocumentTypeV0Getters for DocumentTypeV0 { fn name(&self) -> &String { @@ -60,6 +61,11 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.documents_mutable } + fn documents_transferable(&self) -> Transferable { + self.documents_transferable + } + + fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index af892015ccb..56e3dc9b0e4 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -11,6 +11,7 @@ pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; use crate::identity::SecurityLevel; use platform_value::{Identifier, Value}; +use crate::document::transfer::Transferable; mod accessors; #[cfg(feature = "random-documents")] @@ -53,6 +54,8 @@ pub struct DocumentTypeV0 { pub(in crate::data_contract) documents_keep_history: bool, /// Are documents mutable? pub(in crate::data_contract) documents_mutable: bool, + /// Are documents mutable? + pub(in crate::data_contract) documents_transferable: Transferable, pub(in crate::data_contract) data_contract_id: Identifier, /// Encryption key storage requirements pub(in crate::data_contract) requires_identity_encryption_bounded_key: diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index f14f022e916..5a27b2b8481 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -23,6 +23,7 @@ use crate::ProtocolError; use platform_value::{Bytes32, Identifier}; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl CreateRandomDocument for DocumentTypeV0 { /// Creates a random Document using a seed if given, otherwise entropy. @@ -156,7 +157,7 @@ impl CreateRandomDocument for DocumentTypeV0 { }) .collect(); - let revision = if self.documents_mutable { + let revision = if self.requires_revision() { Some(1) } else { None diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 8b1c1841ad0..ad1913fbb0c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -117,6 +117,7 @@ use rand::Rng; use serde_json::json; use std::collections::BTreeSet; use std::ops::Range; +use crate::document::transfer::Transferable; impl DocumentTypeV0 { pub fn random_document_type( @@ -422,6 +423,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_transferable: Transferable::Never, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, @@ -585,6 +587,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_transferable: Transferable::Never, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, diff --git a/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs index 419d5ee6836..2bcaa11c271 100644 --- a/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs @@ -31,12 +31,47 @@ pub trait DocumentGetRawForDocumentTypeV0: DocumentV0Getters { "$createdAt" => { return Ok(self .created_at() - .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) + .map(DocumentPropertyType::encode_date_timestamp)) + } + "$createdAtBlockHeight" => { + return Ok(self + .created_at_block_height() + .map(DocumentPropertyType::encode_u64)) + } + "$createdAtCoreBlockHeight" => { + return Ok(self + .created_at_core_block_height() + .map(DocumentPropertyType::encode_u32)) } "$updatedAt" => { return Ok(self .updated_at() - .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) + .map(DocumentPropertyType::encode_date_timestamp)) + } + "$updatedAtBlockHeight" => { + return Ok(self + .updated_at_block_height() + .map(DocumentPropertyType::encode_u64)) + } + "$updatedAtCoreBlockHeight" => { + return Ok(self + .updated_at_core_block_height() + .map(DocumentPropertyType::encode_u32)) + } + "$transferredAt" => { + return Ok(self + .transferred_at() + .map(DocumentPropertyType::encode_date_timestamp)) + } + "$transferredAtBlockHeight" => { + return Ok(self + .transferred_at_block_height() + .map(DocumentPropertyType::encode_u64)) + } + "$transferredAtCoreBlockHeight" => { + return Ok(self + .transferred_at_core_block_height() + .map(DocumentPropertyType::encode_u32)) } _ => {} } diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index ad51973e5be..7dacb70845b 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -16,6 +16,7 @@ pub mod serialization_traits; #[cfg(feature = "factories")] pub mod specialized_document_factory; mod v0; +pub mod transfer; pub use accessors::*; pub use v0::*; diff --git a/packages/rs-dpp/src/document/transfer.rs b/packages/rs-dpp/src/document/transfer.rs new file mode 100644 index 00000000000..d42ae70634f --- /dev/null +++ b/packages/rs-dpp/src/document/transfer.rs @@ -0,0 +1,41 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::basic::data_contract::UnknownTransferableTypeError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; + +/// We made this enum because in the future we might have a case where documents are sometimes +/// transferable + +#[derive(Clone, Copy, Debug, PartialEq, Default)] +#[repr(u8)] +pub enum Transferable { + #[default] + Never = 0, + Always = 1, +} + +impl Transferable { + pub fn is_transferable(&self) -> bool { + match self { + Transferable::Never => false, + Transferable::Always => true, + } + } +} + +impl TryFrom for Transferable { + type Error = ProtocolError; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::Never), + 1 => Ok(Self::Always), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownTransferableTypeError( + UnknownTransferableTypeError::new(vec![0, 1, 3], value.into()), + )) + .into(), + )), + } + } +} \ No newline at end of file diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 18eed15035d..65ad96ade7a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -15,7 +15,7 @@ use crate::consensus::basic::data_contract::{ InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, - UnknownStorageKeyRequirementsError, + UnknownStorageKeyRequirementsError, UnknownTransferableTypeError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, @@ -90,6 +90,9 @@ pub enum BasicError { #[error(transparent)] UnknownStorageKeyRequirementsError(UnknownStorageKeyRequirementsError), + #[error(transparent)] + UnknownTransferableTypeError(UnknownTransferableTypeError), + #[error(transparent)] SerializedObjectParsingError(SerializedObjectParsingError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index e82ffc305e4..30fa795b1f3 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -22,6 +22,7 @@ mod undefined_index_property_error; mod unique_indices_limit_reached_error; mod unknown_security_level_error; mod unknown_storage_key_requirements_error; +mod unknown_transferable_type_error; pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; @@ -48,3 +49,4 @@ pub use unique_indices_limit_reached_error::*; pub use invalid_document_type_name_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; +pub use unknown_transferable_type_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs new file mode 100644 index 00000000000..543b729f56d --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( +Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( +"Unrecognized transferable type: allowed {:?}, got {}", +allowed_values, +received +)] +#[platform_serialize(unversioned)] +pub struct UnknownTransferableTypeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownTransferableTypeError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownTransferableTypeError) -> Self { + Self::BasicError(BasicError::UnknownTransferableTypeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index f585a5ecddf..07f19201fa5 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -90,6 +90,7 @@ impl ErrorWithCode for BasicError { Self::ContractError(DataContractError::InvalidURI(_)) => 10240, Self::ContractError(DataContractError::KeyWrongBounds(_)) => 10241, Self::ContractError(DataContractError::KeyValueMustExist(_)) => 10242, + Self::UnknownTransferableTypeError { .. } => 10243, // Document Errors: 10400-10499 Self::DataContractNotPresentError { .. } => 10400, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 190e9b0c13a..7b370ee8954 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -1,3 +1,4 @@ +use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] @@ -126,6 +127,52 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { } } + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + update_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_transfer_transition_from_document( + document, + document_type, + recipient_owner_id, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + update_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_replacement_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } + #[cfg(feature = "state-transition-signing")] fn new_document_deletion_transition_from_document( document: Document, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index 672685cbd69..8c48bce89cd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -67,6 +67,21 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 base_feature_version: Option, ) -> Result; + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result; + fn contract_based_security_level_requirement( &self, get_data_contract_security_level_requirement: impl Fn( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index a3818c01fbc..fc3d897656f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -1,3 +1,4 @@ +use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] @@ -16,9 +17,7 @@ use crate::state_transition::documents_batch_transition::accessors::DocumentsBat use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; +use crate::state_transition::documents_batch_transition::document_transition::{DocumentTransferTransition, DocumentTransition, DocumentTransitionV0Methods}; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; @@ -29,7 +28,6 @@ use crate::state_transition::StateTransition; use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::state_transition::documents_batch_transition::document_delete_transition::DocumentDeleteTransitionV0; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { fn transitions(&self) -> &Vec { @@ -122,6 +120,47 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let transfer_transition = DocumentTransferTransition::from_document( + document, + document_type, + identity_contract_nonce, + recipient_owner_id, + platform_version, + delete_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![transfer_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + #[cfg(feature = "state-transition-signing")] fn new_document_deletion_transition_from_document( document: Document, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs index ed3222d459b..cb8fbc2ca79 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs @@ -1,5 +1,11 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::validation::DataContractValidationMethodsV0; use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use crate::error::Error; @@ -8,6 +14,29 @@ pub(super) trait DocumentDeleteTransitionActionStructureValidationV0 { } impl DocumentDeleteTransitionActionStructureValidationV0 for DocumentDeleteTransitionAction { fn validate_structure_v0(&self) -> Result { - Ok(SimpleConsensusValidationResult::new()) + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + if !document_type.documents_mutable() { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is not mutable and not be deleted", + document_type_name + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs index 92807f5bdc1..5234e51de76 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs @@ -1,5 +1,6 @@ -use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::validation::DataContractValidationMethodsV0; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -23,14 +24,22 @@ impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTra let document_type_name = self.base().document_type_name(); // Make sure that the document type is defined in the contract - if data_contract - .document_type_optional_for_name(document_type_name) - .is_none() - { + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), )); + }; + + if !document_type.documents_mutable() { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is not mutable and not be updated", + document_type_name + )) + .into(), + )); } // Validate user defined properties diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs index 2eaada0c4fd..2571ff8b650 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -1,12 +1,15 @@ use dpp::block::epoch::Epoch; -use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; +use dpp::prelude::ConsensusValidationResult; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs index ec629492144..539a7f08485 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs @@ -1,5 +1,6 @@ -use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; @@ -22,13 +23,21 @@ impl DocumentTransferTransitionActionStructureValidationV0 for DocumentTransferT let document_type_name = self.base().document_type_name(); // Make sure that the document type is defined in the contract - if data_contract - .document_type_optional_for_name(document_type_name) - .is_none() - { - Ok(SimpleConsensusValidationResult::new_with_error( + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), + )); + }; + + if !document_type.documents_transferable().is_transferable() { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is not mutable and not be updated", + document_type_name + )) + .into(), )) } else { Ok(SimpleConsensusValidationResult::default()) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index f84d4f110d2..7c7803a6be1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -243,6 +243,7 @@ mod tests { CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; use dpp::document::document_methods::DocumentMethodsV0; + use dpp::document::transfer::Transferable; use dpp::document::DocumentV0Setters; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; @@ -251,6 +252,8 @@ mod tests { use dpp::serialization::PlatformSerializable; use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; + use drive::query::DriveQuery; use platform_version::version::PlatformVersion; use rand::prelude::StdRng; use rand::SeedableRng; @@ -588,6 +591,199 @@ mod tests { assert_eq!(processing_result.aggregated_fees().processing_fee, 102690); } + #[test] + fn test_document_replace_on_document_type_that_is_not_mutable_but_is_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key, _) = setup_identity(&mut platform, 958); + + let (receiver, _, _, _) = setup_identity(&mut platform, 452); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + document.set("attack", 6.into()); + document.set("defense", 0.into()); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + document, + card_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + #[test] fn test_document_replace_that_does_not_yet_exist() { let platform_version = PlatformVersion::latest(); @@ -1039,4 +1235,477 @@ mod tests { assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); } + + #[test] + fn test_document_transfer_on_document_type_that_is_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key, _) = setup_identity(&mut platform, 958); + + let (receiver, _, _, _) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5327760); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + } + + #[test] + fn test_document_transfer_on_document_type_that_is_not_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Never); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key, _) = setup_identity(&mut platform, 958); + + let (receiver, _, _, _) = setup_identity(&mut platform, 452); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_transfer_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } } diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index b3f7e70eea3..a3971dc066c 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -39,7 +39,12 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::MockCoreRPCLike; use crate::test::fixture::abci::static_system_identity_public_keys_v0; use crate::{config::PlatformConfig, rpc::core::DefaultCoreRPC}; +use dpp::block::block_info::BlockInfo; +use dpp::document::transfer::Transferable; +use dpp::prelude::DataContract; +use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; +use drive::drive::flags::StorageFlags; use tempfile::TempDir; /// A test platform builder. @@ -119,6 +124,37 @@ impl TempPlatform { self } + /// A function which adds the crypto card game to the state and returns it. + pub fn with_crypto_card_game(self, transferable: Transferable) -> (Self, DataContract) { + let card_game_path = match transferable { + Transferable::Never => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json", + Transferable::Always => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json", + }; + + let platform_version = self + .platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let card_game_contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + self.drive + .apply_contract( + &card_game_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + (self, card_game_contract) + } + /// Sets Platform to genesis state. pub fn set_genesis_state(self) -> Self { self.platform diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json new file mode 100644 index 00000000000..a312cb5cb15 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json @@ -0,0 +1,94 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "transferable": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + } + ], + "required": [ + "name", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json new file mode 100644 index 00000000000..0615249052c --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json @@ -0,0 +1,94 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": true, + "transferable": 0, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + } + ], + "required": [ + "name", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive/src/drive/defaults.rs b/packages/rs-drive/src/drive/defaults.rs index 8dc5e8385b2..730e90e027a 100644 --- a/packages/rs-drive/src/drive/defaults.rs +++ b/packages/rs-drive/src/drive/defaults.rs @@ -62,6 +62,17 @@ pub const DEFAULT_HASH_SIZE_U32: u32 = 32; pub const OPTIMIZED_DOCUMENT_REFERENCE: u16 = 34; // 1 + hops + DEFAULT_HASH_SIZE /// Default float size pub const DEFAULT_FLOAT_SIZE: u32 = 8; +/// u64 size +pub const U64_SIZE: u32 = 8; + +/// u64 size +pub const U64_SIZE_U8: u8 = 8; + +/// u32 size +pub const U32_SIZE: u32 = 4; + +/// u32 size +pub const U32_SIZE_U8: u8 = 4; /// Default float size as u16 pub const DEFAULT_FLOAT_SIZE_U16: u16 = 8; /// Default float size as u8 diff --git a/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs index 0cfc8f2c305..4958e68be68 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs @@ -142,7 +142,7 @@ impl Drive { drive_operations, drive_version, )?; - let encoded_time = DocumentPropertyType::encode_unsigned_integer(block_info.time_ms)?; + let encoded_time = DocumentPropertyType::encode_date_timestamp(block_info.time_ms); let path_key_element_info = match &document_and_contract_info .owned_document_info .document_info diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index f25f5aa302e..b718e1a3845 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -76,7 +76,7 @@ mod tests { use std::option::Option::None; use dpp::block::block_info::BlockInfo; - use rand::Rng; + use rand::{random, Rng}; use crate::common::setup_contract; use crate::drive::document::tests::setup_dashpay; @@ -201,7 +201,7 @@ mod tests { .document_type_for_name("contactRequest") .expect("expected to get document type"); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); let dashpay_cr_document = json_document_to_document( "tests/supporting_files/contract/dashpay/contact-request0.json", @@ -479,7 +479,7 @@ mod tests { Some(&db_transaction), ); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); let document_type = contract .document_type_for_name("contactRequest") @@ -553,7 +553,7 @@ mod tests { Some(&db_transaction), ); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); let document_type = contract .document_type_for_name("contactRequest") diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index f6decc23b65..cd94c9455d8 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -51,7 +51,7 @@ impl Drive { ) -> Result, Error> { let drive_version = &platform_version.drive; let mut batch_operations: Vec = vec![]; - if !document_and_contract_info.document_type.documents_mutable() { + if !document_and_contract_info.document_type.documents_mutable() && !document_and_contract_info.document_type.documents_transferable().is_transferable() { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "documents for this contract are not mutable", ))); @@ -195,7 +195,7 @@ impl Drive { .get_raw_for_document_type( &top_index_property.name, document_type, - owner_id, + None, // We want to use the old owner id None, platform_version, )? @@ -266,7 +266,7 @@ impl Drive { .get_raw_for_document_type( &index_property.name, document_type, - owner_id, + None, // We want to use the old owner_id None, platform_version, )? diff --git a/packages/rs-drive/src/drive/object_size_info/document_info.rs b/packages/rs-drive/src/drive/object_size_info/document_info.rs index 6e7eb209b2e..2494f39d065 100644 --- a/packages/rs-drive/src/drive/object_size_info/document_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/document_info.rs @@ -1,6 +1,4 @@ -use crate::drive::defaults::{ - DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, -}; +use crate::drive::defaults::{DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U8, U64_SIZE, U64_SIZE_U8}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DriveKeyInfo::{Key, KeySize}; use crate::drive::object_size_info::KeyValueInfo::{KeyRefRequest, KeyValueMaxSize}; @@ -177,11 +175,23 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { .to_vec(), max_size: DEFAULT_HASH_SIZE_U8, }))), - "$createdAt" | "$updatedAt" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + "$createdAt" | "$updatedAt" | "$transferredAt" => Ok(Some(KeySize(KeyInfo::MaxKeySize { unique_id: document_type .unique_id_for_document_field(index_level, base_event) .to_vec(), - max_size: DEFAULT_FLOAT_SIZE as u8, + max_size: U64_SIZE_U8, + }))), + "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + unique_id: document_type + .unique_id_for_document_field(index_level, base_event) + .to_vec(), + max_size: U64_SIZE_U8, + }))), + "$createdAtCoreBlockHeight" | "$updatedAtCoreBlockHeight" | "$transferredAtCoreBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + unique_id: document_type + .unique_id_for_document_field(index_level, base_event) + .to_vec(), + max_size: U32_SIZE_U8, }))), _ => { let property = diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 6b9f8ac2e71..c2929ddec3c 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -10,6 +10,7 @@ pub mod put_settings; pub mod top_up_identity; mod txid; pub mod withdraw_from_identity; +mod transfer_document; pub use context::*; diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs new file mode 100644 index 00000000000..92e9ca2b414 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -0,0 +1,170 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::sync::Arc; + +use crate::{Error, Sdk}; + +use crate::platform::block_info_from_metadata::block_info_from_metadata; +use crate::platform::transition::put_settings::PutSettings; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::DocumentType; +use dpp::data_contract::DataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; +use crate::platform::Identifier; + +#[async_trait::async_trait] +/// A trait for putting a document to platform +pub trait TransferDocument { + /// Transfers a document on platform + /// setting settings to `None` sets default connection behavior + async fn transfer_document_to_identity( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Puts an identity on platform and waits for the confirmation proof + async fn transfer_document_to_identity_and_wait_for_response( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl TransferDocument for Document { + async fn transfer_document_to_identity( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.owner_id(), + document_type.data_contract_id(), + true, + settings, + ) + .await?; + + let settings = settings.unwrap_or_default(); + + let transition = DocumentsBatchTransition::new_document_transfer_transition_from_document( + self.clone(), + document_type.as_ref(), + recipient_id, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let block_info = block_info_from_metadata(response.metadata()?)?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &block_info, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn transfer_document_to_identity_and_wait_for_response( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .transfer_document_to_identity( + recipient_id, + sdk, + document_type, + identity_public_key, + signer, + None, + ) + .await?; + + let document = + >::wait_for_response(self, sdk, state_transition, data_contract) + .await?; + + Ok(document) + } +} From a50894264127a71e6d699ab7bccdb9acdeb1e114 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 20 Apr 2024 23:55:25 +0700 Subject: [PATCH 07/65] fmt --- .../document_type/accessors/mod.rs | 2 +- .../document_type/accessors/v0/mod.rs | 2 +- .../class_methods/try_from_schema/v0/mod.rs | 1 - .../v0/mod.rs | 2 +- .../document_type/methods/mod.rs | 2 +- .../methods/serialize_value_for_key/v0/mod.rs | 20 ++++++++----- .../document_type/v0/accessors.rs | 3 +- .../src/data_contract/document_type/v0/mod.rs | 2 +- .../document_type/v0/random_document.rs | 6 ++-- .../document_type/v0/random_document_type.rs | 2 +- packages/rs-dpp/src/document/mod.rs | 2 +- packages/rs-dpp/src/document/transfer.rs | 8 ++--- .../unknown_transferable_type_error.rs | 8 ++--- .../documents_batch_transition/methods/mod.rs | 9 +++--- .../v0/v0_methods.rs | 27 +++++++++-------- .../structure_v0/mod.rs | 1 - .../state_v0/mod.rs | 5 +--- .../state_transitions/documents_batch/mod.rs | 30 +++++++++---------- .../documents_batch/transformer/v0/mod.rs | 6 ++-- .../v0/mod.rs | 7 ++++- .../drive/object_size_info/document_info.rs | 26 ++++++++++------ packages/rs-sdk/src/platform/transition.rs | 2 +- .../platform/transition/transfer_document.rs | 14 +++++---- packages/strategy-tests/src/lib.rs | 19 +++++------- .../src/errors/consensus/consensus_error.rs | 5 +++- 25 files changed, 114 insertions(+), 97 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index 58e43cd0fe6..3b4aef6b3c7 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -8,11 +8,11 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeMutRef, Docu use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; pub use v0::*; -use crate::document::transfer::Transferable; impl DocumentTypeV0Getters for DocumentType { fn name(&self) -> &String { diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index d57612d0092..b297b3dd9b1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -5,10 +5,10 @@ use crate::data_contract::document_type::property::DocumentProperty; use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; -use crate::document::transfer::Transferable; pub trait DocumentTypeV0Getters { /// Returns the name of the document type. diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index fbd57e3cb56..97dc67881d9 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -44,7 +44,6 @@ use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::{Identifier, Value}; -use crate::document::transfer::Transferable; const UNIQUE_INDEX_LIMIT_V0: usize = 16; const NOT_ALLOWED_SYSTEM_PROPERTIES: [&str; 1] = ["$id"]; diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs index 1c8f53bb804..d0ab0243e15 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs @@ -5,6 +5,7 @@ use chrono::Utc; use platform_value::Value; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, @@ -16,7 +17,6 @@ use crate::version::PlatformVersion; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::Identifier; use std::collections::BTreeMap; -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl DocumentTypeV0 { /// Creates a document at the current time based on document type information diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index dde3e2bc4f2..240e1d96681 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -18,8 +18,8 @@ use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::version::PlatformVersion; use crate::ProtocolError; -use platform_value::{Identifier, Value}; use crate::document::transfer::Transferable; +use platform_value::{Identifier, Value}; // TODO: Some of those methods are only for tests. Hide under feature pub trait DocumentTypeV0Methods { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs index 4d7c8ad5667..92890cb647a 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs @@ -28,13 +28,19 @@ impl DocumentTypeV0 { Ok(bytes) } } - "$createdAt" | "$updatedAt" | "$transferredAt" => Ok(DocumentPropertyType::encode_date_timestamp( - value.to_integer().map_err(ProtocolError::ValueError)?, - )), - "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => Ok(DocumentPropertyType::encode_u64( - value.to_integer().map_err(ProtocolError::ValueError)?, - )), - "$createdAtCoreBlockHeight" | "$updatedAtCoreBlockHeight" | "$transferredAtCoreBlockHeight" => Ok(DocumentPropertyType::encode_u32( + "$createdAt" | "$updatedAt" | "$transferredAt" => { + Ok(DocumentPropertyType::encode_date_timestamp( + value.to_integer().map_err(ProtocolError::ValueError)?, + )) + } + "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => { + Ok(DocumentPropertyType::encode_u64( + value.to_integer().map_err(ProtocolError::ValueError)?, + )) + } + "$createdAtCoreBlockHeight" + | "$updatedAtCoreBlockHeight" + | "$transferredAtCoreBlockHeight" => Ok(DocumentPropertyType::encode_u32( value.to_integer().map_err(ProtocolError::ValueError)?, )), _ => { diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index 7a44a9bf401..b3b875ba577 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -7,10 +7,10 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; -use crate::document::transfer::Transferable; impl DocumentTypeV0Getters for DocumentTypeV0 { fn name(&self) -> &String { @@ -65,7 +65,6 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.documents_transferable } - fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 56e3dc9b0e4..9f99f217a59 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -9,9 +9,9 @@ use crate::data_contract::storage_requirements::keys_for_document_type::StorageK #[cfg(feature = "validation")] pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use platform_value::{Identifier, Value}; -use crate::document::transfer::Transferable; mod accessors; #[cfg(feature = "random-documents")] diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 5a27b2b8481..078f61ded44 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -10,9 +10,10 @@ use crate::data_contract::document_type::random_document::{ use crate::data_contract::document_type::v0::DocumentTypeV0; use std::time::{SystemTime, UNIX_EPOCH}; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::document::property_names::{ - CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, - UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::{Document, DocumentV0}; use crate::identity::accessors::IdentityGettersV0; @@ -23,7 +24,6 @@ use crate::ProtocolError; use platform_value::{Bytes32, Identifier}; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl CreateRandomDocument for DocumentTypeV0 { /// Creates a random Document using a seed if given, otherwise entropy. diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index ad1913fbb0c..5a977161c45 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -104,6 +104,7 @@ use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; use crate::data_contract::document_type::{ v0::DocumentTypeV0, DocumentProperty, DocumentPropertyType, DocumentType, Index, }; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -117,7 +118,6 @@ use rand::Rng; use serde_json::json; use std::collections::BTreeSet; use std::ops::Range; -use crate::document::transfer::Transferable; impl DocumentTypeV0 { pub fn random_document_type( diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index 7dacb70845b..1fe74ad8ae6 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -15,8 +15,8 @@ pub mod generate_document_id; pub mod serialization_traits; #[cfg(feature = "factories")] pub mod specialized_document_factory; -mod v0; pub mod transfer; +mod v0; pub use accessors::*; pub use v0::*; diff --git a/packages/rs-dpp/src/document/transfer.rs b/packages/rs-dpp/src/document/transfer.rs index d42ae70634f..ea0615743cc 100644 --- a/packages/rs-dpp/src/document/transfer.rs +++ b/packages/rs-dpp/src/document/transfer.rs @@ -1,5 +1,5 @@ -use crate::consensus::basic::BasicError; use crate::consensus::basic::data_contract::UnknownTransferableTypeError; +use crate::consensus::basic::BasicError; use crate::consensus::ConsensusError; use crate::ProtocolError; @@ -9,7 +9,7 @@ use crate::ProtocolError; #[derive(Clone, Copy, Debug, PartialEq, Default)] #[repr(u8)] pub enum Transferable { - #[default] + #[default] Never = 0, Always = 1, } @@ -34,8 +34,8 @@ impl TryFrom for Transferable { ConsensusError::BasicError(BasicError::UnknownTransferableTypeError( UnknownTransferableTypeError::new(vec![0, 1, 3], value.into()), )) - .into(), + .into(), )), } } -} \ No newline at end of file +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs index 543b729f56d..0ed1a89d4cf 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs @@ -6,12 +6,12 @@ use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use thiserror::Error; #[derive( -Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] #[error( -"Unrecognized transferable type: allowed {:?}, got {}", -allowed_values, -received + "Unrecognized transferable type: allowed {:?}, got {}", + allowed_values, + received )] #[platform_serialize(unversioned)] pub struct UnknownTransferableTypeError { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 7b370ee8954..a897e78ad9c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -1,4 +1,3 @@ -use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] @@ -19,6 +18,7 @@ use crate::state_transition::documents_batch_transition::DocumentsBatchTransitio use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; @@ -165,8 +165,8 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { ), version => Err(ProtocolError::UnknownVersionMismatch { method: - "DocumentsBatchTransition::new_document_replacement_transition_from_document" - .to_string(), + "DocumentsBatchTransition::new_document_replacement_transition_from_document" + .to_string(), known_versions: vec![0], received: version, }), @@ -208,8 +208,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { )?, ), version => Err(ProtocolError::UnknownVersionMismatch { - method: - "DocumentsBatchTransition::new_document_deletion_transition_from_document" + method: "DocumentsBatchTransition::new_document_deletion_transition_from_document" .to_string(), known_versions: vec![0], received: version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index fc3d897656f..ef12d567f47 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -1,4 +1,3 @@ -use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] @@ -17,15 +16,20 @@ use crate::state_transition::documents_batch_transition::accessors::DocumentsBat use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; -use crate::state_transition::documents_batch_transition::document_transition::{DocumentTransferTransition, DocumentTransition, DocumentTransitionV0Methods}; +use crate::state_transition::documents_batch_transition::document_transition::{ + DocumentTransferTransition, DocumentTransition, DocumentTransitionV0Methods, +}; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::state_transition::documents_batch_transition::{DocumentDeleteTransition, DocumentsBatchTransitionV0}; +use crate::state_transition::documents_batch_transition::{ + DocumentDeleteTransition, DocumentsBatchTransitionV0, +}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; @@ -151,7 +155,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signature_public_key_id: 0, signature: Default::default(), } - .into(); + .into(); let mut state_transition: StateTransition = documents_batch_transition.into(); state_transition.sign_external( identity_public_key, @@ -184,13 +188,13 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { base_feature_version, )?; let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { - owner_id, - transitions: vec![delete_transition.into()], - user_fee_increase, - signature_public_key_id: 0, - signature: Default::default(), - } - .into(); + owner_id, + transitions: vec![delete_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); let mut state_transition: StateTransition = documents_batch_transition.into(); state_transition.sign_external( identity_public_key, @@ -200,7 +204,6 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } - fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs index cb8fbc2ca79..74b1a5e9632 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs @@ -1,7 +1,6 @@ use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::data_contract::validation::DataContractValidationMethodsV0; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs index 2571ff8b650..2eaada0c4fd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -1,15 +1,12 @@ use dpp::block::epoch::Epoch; -use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; -use dpp::prelude::ConsensusValidationResult; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 7c7803a6be1..aa701b348ab 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -263,7 +263,7 @@ mod tests { fn setup_identity( platform: &mut TempPlatform, seed: u64, - ) -> (Identity, SimpleSigner, IdentityPublicKey, Vec) { + ) -> (Identity, SimpleSigner, IdentityPublicKey) { let platform_version = PlatformVersion::latest(); let mut signer = SimpleSigner::default(); @@ -314,7 +314,7 @@ mod tests { ) .expect("expected to add a new identity"); - (identity, signer, critical_public_key, private_key) + (identity, signer, critical_public_key) } #[test] @@ -328,7 +328,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -461,7 +461,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let (other_identity, ..) = setup_identity(&mut platform, 495); @@ -603,9 +603,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, _) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); - let (receiver, _, _, _) = setup_identity(&mut platform, 452); + let (receiver, _, _) = setup_identity(&mut platform, 452); let card_document_type = contract .document_type_for_name("card") @@ -795,7 +795,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -884,7 +884,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -1017,7 +1017,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let (other_identity, ..) = setup_identity(&mut platform, 495); @@ -1158,7 +1158,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -1248,9 +1248,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, _) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); - let (receiver, _, _, _) = setup_identity(&mut platform, 450); + let (receiver, _, _) = setup_identity(&mut platform, 450); let card_document_type = contract .document_type_for_name("card") @@ -1441,9 +1441,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, _) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); - let (receiver, _, _, _) = setup_identity(&mut platform, 452); + let (receiver, _, _) = setup_identity(&mut platform, 452); let card_document_type = contract .document_type_for_name("card") @@ -1631,7 +1631,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key, private_key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 0e0de59cb97..07ae9b5e7e7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -4,9 +4,7 @@ use std::sync::Arc; use crate::error::Error; use crate::platform_types::platform::PlatformStateRef; -use dpp::consensus::basic::document::{ - DataContractNotPresentError, InvalidDocumentTransitionIdError, InvalidDocumentTypeError, -}; +use dpp::consensus::basic::document::{DataContractNotPresentError, InvalidDocumentTypeError}; use dpp::consensus::basic::BasicError; use dpp::consensus::state::document::document_not_found_error::DocumentNotFoundError; @@ -18,7 +16,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0Getters}; -use dpp::prelude::{Revision, UserFeeIncrease}; +use dpp::prelude::Revision; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index cd94c9455d8..a39199206f5 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -51,7 +51,12 @@ impl Drive { ) -> Result, Error> { let drive_version = &platform_version.drive; let mut batch_operations: Vec = vec![]; - if !document_and_contract_info.document_type.documents_mutable() && !document_and_contract_info.document_type.documents_transferable().is_transferable() { + if !document_and_contract_info.document_type.documents_mutable() + && !document_and_contract_info + .document_type + .documents_transferable() + .is_transferable() + { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "documents for this contract are not mutable", ))); diff --git a/packages/rs-drive/src/drive/object_size_info/document_info.rs b/packages/rs-drive/src/drive/object_size_info/document_info.rs index 2494f39d065..ee250888156 100644 --- a/packages/rs-drive/src/drive/object_size_info/document_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/document_info.rs @@ -1,4 +1,6 @@ -use crate::drive::defaults::{DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U8, U64_SIZE, U64_SIZE_U8}; +use crate::drive::defaults::{ + DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U8, U64_SIZE_U8, +}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DriveKeyInfo::{Key, KeySize}; use crate::drive::object_size_info::KeyValueInfo::{KeyRefRequest, KeyValueMaxSize}; @@ -175,19 +177,25 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { .to_vec(), max_size: DEFAULT_HASH_SIZE_U8, }))), - "$createdAt" | "$updatedAt" | "$transferredAt" => Ok(Some(KeySize(KeyInfo::MaxKeySize { - unique_id: document_type - .unique_id_for_document_field(index_level, base_event) - .to_vec(), - max_size: U64_SIZE_U8, - }))), - "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + "$createdAt" | "$updatedAt" | "$transferredAt" => { + Ok(Some(KeySize(KeyInfo::MaxKeySize { + unique_id: document_type + .unique_id_for_document_field(index_level, base_event) + .to_vec(), + max_size: U64_SIZE_U8, + }))) + } + "$createdAtBlockHeight" + | "$updatedAtBlockHeight" + | "$transferredAtBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { unique_id: document_type .unique_id_for_document_field(index_level, base_event) .to_vec(), max_size: U64_SIZE_U8, }))), - "$createdAtCoreBlockHeight" | "$updatedAtCoreBlockHeight" | "$transferredAtCoreBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + "$createdAtCoreBlockHeight" + | "$updatedAtCoreBlockHeight" + | "$transferredAtCoreBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { unique_id: document_type .unique_id_for_document_field(index_level, base_event) .to_vec(), diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index c2929ddec3c..8fc11eba4e2 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -8,9 +8,9 @@ pub mod put_document; pub mod put_identity; pub mod put_settings; pub mod top_up_identity; +mod transfer_document; mod txid; pub mod withdraw_from_identity; -mod transfer_document; pub use context::*; diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index 92e9ca2b414..6002a82ab62 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -5,6 +5,7 @@ use crate::{Error, Sdk}; use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::DocumentType; @@ -18,7 +19,6 @@ use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use drive::drive::Drive; use rs_dapi_client::{DapiRequest, RequestSettings}; -use crate::platform::Identifier; #[async_trait::async_trait] /// A trait for putting a document to platform @@ -160,10 +160,14 @@ impl TransferDocument for Document { None, ) .await?; - - let document = - >::wait_for_response(self, sdk, state_transition, data_contract) - .await?; + + let document = >::wait_for_response( + self, + sdk, + state_transition, + data_contract, + ) + .await?; Ok(document) } diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index f8d1d96439c..e841bda4ea7 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -946,19 +946,17 @@ impl Strategy { // Generate state transition for document replace operation OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionTransferRandom, - document_type, - contract, - }) => { + action: DocumentAction::DocumentActionTransferRandom, + document_type, + contract, + }) => { let mut items = document_query_callback( LocalDocumentQuery::RandomDocumentQuery(RandomDocumentQuery { data_contract: contract, document_type, }), ); - - items.retain(|item| !deleted.contains(&item.id())); items.retain(|item| !replaced.contains(&item.id())); @@ -982,10 +980,9 @@ impl Strategy { random_identity_id = current_identities[random_index + 1].id(); } } - transferred.push(document.id()); - + let request = IdentityKeysRequest { identity_id: document.owner_id().to_buffer(), request_type: KeyRequestType::SpecificKeys(vec![1]), @@ -1009,14 +1006,14 @@ impl Strategy { document_type_name: document_type.name().clone(), data_contract_id: contract.id(), } - .into(), + .into(), revision: document .revision() .expect("expected to unwrap revision") + 1, recipient_owner_id: random_identity_id, } - .into(); + .into(); let document_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { @@ -1026,7 +1023,7 @@ impl Strategy { signature_public_key_id: 1, signature: BinaryData::default(), } - .into(); + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 43fa867425f..c124b9f0ace 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -61,7 +61,7 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; -use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError}; +use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTransferableTypeError}; use dpp::consensus::basic::document::{MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; @@ -457,6 +457,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::DocumentTransitionsAreAbsentError(e) => { DocumentTransitionsAreAbsentErrorWasm::from(e).into() } + BasicError::UnknownTransferableTypeError(e) => { + generic_consensus_error!(UnknownTransferableTypeError, e).into() + } } } From b557e60ed4fa77675077c7f70b76344ba5331ae0 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 03:48:09 +0700 Subject: [PATCH 08/65] fixes --- .../dash/platform/dapi/v0/PlatformGrpc.java | 74 + .../platform/v0/nodejs/platform_pbjs.js | 1205 ++++++++++++++++ .../platform/v0/nodejs/platform_protoc.js | 1207 +++++++++++++++++ .../platform/v0/objective-c/Platform.pbobjc.h | 120 ++ .../platform/v0/objective-c/Platform.pbobjc.m | 312 +++++ .../platform/v0/objective-c/Platform.pbrpc.h | 13 + .../platform/v0/objective-c/Platform.pbrpc.m | 20 + .../platform/v0/python/platform_pb2.py | 276 +++- .../platform/v0/python/platform_pb2_grpc.py | 33 + .../clients/platform/v0/web/platform_pb.d.ts | 157 +++ .../clients/platform/v0/web/platform_pb.js | 1207 +++++++++++++++++ .../platform/v0/web/platform_pb_service.d.ts | 19 + .../platform/v0/web/platform_pb_service.js | 40 + .../src/document/extended_document/mod.rs | 2 +- .../documents_batch_transition/methods/mod.rs | 1 + .../v0/v0_methods.rs | 11 +- .../src/execution/check_tx/v0/mod.rs | 14 +- .../create_genesis_state/v0/mod.rs | 3 +- .../tests/strategy_tests/main.rs | 6 +- .../rs-drive/src/drive/document/delete/mod.rs | 10 +- .../rs-drive/src/drive/document/insert/mod.rs | 16 +- .../rs-drive/src/drive/document/update/mod.rs | 24 +- packages/rs-drive/tests/query_tests.rs | 39 +- .../rs-drive/tests/query_tests_history.rs | 6 +- ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74127 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24208 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74127 -> 0 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 24208 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74127 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24208 -> 0 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 24334 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 8822 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74127 -> 0 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 22308 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74127 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 8822 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 75593 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 8675 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19680 -> 0 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 1466578 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19680 -> 0 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 21163 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19680 -> 0 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 2668591 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19680 -> 0 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 2437697 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19680 -> 0 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 2425323 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 10626 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 18538 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 13401 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 14324 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 22136 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 22136 -> 0 bytes ...326bac5c6f9a7e376330066e2e0642706877c.json | Bin 28239 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 8203 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...106e5eda740be44679cc960ea35f2134af628.json | Bin 10871 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 10621 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 11302 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 10979 -> 0 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - 85 files changed, 4740 insertions(+), 100 deletions(-) delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-05T09:03:09.939170860Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:09.943356025Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.111047895Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:09.937048727Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-05T09:03:09.931783018Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.942621472Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.026404741Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-05T09:03:10.106807957Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-05T09:03:10.108039494Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json diff --git a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java index 282c9fa0db4..2b3a2bfdd19 100644 --- a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java +++ b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java @@ -635,6 +635,37 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoResponse> getGetEpochs return getGetEpochsInfoMethod; } + private static volatile io.grpc.MethodDescriptor getGetPathElementsMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getPathElements", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetPathElementsMethod() { + io.grpc.MethodDescriptor getGetPathElementsMethod; + if ((getGetPathElementsMethod = PlatformGrpc.getGetPathElementsMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetPathElementsMethod = PlatformGrpc.getGetPathElementsMethod) == null) { + PlatformGrpc.getGetPathElementsMethod = getGetPathElementsMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getPathElements")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getPathElements")) + .build(); + } + } + } + return getGetPathElementsMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -823,6 +854,13 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetEpochsInfoMethod(), responseObserver); } + /** + */ + public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPathElementsMethod(), responseObserver); + } + @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) .addMethod( @@ -965,6 +1003,13 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoResponse>( this, METHODID_GET_EPOCHS_INFO))) + .addMethod( + getGetPathElementsMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse>( + this, METHODID_GET_PATH_ELEMENTS))) .build(); } } @@ -1142,6 +1187,14 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs io.grpc.stub.ClientCalls.asyncUnaryCall( getChannel().newCall(getGetEpochsInfoMethod(), getCallOptions()), request, responseObserver); } + + /** + */ + public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetPathElementsMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -1297,6 +1350,13 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoResponse getEpo return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getGetEpochsInfoMethod(), getCallOptions(), request); } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetPathElementsMethod(), getCallOptions(), request); + } } /** @@ -1472,6 +1532,14 @@ public com.google.common.util.concurrent.ListenableFuture getPathElements( + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetPathElementsMethod(), getCallOptions()), request); + } } private static final int METHODID_BROADCAST_STATE_TRANSITION = 0; @@ -1494,6 +1562,7 @@ public com.google.common.util.concurrent.ListenableFuture implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -1592,6 +1661,10 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv serviceImpl.getEpochsInfo((org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_PATH_ELEMENTS: + serviceImpl.getPathElements((org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; default: throw new AssertionError(); } @@ -1673,6 +1746,7 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getGetProtocolVersionUpgradeStateMethod()) .addMethod(getGetProtocolVersionUpgradeVoteStatusMethod()) .addMethod(getGetEpochsInfoMethod()) + .addMethod(getGetPathElementsMethod()) .build(); } } diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index f14e6503e25..1b45c954814 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -746,6 +746,39 @@ $root.org = (function() { * @variation 2 */ + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getPathElements}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getPathElementsCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse} [response] GetPathElementsResponse + */ + + /** + * Calls getPathElements. + * @function getPathElements + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} request GetPathElementsRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getPathElementsCallback} callback Node-style callback called with the error, if any, and GetPathElementsResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getPathElements = function getPathElements(request, callback) { + return this.rpcCall(getPathElements, $root.org.dash.platform.dapi.v0.GetPathElementsRequest, $root.org.dash.platform.dapi.v0.GetPathElementsResponse, request, callback); + }, "name", { value: "getPathElements" }); + + /** + * Calls getPathElements. + * @function getPathElements + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} request GetPathElementsRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + return Platform; })(); @@ -26088,6 +26121,1178 @@ $root.org = (function() { return GetEpochsInfoResponse; })(); + v0.GetPathElementsRequest = (function() { + + /** + * Properties of a GetPathElementsRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetPathElementsRequest + * @property {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0|null} [v0] GetPathElementsRequest v0 + */ + + /** + * Constructs a new GetPathElementsRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetPathElementsRequest. + * @implements IGetPathElementsRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest=} [properties] Properties to set + */ + function GetPathElementsRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsRequest v0. + * @member {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @instance + */ + GetPathElementsRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetPathElementsRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @instance + */ + Object.defineProperty(GetPathElementsRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetPathElementsRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest instance + */ + GetPathElementsRequest.create = function create(properties) { + return new GetPathElementsRequest(properties); + }; + + /** + * Encodes the specified GetPathElementsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} message GetPathElementsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetPathElementsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} message GetPathElementsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetPathElementsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest + */ + GetPathElementsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetPathElementsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest} message GetPathElementsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetPathElementsRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetPathElementsRequest.GetPathElementsRequestV0 = (function() { + + /** + * Properties of a GetPathElementsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @interface IGetPathElementsRequestV0 + * @property {Array.|null} [path] GetPathElementsRequestV0 path + * @property {Array.|null} [keys] GetPathElementsRequestV0 keys + * @property {boolean|null} [prove] GetPathElementsRequestV0 prove + */ + + /** + * Constructs a new GetPathElementsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @classdesc Represents a GetPathElementsRequestV0. + * @implements IGetPathElementsRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0=} [properties] Properties to set + */ + function GetPathElementsRequestV0(properties) { + this.path = []; + this.keys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsRequestV0 path. + * @member {Array.} path + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + */ + GetPathElementsRequestV0.prototype.path = $util.emptyArray; + + /** + * GetPathElementsRequestV0 keys. + * @member {Array.} keys + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + */ + GetPathElementsRequestV0.prototype.keys = $util.emptyArray; + + /** + * GetPathElementsRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + */ + GetPathElementsRequestV0.prototype.prove = false; + + /** + * Creates a new GetPathElementsRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 instance + */ + GetPathElementsRequestV0.create = function create(properties) { + return new GetPathElementsRequestV0(properties); + }; + + /** + * Encodes the specified GetPathElementsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0} message GetPathElementsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.path != null && message.path.length) + for (var i = 0; i < message.path.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.path[i]); + if (message.keys != null && message.keys.length) + for (var i = 0; i < message.keys.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.keys[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetPathElementsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0} message GetPathElementsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.path && message.path.length)) + message.path = []; + message.path.push(reader.bytes()); + break; + case 2: + if (!(message.keys && message.keys.length)) + message.keys = []; + message.keys.push(reader.bytes()); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.path != null && message.hasOwnProperty("path")) { + if (!Array.isArray(message.path)) + return "path: array expected"; + for (var i = 0; i < message.path.length; ++i) + if (!(message.path[i] && typeof message.path[i].length === "number" || $util.isString(message.path[i]))) + return "path: buffer[] expected"; + } + if (message.keys != null && message.hasOwnProperty("keys")) { + if (!Array.isArray(message.keys)) + return "keys: array expected"; + for (var i = 0; i < message.keys.length; ++i) + if (!(message.keys[i] && typeof message.keys[i].length === "number" || $util.isString(message.keys[i]))) + return "keys: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetPathElementsRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 + */ + GetPathElementsRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0(); + if (object.path) { + if (!Array.isArray(object.path)) + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.path: array expected"); + message.path = []; + for (var i = 0; i < object.path.length; ++i) + if (typeof object.path[i] === "string") + $util.base64.decode(object.path[i], message.path[i] = $util.newBuffer($util.base64.length(object.path[i])), 0); + else if (object.path[i].length >= 0) + message.path[i] = object.path[i]; + } + if (object.keys) { + if (!Array.isArray(object.keys)) + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.keys: array expected"); + message.keys = []; + for (var i = 0; i < object.keys.length; ++i) + if (typeof object.keys[i] === "string") + $util.base64.decode(object.keys[i], message.keys[i] = $util.newBuffer($util.base64.length(object.keys[i])), 0); + else if (object.keys[i].length >= 0) + message.keys[i] = object.keys[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetPathElementsRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message GetPathElementsRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.path = []; + object.keys = []; + } + if (options.defaults) + object.prove = false; + if (message.path && message.path.length) { + object.path = []; + for (var j = 0; j < message.path.length; ++j) + object.path[j] = options.bytes === String ? $util.base64.encode(message.path[j], 0, message.path[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.path[j]) : message.path[j]; + } + if (message.keys && message.keys.length) { + object.keys = []; + for (var j = 0; j < message.keys.length; ++j) + object.keys[j] = options.bytes === String ? $util.base64.encode(message.keys[j], 0, message.keys[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.keys[j]) : message.keys[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetPathElementsRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetPathElementsRequestV0; + })(); + + return GetPathElementsRequest; + })(); + + v0.GetPathElementsResponse = (function() { + + /** + * Properties of a GetPathElementsResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetPathElementsResponse + * @property {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0|null} [v0] GetPathElementsResponse v0 + */ + + /** + * Constructs a new GetPathElementsResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetPathElementsResponse. + * @implements IGetPathElementsResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse=} [properties] Properties to set + */ + function GetPathElementsResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsResponse v0. + * @member {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @instance + */ + GetPathElementsResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetPathElementsResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @instance + */ + Object.defineProperty(GetPathElementsResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetPathElementsResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse instance + */ + GetPathElementsResponse.create = function create(properties) { + return new GetPathElementsResponse(properties); + }; + + /** + * Encodes the specified GetPathElementsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse} message GetPathElementsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetPathElementsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse} message GetPathElementsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetPathElementsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse + */ + GetPathElementsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetPathElementsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse} message GetPathElementsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetPathElementsResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetPathElementsResponse.GetPathElementsResponseV0 = (function() { + + /** + * Properties of a GetPathElementsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @interface IGetPathElementsResponseV0 + * @property {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements|null} [elements] GetPathElementsResponseV0 elements + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetPathElementsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetPathElementsResponseV0 metadata + */ + + /** + * Constructs a new GetPathElementsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @classdesc Represents a GetPathElementsResponseV0. + * @implements IGetPathElementsResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0=} [properties] Properties to set + */ + function GetPathElementsResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsResponseV0 elements. + * @member {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements|null|undefined} elements + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + GetPathElementsResponseV0.prototype.elements = null; + + /** + * GetPathElementsResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + GetPathElementsResponseV0.prototype.proof = null; + + /** + * GetPathElementsResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + GetPathElementsResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetPathElementsResponseV0 result. + * @member {"elements"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + Object.defineProperty(GetPathElementsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["elements", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetPathElementsResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 instance + */ + GetPathElementsResponseV0.create = function create(properties) { + return new GetPathElementsResponseV0(properties); + }; + + /** + * Encodes the specified GetPathElementsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0} message GetPathElementsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.elements != null && Object.hasOwnProperty.call(message, "elements")) + $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.encode(message.elements, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetPathElementsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0} message GetPathElementsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.elements = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.elements != null && message.hasOwnProperty("elements")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.verify(message.elements); + if (error) + return "elements." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetPathElementsResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 + */ + GetPathElementsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0(); + if (object.elements != null) { + if (typeof object.elements !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.elements: object expected"); + message.elements = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.fromObject(object.elements); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetPathElementsResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message GetPathElementsResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.elements != null && message.hasOwnProperty("elements")) { + object.elements = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(message.elements, options); + if (options.oneofs) + object.result = "elements"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetPathElementsResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetPathElementsResponseV0.Elements = (function() { + + /** + * Properties of an Elements. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @interface IElements + * @property {Array.|null} [elements] Elements elements + */ + + /** + * Constructs a new Elements. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @classdesc Represents an Elements. + * @implements IElements + * @constructor + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements=} [properties] Properties to set + */ + function Elements(properties) { + this.elements = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Elements elements. + * @member {Array.} elements + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @instance + */ + Elements.prototype.elements = $util.emptyArray; + + /** + * Creates a new Elements instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements instance + */ + Elements.create = function create(properties) { + return new Elements(properties); + }; + + /** + * Encodes the specified Elements message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements} message Elements message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Elements.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.elements != null && message.elements.length) + for (var i = 0; i < message.elements.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.elements[i]); + return writer; + }; + + /** + * Encodes the specified Elements message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements} message Elements message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Elements.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an Elements message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Elements.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.elements && message.elements.length)) + message.elements = []; + message.elements.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an Elements message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Elements.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an Elements message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Elements.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.elements != null && message.hasOwnProperty("elements")) { + if (!Array.isArray(message.elements)) + return "elements: array expected"; + for (var i = 0; i < message.elements.length; ++i) + if (!(message.elements[i] && typeof message.elements[i].length === "number" || $util.isString(message.elements[i]))) + return "elements: buffer[] expected"; + } + return null; + }; + + /** + * Creates an Elements message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements + */ + Elements.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements(); + if (object.elements) { + if (!Array.isArray(object.elements)) + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.elements: array expected"); + message.elements = []; + for (var i = 0; i < object.elements.length; ++i) + if (typeof object.elements[i] === "string") + $util.base64.decode(object.elements[i], message.elements[i] = $util.newBuffer($util.base64.length(object.elements[i])), 0); + else if (object.elements[i].length >= 0) + message.elements[i] = object.elements[i]; + } + return message; + }; + + /** + * Creates a plain object from an Elements message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message Elements + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Elements.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.elements = []; + if (message.elements && message.elements.length) { + object.elements = []; + for (var j = 0; j < message.elements.length; ++j) + object.elements[j] = options.bytes === String ? $util.base64.encode(message.elements[j], 0, message.elements[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.elements[j]) : message.elements[j]; + } + return object; + }; + + /** + * Converts this Elements to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @instance + * @returns {Object.} JSON object + */ + Elements.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Elements; + })(); + + return GetPathElementsResponseV0; + })(); + + return GetPathElementsResponse; + })(); + return v0; })(); diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index e7495b46c10..b30f67af848 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -145,6 +145,14 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse', null, { goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest', null, { proto }); @@ -2479,6 +2487,111 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements'; +} @@ -24886,4 +24999,1098 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function }; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + pathList: msg.getPathList_asB64(), + keysList: msg.getKeysList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addPath(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeys(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPathList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getKeysList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * repeated bytes path = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes path = 1; + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getPathList())); +}; + + +/** + * repeated bytes path = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getPathList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { + return this.setPathList([]); +}; + + +/** + * repeated bytes keys = 2; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes keys = 2; + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getKeysList())); +}; + + +/** + * repeated bytes keys = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getKeysList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { + return this.setKeysList([]); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetPathElementsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + ELEMENTS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); + msg.setElements(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElements(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { + var f, obj = { + elementsList: msg.getElementsList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addElements(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElementsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes elements = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes elements = 1; + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getElementsList())); +}; + + +/** + * repeated bytes elements = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getElementsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { + return this.setElementsList([]); +}; + + +/** + * optional Elements elements = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { + return this.setElements(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetPathElementsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + goog.object.extend(exports, proto.org.dash.platform.dapi.v0); diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index b4c0745c8bf..40fdb0a6eb5 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -76,6 +76,9 @@ CF_EXTERN_C_BEGIN @class GetIdentityNonceResponse_GetIdentityNonceResponseV0; @class GetIdentityRequest_GetIdentityRequestV0; @class GetIdentityResponse_GetIdentityResponseV0; +@class GetPathElementsRequest_GetPathElementsRequestV0; +@class GetPathElementsResponse_GetPathElementsResponseV0; +@class GetPathElementsResponse_GetPathElementsResponseV0_Elements; @class GetProofsRequest_GetProofsRequestV0; @class GetProofsRequest_GetProofsRequestV0_ContractRequest; @class GetProofsRequest_GetProofsRequestV0_DocumentRequest; @@ -2594,6 +2597,123 @@ GPB_FINAL @interface GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo : G @end +#pragma mark - GetPathElementsRequest + +typedef GPB_ENUM(GetPathElementsRequest_FieldNumber) { + GetPathElementsRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetPathElementsRequest_Version_OneOfCase) { + GetPathElementsRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetPathElementsRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetPathElementsRequest : GPBMessage + +@property(nonatomic, readonly) GetPathElementsRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetPathElementsRequest_GetPathElementsRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetPathElementsRequest_ClearVersionOneOfCase(GetPathElementsRequest *message); + +#pragma mark - GetPathElementsRequest_GetPathElementsRequestV0 + +typedef GPB_ENUM(GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber) { + GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_PathArray = 1, + GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_KeysArray = 2, + GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetPathElementsRequest_GetPathElementsRequestV0 : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *pathArray; +/** The number of items in @c pathArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger pathArray_Count; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *keysArray; +/** The number of items in @c keysArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger keysArray_Count; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetPathElementsResponse + +typedef GPB_ENUM(GetPathElementsResponse_FieldNumber) { + GetPathElementsResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetPathElementsResponse_Version_OneOfCase) { + GetPathElementsResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetPathElementsResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetPathElementsResponse : GPBMessage + +@property(nonatomic, readonly) GetPathElementsResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetPathElementsResponse_GetPathElementsResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetPathElementsResponse_ClearVersionOneOfCase(GetPathElementsResponse *message); + +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0 + +typedef GPB_ENUM(GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber) { + GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Elements = 1, + GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Proof = 2, + GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase) { + GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase_Elements = 1, + GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetPathElementsResponse_GetPathElementsResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetPathElementsResponse_GetPathElementsResponseV0_Elements *elements; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetPathElementsResponse_GetPathElementsResponseV0_ClearResultOneOfCase(GetPathElementsResponse_GetPathElementsResponseV0 *message); + +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0_Elements + +typedef GPB_ENUM(GetPathElementsResponse_GetPathElementsResponseV0_Elements_FieldNumber) { + GetPathElementsResponse_GetPathElementsResponseV0_Elements_FieldNumber_ElementsArray = 1, +}; + +GPB_FINAL @interface GetPathElementsResponse_GetPathElementsResponseV0_Elements : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *elementsArray; +/** The number of items in @c elementsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger elementsArray_Count; + +@end + NS_ASSUME_NONNULL_END CF_EXTERN_C_END diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index 35feedfec3b..f78cda64081 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -106,6 +106,11 @@ GPBObjCClassDeclaration(GetIdentityRequest_GetIdentityRequestV0); GPBObjCClassDeclaration(GetIdentityResponse); GPBObjCClassDeclaration(GetIdentityResponse_GetIdentityResponseV0); +GPBObjCClassDeclaration(GetPathElementsRequest); +GPBObjCClassDeclaration(GetPathElementsRequest_GetPathElementsRequestV0); +GPBObjCClassDeclaration(GetPathElementsResponse); +GPBObjCClassDeclaration(GetPathElementsResponse_GetPathElementsResponseV0); +GPBObjCClassDeclaration(GetPathElementsResponse_GetPathElementsResponseV0_Elements); GPBObjCClassDeclaration(GetProofsRequest); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_ContractRequest); @@ -7018,6 +7023,313 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - GetPathElementsRequest + +@implementation GetPathElementsRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetPathElementsRequest__storage_ { + uint32_t _has_storage_[2]; + GetPathElementsRequest_GetPathElementsRequestV0 *v0; +} GetPathElementsRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetPathElementsRequest_GetPathElementsRequestV0), + .number = GetPathElementsRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetPathElementsRequest_ClearVersionOneOfCase(GetPathElementsRequest *message) { + GPBDescriptor *descriptor = [GetPathElementsRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetPathElementsRequest_GetPathElementsRequestV0 + +@implementation GetPathElementsRequest_GetPathElementsRequestV0 + +@dynamic pathArray, pathArray_Count; +@dynamic keysArray, keysArray_Count; +@dynamic prove; + +typedef struct GetPathElementsRequest_GetPathElementsRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *pathArray; + NSMutableArray *keysArray; +} GetPathElementsRequest_GetPathElementsRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "pathArray", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_PathArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetPathElementsRequest_GetPathElementsRequestV0__storage_, pathArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "keysArray", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_KeysArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetPathElementsRequest_GetPathElementsRequestV0__storage_, keysArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_Prove, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsRequest_GetPathElementsRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsRequest_GetPathElementsRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetPathElementsRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetPathElementsResponse + +@implementation GetPathElementsResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetPathElementsResponse__storage_ { + uint32_t _has_storage_[2]; + GetPathElementsResponse_GetPathElementsResponseV0 *v0; +} GetPathElementsResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetPathElementsResponse_GetPathElementsResponseV0), + .number = GetPathElementsResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetPathElementsResponse_ClearVersionOneOfCase(GetPathElementsResponse *message) { + GPBDescriptor *descriptor = [GetPathElementsResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0 + +@implementation GetPathElementsResponse_GetPathElementsResponseV0 + +@dynamic resultOneOfCase; +@dynamic elements; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetPathElementsResponse_GetPathElementsResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetPathElementsResponse_GetPathElementsResponseV0_Elements *elements; + Proof *proof; + ResponseMetadata *metadata; +} GetPathElementsResponse_GetPathElementsResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "elements", + .dataTypeSpecific.clazz = GPBObjCClass(GetPathElementsResponse_GetPathElementsResponseV0_Elements), + .number = GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Elements, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0__storage_, elements), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsResponse_GetPathElementsResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsResponse_GetPathElementsResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetPathElementsResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetPathElementsResponse_GetPathElementsResponseV0_ClearResultOneOfCase(GetPathElementsResponse_GetPathElementsResponseV0 *message) { + GPBDescriptor *descriptor = [GetPathElementsResponse_GetPathElementsResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0_Elements + +@implementation GetPathElementsResponse_GetPathElementsResponseV0_Elements + +@dynamic elementsArray, elementsArray_Count; + +typedef struct GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *elementsArray; +} GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "elementsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsResponse_GetPathElementsResponseV0_Elements_FieldNumber_ElementsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_, elementsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsResponse_GetPathElementsResponseV0_Elements class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetPathElementsResponse_GetPathElementsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma clang diagnostic pop diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h index f3db6c60f33..1554fa906e5 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h @@ -46,6 +46,8 @@ @class GetIdentityNonceResponse; @class GetIdentityRequest; @class GetIdentityResponse; +@class GetPathElementsRequest; +@class GetPathElementsResponse; @class GetProofsRequest; @class GetProofsResponse; @class GetProtocolVersionUpgradeStateRequest; @@ -164,6 +166,10 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getEpochsInfoWithMessage:(GetEpochsInfoRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +#pragma mark getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse) + +- (GRPCUnaryProtoCall *)getPathElementsWithMessage:(GetPathElementsRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + @end /** @@ -312,6 +318,13 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetEpochsInfoWithRequest:(GetEpochsInfoRequest *)request handler:(void(^)(GetEpochsInfoResponse *_Nullable response, NSError *_Nullable error))handler; +#pragma mark getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse) + +- (void)getPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler; + + @end diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m index e4fe44abba1..72f06e7631c 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m @@ -470,5 +470,25 @@ - (GRPCUnaryProtoCall *)getEpochsInfoWithMessage:(GetEpochsInfoRequest *)message responseClass:[GetEpochsInfoResponse class]]; } +#pragma mark getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse) + +- (void)getPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetPathElementsWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getPathElements" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetPathElementsResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getPathElementsWithMessage:(GetPathElementsRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getPathElements" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetPathElementsResponse class]]; +} + @end #endif diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index 8348a045e77..b4602e02e9f 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -22,7 +22,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version2\xd5\x15\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version2\xcf\x16\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -4604,6 +4604,206 @@ serialized_end=15696, ) + +_GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0 = _descriptor.Descriptor( + name='GetPathElementsRequestV0', + full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.path', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='keys', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.keys', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=15815, + serialized_end=15884, +) + +_GETPATHELEMENTSREQUEST = _descriptor.Descriptor( + name='GetPathElementsRequest', + full_name='org.dash.platform.dapi.v0.GetPathElementsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=15699, + serialized_end=15895, +) + + +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS = _descriptor.Descriptor( + name='Elements', + full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='elements', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.elements', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=16268, + serialized_end=16296, +) + +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 = _descriptor.Descriptor( + name='GetPathElementsResponseV0', + full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='elements', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.elements', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=16018, + serialized_end=16306, +) + +_GETPATHELEMENTSRESPONSE = _descriptor.Descriptor( + name='GetPathElementsResponse', + full_name='org.dash.platform.dapi.v0.GetPathElementsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=15898, + serialized_end=16317, +) + _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST _GETIDENTITYREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0 _GETIDENTITYREQUEST.oneofs_by_name['version'].fields.append( @@ -5017,6 +5217,26 @@ _GETEPOCHSINFORESPONSE.oneofs_by_name['version'].fields.append( _GETEPOCHSINFORESPONSE.fields_by_name['v0']) _GETEPOCHSINFORESPONSE.fields_by_name['v0'].containing_oneof = _GETEPOCHSINFORESPONSE.oneofs_by_name['version'] +_GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0.containing_type = _GETPATHELEMENTSREQUEST +_GETPATHELEMENTSREQUEST.fields_by_name['v0'].message_type = _GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0 +_GETPATHELEMENTSREQUEST.oneofs_by_name['version'].fields.append( + _GETPATHELEMENTSREQUEST.fields_by_name['v0']) +_GETPATHELEMENTSREQUEST.fields_by_name['v0'].containing_oneof = _GETPATHELEMENTSREQUEST.oneofs_by_name['version'] +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS.containing_type = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['elements'].message_type = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.containing_type = _GETPATHELEMENTSRESPONSE +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['elements']) +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['elements'].containing_oneof = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'] +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['proof']) +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'] +_GETPATHELEMENTSRESPONSE.fields_by_name['v0'].message_type = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 +_GETPATHELEMENTSRESPONSE.oneofs_by_name['version'].fields.append( + _GETPATHELEMENTSRESPONSE.fields_by_name['v0']) +_GETPATHELEMENTSRESPONSE.fields_by_name['v0'].containing_oneof = _GETPATHELEMENTSRESPONSE.oneofs_by_name['version'] DESCRIPTOR.message_types_by_name['Proof'] = _PROOF DESCRIPTOR.message_types_by_name['ResponseMetadata'] = _RESPONSEMETADATA DESCRIPTOR.message_types_by_name['StateTransitionBroadcastError'] = _STATETRANSITIONBROADCASTERROR @@ -5065,6 +5285,8 @@ DESCRIPTOR.message_types_by_name['GetProtocolVersionUpgradeVoteStatusResponse'] = _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE DESCRIPTOR.message_types_by_name['GetEpochsInfoRequest'] = _GETEPOCHSINFOREQUEST DESCRIPTOR.message_types_by_name['GetEpochsInfoResponse'] = _GETEPOCHSINFORESPONSE +DESCRIPTOR.message_types_by_name['GetPathElementsRequest'] = _GETPATHELEMENTSREQUEST +DESCRIPTOR.message_types_by_name['GetPathElementsResponse'] = _GETPATHELEMENTSRESPONSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) Proof = _reflection.GeneratedProtocolMessageType('Proof', (_message.Message,), { @@ -5907,6 +6129,44 @@ _sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos) _sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo) +GetPathElementsRequest = _reflection.GeneratedProtocolMessageType('GetPathElementsRequest', (_message.Message,), { + + 'GetPathElementsRequestV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest) + }) +_sym_db.RegisterMessage(GetPathElementsRequest) +_sym_db.RegisterMessage(GetPathElementsRequest.GetPathElementsRequestV0) + +GetPathElementsResponse = _reflection.GeneratedProtocolMessageType('GetPathElementsResponse', (_message.Message,), { + + 'GetPathElementsResponseV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsResponseV0', (_message.Message,), { + + 'Elements' : _reflection.GeneratedProtocolMessageType('Elements', (_message.Message,), { + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse) + }) +_sym_db.RegisterMessage(GetPathElementsResponse) +_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0) +_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0.Elements) + _SEARCHKEY_PURPOSEMAPENTRY._options = None _SECURITYLEVELMAP_SECURITYLEVELMAPENTRY._options = None @@ -5918,8 +6178,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=15699, - serialized_end=18472, + serialized_start=16320, + serialized_end=19215, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', @@ -6121,6 +6381,16 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), + _descriptor.MethodDescriptor( + name='getPathElements', + full_name='org.dash.platform.dapi.v0.Platform.getPathElements', + index=20, + containing_service=None, + input_type=_GETPATHELEMENTSREQUEST, + output_type=_GETPATHELEMENTSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), ]) _sym_db.RegisterServiceDescriptor(_PLATFORM) diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py index 987135cb67b..e164f15e68d 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py @@ -114,6 +114,11 @@ def __init__(self, channel): request_serializer=platform__pb2.GetEpochsInfoRequest.SerializeToString, response_deserializer=platform__pb2.GetEpochsInfoResponse.FromString, ) + self.getPathElements = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getPathElements', + request_serializer=platform__pb2.GetPathElementsRequest.SerializeToString, + response_deserializer=platform__pb2.GetPathElementsResponse.FromString, + ) class PlatformServicer(object): @@ -239,6 +244,12 @@ def getEpochsInfo(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def getPathElements(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_PlatformServicer_to_server(servicer, server): rpc_method_handlers = { @@ -342,6 +353,11 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetEpochsInfoRequest.FromString, response_serializer=platform__pb2.GetEpochsInfoResponse.SerializeToString, ), + 'getPathElements': grpc.unary_unary_rpc_method_handler( + servicer.getPathElements, + request_deserializer=platform__pb2.GetPathElementsRequest.FromString, + response_serializer=platform__pb2.GetPathElementsResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'org.dash.platform.dapi.v0.Platform', rpc_method_handlers) @@ -691,3 +707,20 @@ def getEpochsInfo(request, platform__pb2.GetEpochsInfoResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getPathElements(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getPathElements', + platform__pb2.GetPathElementsRequest.SerializeToString, + platform__pb2.GetPathElementsResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 199db1f45e4..8e30e8127aa 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -3308,3 +3308,160 @@ export namespace GetEpochsInfoResponse { } } +export class GetPathElementsRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetPathElementsRequest.GetPathElementsRequestV0 | undefined; + setV0(value?: GetPathElementsRequest.GetPathElementsRequestV0): void; + + getVersionCase(): GetPathElementsRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsRequest): GetPathElementsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsRequest; + static deserializeBinaryFromReader(message: GetPathElementsRequest, reader: jspb.BinaryReader): GetPathElementsRequest; +} + +export namespace GetPathElementsRequest { + export type AsObject = { + v0?: GetPathElementsRequest.GetPathElementsRequestV0.AsObject, + } + + export class GetPathElementsRequestV0 extends jspb.Message { + clearPathList(): void; + getPathList(): Array; + getPathList_asU8(): Array; + getPathList_asB64(): Array; + setPathList(value: Array): void; + addPath(value: Uint8Array | string, index?: number): Uint8Array | string; + + clearKeysList(): void; + getKeysList(): Array; + getKeysList_asU8(): Array; + getKeysList_asB64(): Array; + setKeysList(value: Array): void; + addKeys(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsRequestV0): GetPathElementsRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsRequestV0; + static deserializeBinaryFromReader(message: GetPathElementsRequestV0, reader: jspb.BinaryReader): GetPathElementsRequestV0; + } + + export namespace GetPathElementsRequestV0 { + export type AsObject = { + pathList: Array, + keysList: Array, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetPathElementsResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetPathElementsResponse.GetPathElementsResponseV0 | undefined; + setV0(value?: GetPathElementsResponse.GetPathElementsResponseV0): void; + + getVersionCase(): GetPathElementsResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsResponse): GetPathElementsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsResponse; + static deserializeBinaryFromReader(message: GetPathElementsResponse, reader: jspb.BinaryReader): GetPathElementsResponse; +} + +export namespace GetPathElementsResponse { + export type AsObject = { + v0?: GetPathElementsResponse.GetPathElementsResponseV0.AsObject, + } + + export class GetPathElementsResponseV0 extends jspb.Message { + hasElements(): boolean; + clearElements(): void; + getElements(): GetPathElementsResponse.GetPathElementsResponseV0.Elements | undefined; + setElements(value?: GetPathElementsResponse.GetPathElementsResponseV0.Elements): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetPathElementsResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsResponseV0): GetPathElementsResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsResponseV0; + static deserializeBinaryFromReader(message: GetPathElementsResponseV0, reader: jspb.BinaryReader): GetPathElementsResponseV0; + } + + export namespace GetPathElementsResponseV0 { + export type AsObject = { + elements?: GetPathElementsResponse.GetPathElementsResponseV0.Elements.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class Elements extends jspb.Message { + clearElementsList(): void; + getElementsList(): Array; + getElementsList_asU8(): Array; + getElementsList_asB64(): Array; + setElementsList(value: Array): void; + addElements(value: Uint8Array | string, index?: number): Uint8Array | string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Elements.AsObject; + static toObject(includeInstance: boolean, msg: Elements): Elements.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Elements, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Elements; + static deserializeBinaryFromReader(message: Elements, reader: jspb.BinaryReader): Elements; + } + + export namespace Elements { + export type AsObject = { + elementsList: Array, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + ELEMENTS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index e7495b46c10..b30f67af848 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -145,6 +145,14 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse', null, { goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest', null, { proto }); @@ -2479,6 +2487,111 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements'; +} @@ -24886,4 +24999,1098 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function }; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + pathList: msg.getPathList_asB64(), + keysList: msg.getKeysList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addPath(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeys(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPathList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getKeysList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * repeated bytes path = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes path = 1; + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getPathList())); +}; + + +/** + * repeated bytes path = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getPathList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { + return this.setPathList([]); +}; + + +/** + * repeated bytes keys = 2; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes keys = 2; + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getKeysList())); +}; + + +/** + * repeated bytes keys = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getKeysList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { + return this.setKeysList([]); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetPathElementsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + ELEMENTS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); + msg.setElements(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElements(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { + var f, obj = { + elementsList: msg.getElementsList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addElements(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElementsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes elements = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes elements = 1; + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getElementsList())); +}; + + +/** + * repeated bytes elements = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getElementsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { + return this.setElementsList([]); +}; + + +/** + * optional Elements elements = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { + return this.setElements(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetPathElementsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + goog.object.extend(exports, proto.org.dash.platform.dapi.v0); diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts index 5af3ea8e8f5..798657ea3e8 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts @@ -184,6 +184,15 @@ type PlatformgetEpochsInfo = { readonly responseType: typeof platform_pb.GetEpochsInfoResponse; }; +type PlatformgetPathElements = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetPathElementsRequest; + readonly responseType: typeof platform_pb.GetPathElementsResponse; +}; + export class Platform { static readonly serviceName: string; static readonly broadcastStateTransition: PlatformbroadcastStateTransition; @@ -206,6 +215,7 @@ export class Platform { static readonly getProtocolVersionUpgradeState: PlatformgetProtocolVersionUpgradeState; static readonly getProtocolVersionUpgradeVoteStatus: PlatformgetProtocolVersionUpgradeVoteStatus; static readonly getEpochsInfo: PlatformgetEpochsInfo; + static readonly getPathElements: PlatformgetPathElements; } export type ServiceError = { message: string, code: number; metadata: grpc.Metadata } @@ -420,5 +430,14 @@ export class PlatformClient { requestMessage: platform_pb.GetEpochsInfoRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetEpochsInfoResponse|null) => void ): UnaryResponse; + getPathElements( + requestMessage: platform_pb.GetPathElementsRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetPathElementsResponse|null) => void + ): UnaryResponse; + getPathElements( + requestMessage: platform_pb.GetPathElementsRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetPathElementsResponse|null) => void + ): UnaryResponse; } diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js index 1d5d8278dc8..f6dc9299691 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js @@ -190,6 +190,15 @@ Platform.getEpochsInfo = { responseType: platform_pb.GetEpochsInfoResponse }; +Platform.getPathElements = { + methodName: "getPathElements", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetPathElementsRequest, + responseType: platform_pb.GetPathElementsResponse +}; + exports.Platform = Platform; function PlatformClient(serviceHost, options) { @@ -817,5 +826,36 @@ PlatformClient.prototype.getEpochsInfo = function getEpochsInfo(requestMessage, }; }; +PlatformClient.prototype.getPathElements = function getPathElements(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getPathElements, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + exports.PlatformClient = PlatformClient; diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index 17ba5312bbd..ae9e23e6069 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -549,7 +549,7 @@ mod test { let string = serde_json::to_string(&document)?; assert_eq!( - "{\"version\":0,\"$type\":\"domain\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"document\":{\"$version\":\"0\",\"$id\":\"4veLBZPHDkaCPF9LfZ8fX3JZiS5q5iUVGhdBbaa9ga5E\",\"$ownerId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"$protocolVersion\":0,\"$type\":\"domain\",\"label\":\"user-9999\",\"normalizedLabel\":\"user-9999\",\"normalizedParentDomainName\":\"dash\",\"preorderSalt\":\"BzQi567XVqc8wYiVHS887sJtL6MDbxLHNnp+UpTFSB0=\",\"records\":{\"dashUniqueIdentityId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\"},\"subdomainRules\":{\"allowSubdomains\":false},\"$revision\":1,\"$createdAt\":null,\"$updatedAt\":null,\"$createdAtBlockHeight\":null,\"$updatedAtBlockHeight\":null,\"$createdAtCoreBlockHeight\":null,\"$updatedAtCoreBlockHeight\":null}}", + "{\"version\":0,\"$type\":\"domain\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"document\":{\"$version\":\"0\",\"$id\":\"4veLBZPHDkaCPF9LfZ8fX3JZiS5q5iUVGhdBbaa9ga5E\",\"$ownerId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"$protocolVersion\":0,\"$type\":\"domain\",\"label\":\"user-9999\",\"normalizedLabel\":\"user-9999\",\"normalizedParentDomainName\":\"dash\",\"preorderSalt\":\"BzQi567XVqc8wYiVHS887sJtL6MDbxLHNnp+UpTFSB0=\",\"records\":{\"dashUniqueIdentityId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\"},\"subdomainRules\":{\"allowSubdomains\":false},\"$revision\":1,\"$createdAt\":null,\"$updatedAt\":null,\"$transferredAt\":null,\"$createdAtBlockHeight\":null,\"$updatedAtBlockHeight\":null,\"$transferredAtBlockHeight\":null,\"$createdAtCoreBlockHeight\":null,\"$updatedAtCoreBlockHeight\":null,\"$transferredAtCoreBlockHeight\":null}}", string ); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index a897e78ad9c..27ae53c2a0a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -18,6 +18,7 @@ use crate::state_transition::documents_batch_transition::DocumentsBatchTransitio use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index ef12d567f47..d934f63a7b1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -15,20 +15,23 @@ use crate::state_transition::documents_batch_transition::accessors::DocumentsBat #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransferTransition, DocumentTransition, DocumentTransitionV0Methods, + DocumentReplaceTransition, DocumentTransferTransition +}; +use crate::state_transition::documents_batch_transition::document_transition::{ + DocumentTransition, DocumentTransitionV0Methods, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; +use crate::state_transition::documents_batch_transition::{DocumentDeleteTransition, DocumentsBatchTransition}; use crate::state_transition::documents_batch_transition::{ - DocumentDeleteTransition, DocumentsBatchTransitionV0, + DocumentsBatchTransitionV0, }; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index abc802ffef1..1bd5aff5212 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -434,7 +434,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); let check_result = platform .check_tx( @@ -625,7 +625,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 909500); + assert_eq!(processing_result.aggregated_fees().processing_fee, 909510); let check_result = platform .check_tx( @@ -767,7 +767,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2970480 * 2 + 2978520 * 2 ); let check_result = platform @@ -1005,7 +1005,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); platform .drive @@ -1089,7 +1089,7 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 7066460 + 7098500 ); let check_result = platform @@ -1201,7 +1201,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); platform .drive @@ -1320,7 +1320,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1231110); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1231120); let check_result = platform .check_tx( diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 0b4bea3c2eb..da357ec0ec1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -317,8 +317,7 @@ mod tests { assert_eq!( root_hash, [ - 145, 134, 225, 227, 181, 246, 225, 73, 216, 216, 249, 73, 21, 213, 116, 110, - 85, 106, 80, 222, 95, 167, 97, 242, 69, 142, 176, 211, 89, 182, 162, 67 + 123, 106, 97, 8, 95, 223, 24, 44, 147, 229, 106, 103, 31, 32, 29, 97, 198, 204, 237, 215, 138, 194, 34, 107, 129, 234, 97, 250, 155, 104, 75, 210 ] ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 67f53195fef..fe40692b299 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1088,7 +1088,7 @@ mod tests { .unwrap() .unwrap() ), - "5dda9668d6efe6a481ec1d7ce3a1a77785aace12a853bea7eedcf37e9c5f8374".to_string() + "547963a6f85f531173493bc145bdec8796bfd4d61240ef108c3a2644175939eb".to_string() ) } @@ -1777,7 +1777,7 @@ mod tests { .unwrap() .unwrap() ), - "909c3c0655fcb31a992899a1d2af59a8847f72126db56140ca91ac9591561ebe".to_string() + "b46905d816d6c39e3f18c17725a6961e845f82feff5a4b7d8dc7955a33506bb3".to_string() ) } @@ -1902,7 +1902,7 @@ mod tests { .unwrap() .unwrap() ), - "58b6ae6a0468cb62d1947362cf92915ae046027a0501d808caa7bdcd2a23a10c".to_string() + "0e99bbeba931c57ed4bc8ad813da9879da7188bc5193190480d7538ce7977692".to_string() ) } diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 04b30f9c9cf..6fe049c5ffe 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -836,8 +836,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - // We added 1558 bytes - assert_eq!(added_bytes, 1558); + // We added 1559 bytes + assert_eq!(added_bytes, 1559); let document_id = bs58::decode("AM47xnyLfTAC9f61ZQPGfMK5Datk2FeYZwgYvcAnzqFY") .into_vec() @@ -866,14 +866,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 41854792); + assert_eq!(*removed_credits, 41881536); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 1550); // we refunded 1550 instead of 1558 + assert_eq!(refund_equivalent_bytes, 1551); // we refunded 1551 instead of 1559 } #[test] @@ -933,7 +933,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); // We added 1558 bytes - assert_eq!(added_bytes, 1558); + assert_eq!(added_bytes, 1559); let document_id = bs58::decode("AM47xnyLfTAC9f61ZQPGfMK5Datk2FeYZwgYvcAnzqFY") .into_vec() diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index b718e1a3845..03e8979c844 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -328,11 +328,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 3057 + storage_fee: 3058 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2316870, + processing_fee: 2317270, ..Default::default() } ); @@ -391,11 +391,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 1304 + storage_fee: 1305 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 1481610, + processing_fee: 1482010, ..Default::default() } ); @@ -460,8 +460,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - assert_eq!(1304, added_bytes); - assert_eq!(142936400, processing_fee); + assert_eq!(1305, added_bytes); + assert_eq!(142936800, processing_fee); } #[test] @@ -683,11 +683,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 1760 + storage_fee: 1761 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2068990, + processing_fee: 2069390, ..Default::default() } ); diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index ff5c43a0e8c..f8090d3b037 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -906,7 +906,7 @@ mod tests { .serialize_consume(document_type, platform_version) .expect("expected to serialize document"); - assert_eq!(document_serialized.len(), 119); + assert_eq!(document_serialized.len(), 120); let original_fees = apply_person( &drive, &contract, @@ -924,7 +924,7 @@ mod tests { //Explanation for 1237 //todo - 1237 + 1238 } else { //Explanation for 959 @@ -1059,7 +1059,7 @@ mod tests { //// 359 + 179 + 145 + 278 - 961 + 962 }; assert_eq!(original_bytes, expected_added_bytes); @@ -1082,14 +1082,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 25913567); + assert_eq!(*removed_credits, 25940733); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(expected_added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 959); // we refunded 959 instead of 962 + assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 963 // let's re-add it again let original_fees = apply_person( @@ -1127,7 +1127,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 312 } else { 1 }; + let expected_added_bytes = if using_history { 313 } else { 1 }; assert_eq!(added_bytes, expected_added_bytes); } @@ -1197,7 +1197,7 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 1237 } else { 961 }; + let expected_added_bytes = if using_history { 1238 } else { 962 }; assert_eq!(original_bytes, expected_added_bytes); if !using_history { // let's delete it, just to make sure everything is working. @@ -1217,14 +1217,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 25913567); + assert_eq!(*removed_credits, 25940733); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(expected_added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 959); // we refunded 959 instead of 1011 + assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 1012 // let's re-add it again let original_fees = apply_person( @@ -1395,7 +1395,7 @@ mod tests { //Explanation for 1237 //todo - 1237 + 1238 } else { //Explanation for 959 @@ -1530,7 +1530,7 @@ mod tests { // 360 + 179 + 145 + 278 = 960 - 961 + 962 }; assert_eq!(original_bytes, expected_added_bytes); @@ -1551,7 +1551,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 1238 } else { 962 }; + let expected_added_bytes = if using_history { 1239 } else { 963 }; assert_eq!(added_bytes, expected_added_bytes); } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 41d95be2a67..136311c6e9f 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,8 +993,7 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, - 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2305,8 +2304,7 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 173, 209, 205, 148, 17, 96, 43, 47, 195, 124, 81, 242, 237, 221, 130, 189, 203, 158, - 19, 6, 217, 19, 231, 186, 70, 66, 1, 105, 7, 78, 245, 63, + 60, 109, 98, 63, 192, 76, 21, 51, 95, 13, 145, 173, 155, 30, 5, 194, 221, 33, 152, 195, 108, 127, 146, 37, 82, 5, 166, 38, 67, 162, 1, 83, ], ); } @@ -2452,8 +2450,7 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, - 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2894,8 +2891,7 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 181, 187, 251, 87, 13, 132, 222, 134, 83, 231, 5, 226, 79, 212, 220, 50, 123, 224, 81, 128, - 27, 149, 15, 194, 46, 48, 208, 157, 77, 175, 92, 246, + 124, 137, 76, 15, 82, 78, 62, 179, 206, 204, 2, 84, 187, 107, 28, 121, 186, 221, 98, 66, 187, 78, 66, 70, 54, 10, 193, 108, 39, 59, 195, 209, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3017,8 +3013,7 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, - 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3166,8 +3161,7 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3718,8 +3712,7 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3812,8 +3805,7 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3906,8 +3898,7 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4000,8 +3991,7 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4192,8 +4182,7 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, - 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4393,8 +4382,7 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, - 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4598,8 +4586,7 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, - 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 97e427d4e34..cafbc6cee40 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,8 +291,7 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 181, 185, 108, 50, 217, 141, 128, 232, 165, 226, 95, 0, 177, 127, 230, 52, 238, 131, - 107, 59, 237, 63, 184, 244, 2, 66, 114, 195, 97, 175, 252, 209, + 54, 217, 155, 152, 174, 237, 193, 15, 240, 181, 31, 17, 238, 127, 246, 92, 20, 222, 37, 39, 104, 146, 240, 98, 159, 130, 29, 227, 5, 94, 69, 207, ] ); @@ -1655,8 +1654,7 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 25, 175, 56, 55, 43, 121, 224, 243, 179, 106, 24, 41, 94, 74, 167, 144, 67, 125, 213, - 119, 247, 9, 237, 191, 50, 90, 22, 115, 131, 152, 246, 102 + 117, 239, 44, 103, 118, 107, 30, 109, 225, 15, 234, 90, 59, 0, 22, 79, 32, 4, 94, 225, 241, 206, 146, 22, 138, 217, 87, 208, 96, 176, 216, 114 ] ); } diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 98922ba3d4296d8ef41369823a16b2eae2884878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74127 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 diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json deleted file mode 100644 index 87582b1e2c724f2211b4951ee80540c2927e4315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24208 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 diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json deleted file mode 100644 index 38bcd780ce0ba9e792ac4dc8de726573e2c8d6d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24208 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 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json deleted file mode 100644 index 87582b1e2c724f2211b4951ee80540c2927e4315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24208 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 diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json deleted file mode 100644 index 06f054a87593acc42f78bf2f208b14917cc4aec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8822 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 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json deleted file mode 100644 index dfc7bbef9a7c6c5fc3f948cb1539f40249a2ecc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22308 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 M{2P8W{NR^=0He{Vb^rhX diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-05T09:03:09.931783018Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-05T09:03:09.931783018Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 98922ba3d4296d8ef41369823a16b2eae2884878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74127 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 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json deleted file mode 100644 index 49547581439eca3349b1340469e182008f395811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8822 zcmeI2%Wm695JhM0uQ0gIg17jdUl|MtMPe)=mg$kG0E58)K5SWX#B*(UljUULn2+wR z$E~VcMgP3Jzt4UQhvRO1%Kp6nIbWt5`P=XF)owFi{dInlp6bj0zy5wZTx|OH)wtR7 zVf-=7hMx|n;r#Gr{`qqEa`(qw^3rEc+Yi%fvzk^nj+_^5huy<=n(t+0TV~g@<_GKX zF!bx~YWLJXj_dEkrhj`?OIhCdDFD&q}vl_eWr0e zKK8%Rc7vqs_3Sg$vd!wa-LIx0iL!d^t2(<_=jD24b{LMQ$E3(BVv|3T#l~-oTl39_ zWX8?c{`&A2j^V>}SzY%}7Yn4HFUuQ&-+R7XT`w<-8zY_<2TrT`0yb!u`;~Y-?0_T88ih$IS^9Hwwz#i=lw34M7XjrlDga1yJ>)MS4bH-51s~UT11m&}o4OK~L;<4`eFjIOkw6i>7^VoY zSHY+?o~wb3Er2F^i28-O7SxIzu}wlHq-hHVM8BCx>X zUNxm)jPVSnI|E428xhz;OuzwThoFdRI8aPBk@JuiK5L+9i8B}p=8hU3RSU7jEjoyx z3NomI5Mkj|*r_x{OXyK^L+{eZmNhK^bDY3{bXbW(`kv6-JlYYvbUEvX+*CNjDuxJ6 zPk-hyI^D7nYmAsOt;&cVVyR?+D2Hau3=onSvfRVUW&T@2M&{1tb4X_u0ODDlvM}I= z46K|xmIgrFu!IrxbdDR$YX(qSnJHf;6q6}mARL*)Y)AT~L*xcon;Mvs&YL+-d zq_pxkn5;?VC=~-FSVCkJ7l`QS{{k{t*w)mmB`d%S+))*5Yh{g?3j(5n)UsqvQYms9 z<`R7t>mgW%AQJQrGPn+gV#DH$fCLTBlT{#yXbjIv5~DSOI5vzCQY{if2O%Oy$*N!| z5;`+1+c3tSD1s9s#{;B>(3TJkq-3&|ISuA4#MT=qbz^GI&VvSieg<->|MX9z4O%vcQVU?R30 z2(4;Fs*&N20AvniBn2&v4Vc$i*V&|bQ`TI@lxYU_HpopE**~Z8aN76Vd9XPTD3>!x z#5Wl$?82svnLa*EG1gTWb3>Z*j6>E;1d396!U5_nZrCa|u!}KRvHp<17z-m$ho!@0 zqOEP3L-xr!&6GHEt`8w|+&w(4rqdyP16Tq^3`WiqNLg$m0m#WT%>e;RA&hsHN^u6u zMpMlGET$qk6s<{iXyYL#y{4DD6uHupDLW1^7z`CQ*fM`G{i+4p;SPJB<=ZB@mfV&V zAr5&n<}hpr)37 qQOK;5A!Pae&El$TKO`#`emnj9oal=3`t8m1R}1Oi>;IR(VfYV~J=x*_ diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json deleted file mode 100644 index 296425f4a80b663656a9f43a28d216b1b71346ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75593 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 Q`{BRd|NHcxZ|}YRGk`kT761SM diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json deleted file mode 100644 index 95b1bc2dbf532ab958f903f63d56529a98b9de6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8675 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 b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json deleted file mode 100644 index b7fc5cddcfcf48226c6983ee733f50114cb83130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466578 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 b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json deleted file mode 100644 index ecd0a4b4edca39f3607643a964f3dcc5b38820dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21163 zcmd7a-ELIL6^7v)a}~(PIq)j~bUU{aMV1FVV8!5xZAOYl+*RPL$zP^9Bx%+tZm)F1SF83cCfB*mP>f!O~{_*nqr@J@rcOQTJ zbbI^fFOThRy}A4J@p1RzeE;O?;m!5Ow>KZ(?LPhS>h|IK`<H5q2 zpLc(Me)aj)pI+^!eMyQB*N<0kuO6>=_Zet&c}$EQ!8{I;;;C!amue7L^+@US0uHnUESH=FHT%sic8x1Ptl zH+Q#}zp3xL8ukKwnfvDLevG$Q5AQ!*Jznocxw^ePJ3soWz|Y_2Ji5Pr_;kBp$dkqG zX1M$D;G^BR@AhhZ`@`k8n}7W})LtF0e>23hmuuFy34gtRc6hlxyj-VG7W8HGvnPt% zf3Wcl2AstUbHNkq;&9H{BH}vXjTy!~e`2{WQf?9Zln2)0gA=aLk?DMM_<`@Q&T#m` zTsVTOJVxf(vg}i?Hz@9$`*X~q<`@~~3?W>_pa*80Gps*n&M>~h1A4=#g$qO&J#fxX z4pr>~OBYPIkG# zch=Io{ga8 z8|xHfFB89se!b+OR;y766t#{S@j{W7X*xdbvPSzgvEv^vC6lesZ}=c-UYX8Vh5o$5 ziR8Bv6cZ1b7~=#do2GHR%)l_(n}IAx*0VXrfG5roM?OWUqT0bX^80}0?%DqBNQgtf&C-{xwD#bd;9HhM!ao_rF54D266-)aTIFy_F|U@v67!VD*?0ay z%Ikz7#&pnVwE`5>*%rM7RlJ{0T-BLbbp|y#V!|Y?stR`!evif(<79-#BTXViYo6QS zgh48aUaeydG0B9}&}YOYS+~I)mLtkfmXdkFkHwjZME!%%RAh#a?Sn|t(@H*23)ES1 zhb=AnFe(fcRhUe!Fa$0Pbb)sfX|N$51lehZfXC>Ol)KJY#fB&}Q@E(iC`1l}G6L9^ z<-;UA!WX@>i9lXQTRg)Qux@dBgw~;ik|vU6n1?lf23+9f0l*lqT`;SfW9+X_jyb2p8^Fa0$3@(E)J|^-{ zlPn|-D!DDJA9@ zOU4+!@!WJU4QLa1R$^%rZUzgY+@;^e1x7xp20&NYG99%y^#LH{n5wqAL7bVDacLS# zWiou4pOqjKhMZOiTk~!90^MvL8QzgwT?>?8!?YyDj7?&&j{7k$Ae9i1sR>Q4vOUQVlUOiujRBsH3e`lHB8TiV zF@Pe4C(Ww-K>o;Z9$As}8PS6EA*@(pMHa-wNL~{PB~9|Y2_24=S2(Q6194fct^qxr;PhvI7DFWhgI&-Hgp; zs66Rsi+oX@4O6HZOQdKh8E(W0g6#N%Fh8BY=O@N8U95q@<3F2@`}LOWy>m9IXe)feVu zQ!B+Y^l%apsZg0bM+{I6aGxVWp+&DktC;kR7y&qsTn}oh zqzOIE6Zau=EDsr2C;>A?cq<`HoMq07PlMrp{qbqxKnMv#$DnlM(Nj+LNLIc`f^_z8A!!;O+ zIx)GQ(VU(I;~9TE7T}MEbMS?!xJ;AiE?eqrPioKx^stAmtJifx${kBKxMeo8Z6{X- z2$1Nfm%=&-6UX2_3J>Q!=_d{|5B6>I+hZ?CkftfA>5o^K10|Ni<%p&JL%Mp7t65f-vKM0U8+Gi3}dy<~emCFU@3OCc zhRkHdXx4>!x+C3x!q;zbj8f(VNYXhGAClI6=$yCDF<|{6WT9J0Nh->uu9IwKu*}Xj znY$L?cU|V;=H17u$4~eB-&s0zn0x_W@M;#wW(zKt{i&Q9*!^i zwq!e7l^hbunGE4(HV?zfcU?6p3(bK$dCUYuydvCx?2(cxb4f1B^TC$V0>-qy9$iX> zrXNoG8ptdFvp%{M`1j^mKHXUCYdDPYLb!)_>&zSdsrT=Apz-ipS)sOS)Q$`gSnEB4JjJgpF1p;*;fsbQ?Cb%hWqPjLh%lT%vepg okz<=aak~9ou<{k(KK}EkJzUuxvHAYw{+A*5e}4V<>+eMV3-cvZu>b%7 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index cbec48463037b91a0c7906b15c82bffd07c2dfcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json deleted file mode 100644 index ee149e7bd3d6f5170097bd17697256b843f62ec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2668591 zcmeFa!IJC9m2KJM`ig5B=YS59!HE8q9?0~hd{wfpDm{}_Z}P1Ey^k{-S&9{9fSv1^ zaSzZ7gG71|WW+sOzOnsmfc!uI^zGa4{`b#+{o9}a^6$UeA` z|Ea&mpZ@T-fBCmR{Qc+tr~Khxe}8}Z-KgJxu7Ahx{`&LZ{^MW!Kja_&aq%1e@;^WP zC|>uUdl~=qKYqVH`2UQT>gD+MU+=?zJ6x7!{e|Q4*SC*9xPKh}!#}7$;r{aR;icjD z<%S=$7d++m4`uEzdAojm$rp^5|AMU_{_WfAhOXwo{xXR3;&=i>-@1s zpV+$N_;$nZZx{T^_Qtxhj4ya2h;Mtt?_gOM{sxRcSGA$4%N2#;-}HvJzCBRr2mZ#! zA1t3rcLBklen;bLegf=)f9VZ>)xugg&b-FC`i6I7x#D-Qb|m5rKlpF-Y1)1Q6CzhhbOE8g%c$Q=K~3u}+L_ett0Qe^nk<2*mzF)dod zKVcz)SNzef;g4*r!l%M=vi>)xu#fNdCmG}XUp^7Ur+iZ5D==;sVv9;p2tWNZUx~vV zm0391$U|%V8vq1f@MD?q2NMSTdD}0|*TQe26T)j_*r*XK75~)6w{N)u)a4Tbd_(bs zMnBN_3XKqbLjAL!!~_qo%|b!iKE35He8vl26ED#2cmm~i!5d5W$6xpWRE>qCHTr}# z&pLNdyj(cfZ~*=SDhx~dag1`{Uyqj->u=x0x?8DlzX8_U?CoHUhsFBiN?)~pQu_nc z8WIXlsi-(ziLn@Wu>}V|0Arf(9M(7*|D0{%=M?$qUz%RJD_eVo@6}89vZTHArzPZ+ z*T#Dy_NsY6d3ZI4UW>I@*T5P!W5;Vl+QnFmYhXO*wb8j1Yq2hZH3T=O)@Xu@wOALy z8g@8^^#YDD+QnPVTd@}F zB3RG#sd?$WSc`QLthd`0J0`?bG2X>>bBQ=AaX2q+inuZydoiwq@syY5t+bjBO-G79QfEv8)me28 zv@2je)5qo~LW#9l7r}Z;t?^{B7V8>V!$xe!G5qXAF&5(*7|->wO&Q}|TsN19qY?$Z zH2c^&^)`iE8IQe~7s4F&IE6JotzA>1DG9U-sCN!y?`2e-)1m1IvP{GMSk7ULQi&v|J~0S&?UNIKq8W_)cYg5G4al~HJF^W+@o#(u? zsiIh)?`{}QOHGI-B<4A>_yJ#7m-5mt-m9oOA3~jJLbBuBw7?2fbywYMsQc6s^98pg zi?vwSz&fYSI9iOwxCX{^>TK$$7q98X5w1gjVV1F^d@*$t>zY`D%pBI36PgfBNDUK` z!`ReObv~gwn>vbhO|0P?*vC$(_XDm2!)<>9pUz?1UXJ2dwO6bHUU>k={G#jSic`_j z@RG|Fvl>tEnvpT*3#5=!osb7u1Uh1kiP0`-?DHG{+QMhNVsmpd=gpyNh94*#jT?A|RB7h2) z0q^{PDHCh4u7Pz9W6S|D7ULQi&v|J$7O@uVB3Oe=_Nh6}sX02gVlVbZu!qmcVU2u3 zti`$p)+vk`-HEXn*T8tnYrmp1BGzJE1Z#NhoLZy*C)Q$J1nU_u{c6e>@8Y_7Y160# zFFL9I0Sm9ta@ARN4wMUEJm;lN6<2AFz3N;?o!OV>7jWYjOWzZ6tO#lvAIMXg(#rT>`Q0I zId#X;s=MkQQ=!5%*k1R+mB4GinL@789(&cjj=Do{cQD2rP@PrhGpMsEqw0LZKDMc& zSl7fFJ|bsA&=l8%XhLe3kQB!40&p?ho+4OZa%jxhmA@G?Miss|W^5P0DA($94SnA0 zTqpG#y%IT>^CFyYdk1g}x&HJK&2lZ*HMmadGY*$yIj+I+)P*ALVwM-Mi3j0lF?o`+4tpKwm!UZdhy`IU^nOhCW8?s;zgh*Qp|G_VQS7&-3T{(#SwoassYnu7l$W>qz+Rq+a82xt8l9 zTyJ|`o=0IzcCIDeer=kX+-qYBxlZgS{O9I6G0FhJ-QyUf0xmp?*Ouexkg>oEf8h1j zL1lhjIO(V1TI5>a5f~Qq)9hbEW2q+e3g(Z`Q~&#a%pXTFDsaB-9rn03f0XNz`D0F> z7Z?u=x95odT7SI?I7$ zF=q%ed+FPA2ER(K<@%Qj#Q%V`J$=S16>!Nh>*w{@9kwsH9(z)s%_ILo6wD(>F^=CC zG>??)lKqo8y}rVDV5kq#hxB>>1Ma8E`ROaxc5-ZAFu1MYJGM2H`huPWFE5sBxh}#r zIvDJ4C-vKWvY%(i=DKkd;`sWFX`p_q-@$ePt^wwr582K}wmlBKIfv$nUG4l{j$VbY zzEA85a@A+`IWR1s&y#){?p&_rx(L@$+@udNU+kyJvAIqhg(#rcNsi4ESBPUT$8|WK z%M))f8W?VCKNp7Rg}YAdl(!d!LFZR>s*!0_@5XaYNOat{tJkN|Yji-=YxTN@ zUMKY#>MqA}T!Z7ueuw$uIMw!@zGD=lpr4-XSDQb|`3di5yu*lK2=@)o!$qk1W1Ir` ziHPQpT{!ajBUsz%f84>M9P6(Gy9z#JTSND_#^Z7=*G0HSM`!OMNqvWVcOEzoip&Ej zbdqcH$Z@LfJAKP2#_{~Od7~VkFmL2U)OYARVxkj^AMp99^xHY#@qz}5T+4M4uBZI; z3;Kj|E!Q=;PU^FHqkj5~ej3w2eO8}q=rjE^#{d^T19rN-m`AGLXVh=FbM;&OuA$#a zeKt>2pU)(jrx$1J|xL8y5H)v z`g{g`eg()FZfidmoydIrzQ!*7eqL&?LjLno>8Cl)>GvyGm2>qwusnSJ_=-NDT+4M0 zu9Ny~p4d;5WAk%vMj?)`&zJ`4v-%utSKt~QXMhS{0sH)EQ6txKU4-lHp2Z&5c(z>2 zbq%hQ`V4iKV>zzDF~6UYeZA~BIWNp31A}#QojEE|!H>gvB)K-9T%nG=T-V_`$MGAC z3WnQrgo{-3Nbh$X6Jh>-NBWi|*I-kw_2YqN1>b>{Vv=k0Q{-B%i*UW|6~HazxxJZ3 zjx%T9>8D3A3g~rGpK-YQtUd?J1vsAc)85}WB&qMz=TVFbT*FVZpAA9Y^C56C>bLqG ztXJS1WG1=BERk!uuEBMZWAnsu>g_vy$SB6~_1Qd8u1nsxJLRXB3ycPa+n$C^Li0uQ z#i0^EIA2^YU{kL3(}89IACmIZ%LV-qIhNxZ98dMDmy3C#e)aIEkbWF>jRXl3eFF zZZOaoZqE^za}NDH)jmZ&ee_V{cVxDPX6qf}##p4iU^&kx-0?o%U@sTEu~)nRf8hgE zwJY@R1qb}-e6ayW)C2!~{PB1$hjJ~~>&fp2e@^hy&@Yj5`ys*R@%0-gB)OLB8eGFG zK!4#CmWIRSSdMFOJa>J_jtACXQx|wa&6Ni%{J|^Mc&;0}>ArI%d%;R{u3ybrpI0>a}@eKaY;hb>%3;@%=QW zfqJc82ipa>2AJ>_u+PhaFiei+xCX~e43k`=qaoLFU4(1+Y4)#^oa5ExT+WMd4h2qf zZ5|nK7kMTCIo9oC?i2}Z4QqQqcRL|A(V7ma< zNqvU;%ds5S;CND>(ZQ8#xh}#r6gR2Y=8eNb_MLuu6r+IenA7VU1R6uQZOj=gIyp3N ze9jd=7bnV)|J+Hiw$typ0X{j_cLa9F*Jp4q*K%EiYxwE8e)Y}!8M|2+oBnzf;`sUv z8>4=!-@$ePt^p=|2JG~5Gf!N_Iri%FY4jN#4)s}muA$G9ej4svuI0K2*HGM~4>4aH zr{2EPhm2wz&rh2t%5ll>V`QF4AM$IDbNbIO3e?x=YeGm0=s)L8l4~?va+Qze!Zq&N2f2T*En3gRg=dO{_5Jw-+R+>^R)itPwHOBG} zL$AgjC)vK!ag1Ud-A8+Ewp5qQ4(X%!#wjgt@E{n%hU29X>2PS+_&h-vHbxn~I&1`s zVy)8-3JZ7?NGPl|h7Dse7ULQiPqnO@d17}4V{-*L3Q<6v>8*2WjiXg-)jH6wfc5q| z4lV=3on_qiOT&kAxbxbWL4G^wdd~QE$0@Xtvi5>tm`~tM)i;C_3*K0MSsZ`i1M2q$ z-{Oeh2yQW?V*y+E*W#tg?N3lP)Ecjip%{ztFBORYA(>zg9Aikw0@lQu_3}G*J9}TC z&LorL9Oj0O{~#GI8AmY+n2WrhsSd436Jm;miBNCU0FlEg?b@$c< z`qb=Oa}2%4`^X_cSKU?jGpIY(qhc-AHL%X9vngXg>5k2maTMb4oe@*UmFd`vbs?WrgRXVp1SE`ae=-}+{%xJq;ERp&bDJm;n1SX67(`V4A~^`}^ibq%cH zjylXKFgAr0a04~Q0KkAHNb_-!0^QsQuRKedYej$bxEvq>WsFD zCPWib#DqX#b6A@qs?H_Vncg~wwW*?5*Ti~8tsih57;e8bq8kqV1l2xc`~=lrh5RR| zrquZX_QY5(9n@6_$G0UE9Xkvk7>l)77r`3M3wmpgb82qt*w2|`^W$+wAr7zRm;|c1 zY9448z#3q}bzt}~Ra~Vx_Nwz))EP!ybyl5gsPmkchEW%5u`Yr&1UF|wOc}>{x9>C| zqZo(t(x!@He7;oi6)pqAZQ)0h!=b6-Q}JK13U5quTSFK1j&Y+{HeN5xC-8%BZ}652 z-qV=P<_EM~ua|2F6pL1M-SV zAl71C1Zyk@04iJshFs5xwOALyddf@V$zm^wMnT?TvHOz|=9` z^>s6K9F;hH!_O3QWjgj^T?gxwI={h{UthSZ_N8aEsxasbfD!j!iE;3Q<6l#?+Fg8VucWvEVB92NN z-dmd@u1v>XtP5cc-;h%4c7e^naNE!zyW!ASu~TBK*sJixv0}RbM!D8a2ZjY~NK&8C z{E%ZguEFtCtGZoG68mX!Z2IX@hywb|-t^u$spmLcJy*|z{R-S~ul3+VFl-mI$5qT@ zub$V@a|kZL#jss43)E-z`4sw$E}>k@brG&XW>T+>8^@`(@AMs`7{~Y1=8bY)^0QNO z`rKeNFofI2Ya_$q(0uW!`TTGpKP{ZC$51Hf`@X4|I9M~1~F-fk`P?2l7F2XfBAW5#h zAF`ho$L6|o6yo@LjcK4>tJlGH0j>cidpYc&4kTCQtwoz!RZ#BL78=DKhc;`sWEX`nu<&%t&D zuF+wpzvdVq!*^iVuI7)cn8#i{KaHNF1EQX*=QZ>^sn1Y&syO}4h z;v9SR`84_rcdkCG&o%UU(oe&k%e7n=;TnpY^daVpPM?p7_*!^Ta4aK2M~d&W>|FH`H-B8kI`-=IY4jQ$5%pTVuA$dSeTKTr zu^iXnc(UJN-Z)OReW&jj#VF{f+0Rbuw|S(TpD>T)MAet*OJbrEiwD%QU7?3BIN*+P zK9A%J{Pf|CVgKXBJW+icGj+1(hSJ#*5OKSL%NxyCWsGgV9 z^Q1nbpRPWu&u7r*2SCOUZX9z4nGT2E@7Sfk*}sk|e0Bf&0T|_4y*`CrBOQ}#xvs%A zya71HuszHd<850vuS*@3C~#fVT)%@CVyVySbFf{3Yjl|B`qdBf$5p&zuYR9KztQnf zzt!&=`knOGPGdm&2ZnIlm@~+5 zI5b~;o&(GmqYU|c5v-v>jbVEQd~&Rx4(uxU4rnO*df9PuUSOg)FPs-O=S7lh^T}>5 z#^yS66rzCMCppI9>a+SBEEnK-a$RZuxQcV^)#p0;Our2QhF`|8y~53_*Xs2t^x8a9 zy)N0`PU^Gyqa2syc+yXsKgxAYuHhW!{Pi0QHHL8CI5!{z;?O*@Pa*Gj>{ZC;k#qX} z1{meqbz@*ypw9;lMZ*Kb_J$wGu^iXncv7Fu6Z>g#Z1$^1Aqwd8q@RYotJmsvuw8-c z?X?_y28Qj;d~p@)*sIrd^csQ-a4~Fem<8&y`g{s~Mpsa-<+=#hAd~)@hvth<&G&xCD8m=$i^~Nt%C&wwFs$G^ z;J2ZvXozrl!4KqGu8VNJ?G?Z+hy0pNxt8l1TqpGzhs&`X*Wh^SdXVK}z8G)gy4lAY zl_=<^r~1{)1ujPYR=#X7!4ZgpFX^A%LS`Wx&Ba})=Hcyo6l6m5spKdT37;bwSWH=m}FZL z2AJrka=5eBa~+9-*}r}&c)Oyn_5$qg7=QUX66C7S>T?Z!roZMyLBNP1pDovNU4&~W zZjx*B$LERl{Xeb~M=_4)r{Rm#XZ86E`n&*S47ar(nGT0LYf${E_KGDLzgm*fXj^cN z)^f$kW?{E};qnGgP@n7QGaWIa}_uY!~1tJlGH0j>cid!-Igalz&=_vd5oAIfnpgHI;`crFDtt#?xy>FM9QYiaJ7AP+*NK5)g+3nq zH2dF4{l+|yb2%@<`J8^6XZF+P*z8x2LKM*Nq(0+t^;vxmmJ4t^ciq(8JaHB0*sITV z^f~9Jw{3=Mty&*ZtwFWD5ViV%y=qWwr$dTMQk-+rpc+FRhmNC&RyH4`qFAF4;xq%Yn^mZSmBB$IO(YlbwiUx%*DJ2 z=G)Ez+)}+U7HhGtfpyMX<7hD!;~E%GH9mHhb=$%ZU(VsqYhwnrSDZ&)c>u=?+}CnN zb8?}jTCQmH;0az;9Z2`Bptpwp0v4DI&IzC+)+k@Qpnz8%uWtH_7>jWYjOiP4Si@Y3wOALy8oq&j>b-Gl8Z6)*L%lbhwB9>r$+yO}`3tDK zWBkS5dqI0ctX20K>dtxb@q@{*u;)5njK#PH##7#V0p?;Y)&aBVQ>J>2GUf02OK&@}4j;nOXUiGe{-q70}j4=mPXVv)( z>THUrI-jslZK^2NHL-?|$e9pRMX@f4bqeD<%rl1DGXzl$ho*>qhL|GuD$J*dZ0Kdj zxoH8Gofa-JgW{t%0Pkq5h_zVPz&fYS=xd9y7}vmfDqQEM#EZ397r`2>>6}`dI>x)W zZl;c-5{LKF=#8k>s&$}U0PCDOL)yhyjB8*#=cP>@SH}^1O~)uk0d?N%Tj$i<6jIDf zrjS$W&1tGB(UinICl(KAAi7I%}pIu^AoDMsiRnz z#5$+Wrix-*662{<@d0y;ytOIf>NsMr=@`W*pw4q%+Eh`j&zCB`!gXK> zrwxCD=!Qd6#Xe(96?+x(sUle0?sU9@Ju%ix2Xz%p$F_v-V2y{xTC9s;jphZt_1-wA z?&xbf4V(r=rooiDV-kq9Sl7TBV8Vq!jbBX}<6T=f8-Ak_hxgu)cGX#R4zw#^4ey;( zYdl%3#kvUA5ZoNrrjDxviM=Ld6r+Gz=P)*96yx)yjBjum7;Xzcq8$!R8T*VeW$abR zr;NX9pZX1Kin-o8s4QSYrmpCFL;p{##kvO8DR2FTzO@*OaSe>;)ESdNti`$r)@U^Y zRJaPL^P8z+yo>8*LvK{#@Ln3d4%J$<4zvqkol|E>yBLdc4UFf!v?=21IAX8q7{w@{ z&U<}oKAux^Q%A8sU+UN{uq7D6iet(k%i+-2u}>Le$6kee>7MHToM#y+$uvuI0K2*K>M}X&~2fU4v_Y310y@ZWpt~c-z*^Hs7ek z@%=Q^U42%cgY61j!%t7OtJ?*yCg*ZqgmWlx(w7)NuBIgR`jSzM0{Wfg*gR2=Pnah* z7!3@!wI3M{hvtcW%9tniD&+ITIX~S1qg?B!1H%HoW9n+Y*3bu(Yq_q$bZd+Gx&H!vrvFZI4aJh{52v?J{Uy2nGOo8Z6?*eYui=a2TCQvOkeog*02jmUIYI;d z(Yo)gIq|FX(@*8=|8ZRyMVRx`3)lo~a*gwwzT-Ljet@5z^VjS`$+7M^>)u?5q=SFdi7fedD!}*>Gr{*r$kjVz0ti=ZQDKDA)Syz_5bvfWL;O z?&&oimutB$!u7US0JrQ{-|z#umg^c^C-oVJ%ds5S;CQZIeKSvtw{hL<r+NCj<3(=jdEQwZ=}D@ z={3KQLEoY8h>3o9y}p}2s@Em;I;qd-hp5l$^C|S%yit8Fsn7J&94GY~hpXS}_bK$- zJW~BGsoxM>_-ELTc1LQXKC92C&}Z{R^|_=zPx@)|MY*oYHJn7!hnO$QbxE#s95Xo5 zPwS`8;HO{A6V>OE`bm zzkLY54FQHh&q~+PqP{E~(c^eKuc|I{y}mr*ERHc(oaL)8I&Kvg72uzyid1;k>9hFOpoFPsZE0ZhpS%s6>JONs?pqCDmv3Ian^hF?~yp>sNq` zA>2A%8yOFW=8s+N%pZFd@;MFtHrU(gm%IW-xmK?O!{h5UxR-0WuEBLupV8o!V>zzD z@uZ)|G>~h#F2XfB%#;4wJTl(ab+fNGDsg;&jgE)z&a3iy1hc}Y)H}l1K+t$rK->Ag#{WjEHeO8}??FwAOZzuH{&z5VsF2XewH_5em<7z@;uMZi; zD4^F#j?EY4_2PSi*r$y7Vy{9zUu1up~h#F2XfB&Hxp@0`k0E%opQrTsQlAqY}sW z)984p*Xnh!U4ZMPK11E*SdMFOOh3)O-rhJl56mA|lM;J<$|yzwJ?A_~a%~8r*U%*EP6K>N5_PV>zzD@m#-SXDzp_{qW)(?z}dpPj2B>c$N0J;eD(EuSHLLO`su*1 zg71Kzp6gd%;lJfv&Wmuq?H#}^`_)(cK(6Jw2G{VwdmQ6%IhNxZ9MAQuujYyIHm;j} zy-|sR{u%T>a}_uY**kKWG1=Bs#C7zx(3%tj?EKS(-C`p$0$ZYeP&ret0@w+_9*$Y8kbnUE22XnxtJjQM4+LO#FD>GKWn$+7-Cuq)_ml3b(TBG+$z2G(Z1iq~|*vkcPEN?&IFZ>aow~9YG=R59z5hcezAFqw) zawykwy`Bv7Ir-f6A9wTt<=S;(uvkE^p`qXuC#Z#|I60Q%8XQmRGp2!D%XJa1;irGy z{`DOT61kWABHVAU_25&sP#agUu zV4cGl`GXjXaSe>8uKBovV+^;2AJGkmricNE_b&D#e9wiZu*3A$9H-R$3RcBlH4jRU z-WlOl?_w?1HL%X9v#DY~XO7Lj^(e&Q)ftmObyl4N?Fv}KYXj8nIOb}~xJq^GRqL~; zHF_VawQ5~Mt#j%OX%}NLu7UAf-`Z4hoM-z^(=m!s&`ZztsZAZl{CuC7dV>qW5Y8KZ z2hk0OrjE}uf*)@aWys(31=hAZA2+Zk#(L|Zu7U~Kme3un@vvBnbrG!5%*d&=sbY5q zV{^$k3UPR~#w1X!RqH^z0M-B#t^$wVOc7UUj=kz!SDo3=%Z>s5&a{A$SKU?j8tOh3 z-`rs2#agUuV4YKEQ^;|i?mJD(C`JMAJ*Up5j$&Oib%bw7sr4N$14B4%yfmU74ow}O zX8=>jC__GVoKovMSQKl$bWm8pgg`>KI~{jCEXHD71LHY$Hg)XIU~DcCMtIlUoXLJL_TC9s;4Kj0T zZK^oVvwf%O7{xfemo`-t>yoKrN}V|kH65CcnAgPO0jR2fVcm-j*R zyEF2FhgEac{0wSt>ZqERRP&rV<7m}cbv}bSn<}c#CDnP(OPex^bxo{6CTs=PfOzx; zS&k+|6H>#30Ms3fO%+w=6RNYRqFC3&8opu5TR-4BFx>Vxh;}&i-o-wHn)fb76~6f1 z#RpgvYrS<)SRhPKdFuzPw-}3Y4UDJmU3{1##=E#~UWhs>Q9zyNyfn03wN|YI?Fv|L zujAk{fbqjrah2-WtJZbY8ldiAj5(k>tIjpmnI>d!oSO#d9y$%21~sQa4r^1$abE5_ zP0A=n0q>o|*wj&sYo?B{&nc{5;W9AXerZHG9GWsd72lLG%J3a2BkXVvYp^KRdg-9B zfa#cuXI{}r5o@uofpt!uO&Pm07@JGNQHaBY-LBZd8c!B$v95tN^mhkiNWB<~aSe>;Iv=Kp@h+~LOU6-&g5El()~1Rp)3F!p zLRiBNr?7s5>%egPr4ik5XsXyD@!rK=g?y@*!x-#|v0gf;t6(~|C3Jg<_=bnYTC9s; zjphaW)Ewv3+|;q3GsmXa9)&o(nqv~E=Bjz1T>xu<3D*o++$V#+wqyM3n#8O1o9mo`-tjD%XJa1 z;jaPeo?c@CBG+wp`0~4X%^=40V@dIj+Gm{WSY}v*YAEF`f)8*3Ecw zRH8utg!3fHwRz~BMm_w*YitKaH(U|GP2OzJmgiCoKd4X%^=jE=1w z%W(~kC-oV@gj~yY5w77Ja(cZ0WDMc9@!DJ{nlHvO(Hth`#kU{buU^2WT&veL^cotv z)9;{~$gv#P;CRkYFW&FiPm^Qwx~5Tx3Vl5IY4)o*PU<-hSI^b+V7~(Q+iSf&pJM*F zih1nS^E!GC!QJB+vp{`TpHHFBa5Zu**G0GnnMu7iZycxEzSDP%VjSO3n>WgJ$GKsv14FoNyf!i%4!th*srlaL6=nF2>r%Jb+gT@G0i#^&rvt+Zz5{-Gu3ydDOyyk8 zi*P=t-{z0qJdDkC<0wP{{e}nL^C37~eO8}?9>=5jlus+9Zb5y!n=kg$or3O#(m0YCct8ehyC)$5Xajft|;?|8xE>a+TM3Vk+T zRG&-gGyOEjN&Uv*>bLrR3jH>JRKH8=Hv|{{8IQIX^F%o=$?@FvAur~Ma$S>akO@WJ z(`)lZxvt4IoJ5jq^wV7@x=xIVULc3bar^+d7;euIWHuan|6-SZ?_cayn7@CKeZA~B zIWGXS^FnzzD@m#<9 z6>eOv<+=#h@YC#9a}34a({sGK+{=9t?xDy@uFW6gZCp3kk)smF^V{Z&E5xyv<2oGA z`Rz9t4Gg!nADIq^=8K(@PfPX2drn(Jvz1?F)hL(k1(y@!1scDW^9Fml;ElcF1^5ep z#OJBvPtN&{H^3;@`stXA6}ZOKOLC2Mq+H8&4X%?M&4#cDF4QemPa$JMsNq=pg7;odcnZt}qROstL zaiPe2dTqYALLGa#F2pq)af<8Z0^@<<_G=@<;m~}sQ)0f@tMD7&zqnigpB(F_1G@^o z0~*S{-rhK==kPJk1Lr}_d64AVJhGog$EN=tg(#r!Nse*2`m8<&%LO=|>iaDh^Tt)2 zW3N8f(P#Q=2r&FIAHBf6tJmuFDfAlMaJiQ28eCI>fBNvo@X?ET<2cp!oxWofgZ^*LBB!0}|i1Fl7`<+=#hAd~%Sj+1(B{24#8yOCV=8JubczU{AE80A_&9T*nyAvr(I+eqbDj%#qtel>l_SC5nP$~?25mdEBg zbrhn&`GNB)$u$o5eBt>b*e<{|z})F0Ud=OCagM$Ed>Va5M@4;BpKItd{d!Wb%`esK zn*DJoZjx*BOt~(}b&_NAOF1sd@m#;-1_O=Zw)P_<;?VrEPZ{&eUWM<-FX4#i{PhiR z%DL;tz_LJJZ&JU}2b62MuEBNAU*F6V`)P7)_NzxBj<3&{2I{l=9BfzM8vYuf!dLLo zoB84@*0EQwPovl9c&OLvbq&3y0&jl~{0-_Z$8ubQ%9dEz+L_MN_C6r-S@X1|)_ zq@J5U%KZuR$2*J(hH&GUGstu}G=F@aBmADcC__Gf1Zz9}kUQX$WBqnuSHYKTYv>-= zcwDaKx(L_ka3uBGys?{uvAK>Mg*d)mV;ZQ}>UFSPfNOvWU%^N3=8LO1$6kFtsy=UH ztU9aCHPo5iX^yGSAJa!rZZAabK0&VyFcDbqfnubOQY^(aD9&A94XVAmI^M)}Gj$o2D3Bh~ zM`y<=ZTDL1bqd7ZSx{&ez&od?Zty4=Zof1l9S*(JxWW&Q^E!IV_Myn%dI?NmUIdN=y=~0Not2HKpYOPua+6Ax%m~a*J(in@e z7}vmfs*BAhi?vu6!5UtgZS0(Sw7mz;w*1HTr*IE!H)#&Y2EV z#C}d3n_hYp;_&K>NuWBb&VhCXtkGJgx8@ii!*w8KTrd`Uu`h!CcKc!nYdl%3#kvO8 zIdz8gi?JBjz<90`VyYPL;<~wn9F-{OwR381%D6Hed$BHrHSBN->nmIbhTAWVD2GE+ z#tw-oW3NI!Wz1m=_QY5(9n@7Y9orJR-RZdEVX+qLB3Pq&G1aHOnmYD#zrES$zmt+BwsKqg89wI?%3w_4Yar zE(59K4P&tu>l#=?Z+9@p91vqMu7UBKmo{}A_Ob8u(xVs^Ob5uE^VX)2V*c$LuUD>s zIebOVl$c72bxEvK7~f&0G2EUZh-x@AMeH-g6tP#~i&MlqSQKlQj6q=q(*bXtQ)@Iz z#9FM2V7=`Wz%BaHcT>fFjvSkvkWq*NYMoPO9IZO5&Vh0PjHmk4cc`^ki**sK;icK9 z<{0|CV@lv?#9r)+U=K2LSYytJwOH4{I)|~TV!UhX=8|z#;_zPERB>fG_F`QKYxstg zT60=zIy4=DHnDgBs&<7OzTkj6#$TK=zL+wq*2ljF1uxZpht*f=!sPC57lZ7XSa5NF7N}x+rnqOqU7y?BDaRuJYHh06&xvC*ei?;0yjr7;u3D?sfp!6`Q|ioBw-}3Y4UDI*uYRCCA=YAD z1Z#L{_Nn*AIdw-P#cAL)C^8Mu!^>ff#=cmKbq%a@7~^O$7ULQi&v|deHDWE+MX-kV zhW^4V1LFrAi&%?w5v)OG4r|N_u@>tZSm!V{WsG-i-AoxrB?`nbb6(n%ab-I8VqFMp z_y+c^Q|kQ+*MZ@-zd_W)p%XdrFf<>{`TL*;&Oi50i(HIe9F|L8} zoI0B#_H*Lc^wy&g1=M-YOGDdLYt=f?u7LISIu0%a@eA)46>G7sfi?7Y2V=|uF&5(* z7|(fWbOXg&tczd`GU=^3&Z)VnW4z1j<`QyL;_zPE)Ny4x_F`QJ>y$db!G&N5Cytj! zbi<*kVu!+1u~*@XQ^hy1DAs!Ips<4JfY*kkZg)oB@UU2mbrGz$odUQ;-}=pzv7aNy zrk5UtD4^Ckb;i-Ev+5iu7r=O`Z~X?f7HhFCf;GJKRG<0{4o1wyya?tX6Eq28P>)2H6dV#)_R1W5r&D zFOC)41u)9BZaOe5U_+Anj76gy%W(~k*{WtwZ+4uVCnl5qG&?r^`6xsIz2`hha*e~) zfAv4uF2FUwgik>f*)I5j9LsSHjwkgQ9TK^g>mppw^#$>4xt8l9Ttjh_KE!x3-o|xv zoj59SJU?w7xk4O!Ij+O;oS$wm8W?VCKQbQ<%_BP{=8?S$-;qbc5wpLY^C1mz%DMhJ zuq@z1CiNSAK)IId8eAv!**vkICda0~9)&o*K4TiF&+2oqU4d)(Yk&%0fjF`4tnFMk zqJHgy6Wo;tEc^jKw6;AU9EVIoz2u_*Lx{K=6BR*t%&8->fT|?@Pl=E_^%i z1bs*yAClx4EC4P!#!OJ3pQP8j~rD!g2O8P`x;_NzHg>N$Lq+{=BDb>y~} zz`D46|>*n<#qY?$KdrER_p149BdpWMd@tnWD!f0T) zt^LSwIQ06xPKoz3_9}eGb*b>zIlaCDM!D8c2ZjZF$E04P4=C4iU4!eSKAR`@)8g3l z)1wf_*Jn%v^;vxmwkvQAKh1vi-WXuRhai4zSNy~(EPDe zV*c2xkk22J90NW%)=vj^6@16GhVJw`Zg^a-<+=#h=wPsaoz!ph$bOm}oBnzf;`sWF zX`p_q-@$ePt^p=|2I9kZ!w=+Gj%#o{*RQ_8oy)ac7vUQII;q!qwp`0~5w4-QNv_Qo z<853w*NLMN$Me(Xi7Ujhm*YAd&-rP7A%ng{-w|vV&}a6i_r^J2ayNfe&%b>;-S^Af z(HB(D)$pPw;*K%Eh z>!d!LFY2ey=%>vW<+>)ZT=|dH93bv&iN7sP5Nv7^%4E`i+Q5@d`5jn-%ov3 zpKIvzoS%L%UsSKpsMoOH>a}`ZL$3iQdt9<+=vfNsi4U<850v?-Lu9V9fCVRqcv=?*#|kG0uNJAAJj7@TU)g1N+@x z@b{_DAIjAl)-&yb2Gf-XEd0SMYyLoyTf=MKF>b`{(=v)r;O&1moQ45L!hBJ3w}BW;&C~a;~E^# z`RNCom|V+s5w78<+0RbuHx8F`IWNNb_Sz1<Ij-lSfeFRoC>UasqKozv%67!3^Jw(;7?Y&bMe z>{OU1_9}dJp7;tF5shPak-cKBHV9#32=*cb$c~`?5EMO z>92XZafHMoZ0?s1G+AjfiCgJb$>`jEYGavq?I=sa*9)SL%NuFWIkZCp3k zm7@{`{CARL^T!q9*voMpj_FfUTrU?G4GiJV@!H6AI5cnUl$ba6Dtt%Y2uBR|w%3)* z1u)9BemXEL;5#Pu8r;jZT-V?_sn6z({j@kX{q!ir@%0(gKz&x9gY61j!%wq+4RGNz z5H~It{6Nm-ya?ypJ&QfA@oc%4>l$1q^%-g}$8ubQ*l&~RHC52PU^M! z;tF-_<+>2paKt&T8;l2r+pmobhePwlPKo(quR=awOmYnPbd!2KW&apzdZ_Zd_BiBP|wx#V7ma<0CUfmm@ls49DDWoH2Ms; zu0E^JHS~GXPs6RtwOkkB8j73rA?A(a)Z2IZkWq}|`Dyb-IsW$Tindn)j_0liSzt6U z+}3_%IvkoWJ~f|TWzrrfa%-UKj&UPq?FGwwKH-jEaf7{F@Wxi;8h`Sfzg_?*>VtB? z)^FMK}kUFdBRQ8nZ;M z<+=vfNsi4E<850v^Tbh!3VppfeKt>Ap^m*=7vdVuA*a_j7!3@!=L|9&4$T)kCFYC0 z3SXTs-T!$<50zM?E&saCgu^iXnc&=Z4!|i->E!Rc3hM#7?n&YIN<8Zl``y$+L zul3+V5H~J2{6Mbdx(3$}+&zvl3*=aiYj8a2x8Z8!TCR(54KkB@ZQdAf^c}(S;r01$zNkLe{CsTq>A8OO9sLsZTm3$Tew#n4 z-zD`s>929P`m8>mLZ8hO)#sA>ob%J$aiVIiS|3rZLAAXQwYsEM!yKcR0gCac+N?I8 zK%4DzsLds{nLau@PH8(1R@>F~6KK0V61BagwnJ{=tl_&cRGZc26KFG1c&V1^B22)P>XbG&cnl1|JYE_R4u^h}Q=cJzlvA(5Z~akD0JVWd zvDQfkg%$1~fRkni8xp(S1>qOoi@BH=!5o5|!`l3@pEJkieT<_J1=Kr-F^*Q9Rp&st z0LD{|kDX=Rw(!H3bGY-`m_h9o_UM%daJ;~MEmt%r7h0<2ibfBfpgPx4=Q%G8aDfgU zg|w4nzce=*9}8xuosd3NzPb|v#S?2yNDUJL358fdZyQd#Vl2irFrM?$FqdL2)HVrCvK`&9`rNpz_6DdjXnat(wa04SL7m}P#9FM2U=1?o`qZY5;ti`$p);V>?(PAvd zH8AEiA8hDl#{hlDv|z2`v~XI~oEAB(v4|9Fv95u24r8oG#aN7MU`*4J!`jp_-oL}(l zF^4@)nG(iJdTYJ)0loE$DWd9pLUl&JPjyzEYpC;-mwqu-RIN{_)^OgcwQ5~MtpO%n z1=f%Jb_OvP;~E(A`f8exy>V_DU|Kj0oCY2zYhazj*wiuJwRQ7e#!(5z z8Ato(uNPCsmFd`vbs?Cu-L}>rb&3>l#?+)Y()~(^1oOz>uHdPesnpnd(OnK`!xDE`r zXAq(t4ow~V3^H}>Rruo6@eM4Bwca`?EYRRfnUFU$M#NZ*YhXNeO~{)mVm~L2%@lDI zqJTQjd1+|7YOPua+7+@;NUk?#Z{_fuUgkpYv}C`#=u&2R-J3AGfl|sI5$nu zU38i_O=?b)9M-0knwU|H0^U4_v8kjO*Gwg0uTxmJ3v334+pmqRheKn?r{uq4 z8Q=J^wXLBod&js@EgQc~g-^KSeZ0Y3E_h?Fcme)Gei~T2LJwbn-5ulah#~PO^96tU zU=Q){X&1nVdf;%pHlE9&T+8)(GW-s%x7pk7rL+qkm+KEQ&>HH~E>N~B4_NpE^*Z3r za}5neRRR5{w?&TSIIyeWJAi7EYaA}ua$SUL_-Qt`0q&lDV^JgLa$bbwa|ui*l?!2X@ETXY~2xTCR(54L{9(HOEO`f>>DY<-Q2_ z+nyMDje}dmG>~h#uE90H+~e4MG2XUyv(GmwaeTiG!B(Hu=U}@6*YMj(y~eZUTCR(5 z4aH4zZQi(=kl5=(MllNLb&_NAML9m<{fi5X28P?(k4%R{^Tj@8%olqV^7$hB(;VmY zdjXtsuD=c}3;2+^>-l*1om|Ux4X%^=Y@XOplVfw8I0|umea19UpVjAJy8_qfI0Mw3 zd~q>fT*W%}>h)>#8XXVyTD`8J*GYYby34T~*Wh@v-(j9OPPKif?-<1>=%?AQ-Ww@G09Gy2mvh zmutB$!ZkV`Nxe3I?B-x>t}90&j<4642I{qX9c&li8eqa#z@)URdE+Y1u~(l@qt5_c zeO8}q=<~1JufD>a%ekBv;T#H_^d;tz<5b*t`jSzMPM? zp7_*!^Ta4aK2M~-&iRfTV3ce9bYNJ(cg$VicS9dguI0K0*GYXgPweJkY_1DOA&#%l zmGJFRXhV5qlxQcn~)$`NnIY3v>)$k?+@%0-vM*UX5gY5!b15Ee~ zn3i@oPh7=0_UiL#^ckS5&+2mxeV+8waOZL@*G0I7;wF8F`QkYB_MJXt6ytb)+B{K? z50NL*hh)b&edk2hx9D3!D2T-aRJAMg^aTgpG0x|abJs<^m`|$rCH0;Y&gT8jhKG_ZWoF#*Jr#0qevh#{gS>R-Xgi3gP&G-JsD8pCxs~><-uGQxn`aI{S zAL#qZwOkkBdfO|2TO8aT=8N4djLmi8D8%vnG%T|EtUd?J1vs9&KJQ_kxQcV^)#p0; zOh3IhhCuK65*QWrTs=R9o+IUvYq_q$byAzrP{ z!f0R!w~g0Ero*9mb&t4Fv_)lIxsBYL!hBM{f<{WF2{0QgX6jW^{e?} zHwR;Loj3|nK%eQSIZo;~4p+a`?_j+G=i6&L_zoQW>85|Vmg^c^LvZ&v2H0{e$2B;f z^w;Kz!&3I0{(2Ong6{yCNxe2-lO3wd~&S64(uxUkZld!;~J04wOkkB z8Xb+KUYjrW)8g1%H;zIaU#~F@)NA!R*e<{|z=W@WNm(xDiK{rrUVT1|J_B_1S$(dd z&wKr9KAzNbxOKUg`y$*!k&|4TKaNv#-|16EF^=cA%@^hPg!y8F(ZFz9`;qBzXukN= zd_O-m%8<_&=lpa7jB>4?4h#$Uj=AeW8v25AE!Q=;&aDf1i@zMpaSe_q^%>JZuI0K2 z*XS@$`fKyYcw5)azTT+B@%=SA9_qLH9c&li8pZf{u}}fzYMd#@QX{-YxVjRdX1}96~+TY*m0a2kQs4ke)&8nczg(#rUlYScVu3oFx!FC0%x7Tv;88~>knlG+m9eee z_c#XF>a+TM3VlXbP_E^=2-hH!{+i>Yo|`|8Q*qzvOGYt{@3+k#<+^14nA7JQj0lEs z<9KakI2@WUJ~iKbG0O1O`Qi;Q%C&wwFs$G^;J2ZvJN=Ox9+zvmF2eP;R{*y-c)6K3 zcC#=x*NLML1@t4{|eKT*W!|>T?}^W`CMv2=bl}fiY3P)$dd2 zH&&f;E!Q=;PU^FH;yCs8ojzm~2031;}tXG+%t41I!nr z3}2lu-T|Xr>!$<50zL#9y3_Bt<8e8b;~E^#^{emZiQOEG&2{1^L;-!KpU#ex`i{fZ zclAByLWOy-z4n7I!NJSjJaQHH*sJe#^c{i=j<;hN)me2uqB?_Wdn0P|33}O}8cMEK ztJNpaYWpN=bxEyG`Dh%hHml7i&}MraYI8|#-s@RIj^Ui)tI^t1yVdR!Xg462YN@V4 zbxNDP+FA!v(}BP>q^R~IRR2;r4_(@k z*l(}%;6kY8CXTC=$6htBqvp`t9gHytRA<%s4C)NE7HhFCf;Gs@skI^FIM4Q-rehT2 z@Lt-KQLIa*j45?q;4(0T)5c39y5Z1N@u~Qxicy9yP8AohDAs!Eps<4JfR~=?Q!i+g zh`E>-!F<~}fLqLo#niDohq1Y29EB*L-Y~#B7~^QwS#=JS3t&8TO~_)3xJq;ERp&bD zJm;n1SX67(`V49fZ!OkhT?1>l;~g(;ia5@*eW&Rd#VF{dX+pB&+_W%-bXt^5A*Ys@ zSGW`m;nXo>5dCmyD)~Hvm`X+&@~I?P+cqs%uqVcP@1U-rX~|&?>cv{Di(rjrM-FRK z$LbOdC>{aKps55#QsniYUhCOA&8y85nL0KcX8BO%b1pZ;BXY$ft<( z)+y6*1B+s^`BKI^TnC15+L$qjayT?)e4YVJ8KVsOlo70LcRKE1PmJ}_L0tvYu`QuH zSmR-_7V9Edqj@par@osycBe2lmyDwjhgWY{7}Z<#4zvqk4KU#{AnkWk#8sMOuR5Pa zong#XXVtleI?s7&sJB>)brGx~xH%JIsyNQOeWwW-#W7sP5urp zvU!b22uEJsbLxzDMU2I`h)J30jLxuU&o&Z=__b!K0BZ=6$ecyF;6`y$vwkaJj@I*#*l z-)T}tF%IXoO%=tsW_UiM&aZG87;e8bq8tuQ6`zXl-7iswe5y!qoiZJ-U{S2~(m`PX z(=l}g-z)loVlCD+u+FKosbY5qV{=J33UPRK#w1XkRp&sv0@i3P&v|Q8$5pyxuX>+F zz0vDXy;biT>J3|gH6Wz@6=N|L;~E&xbv{fH$9cBzG##TD1-*4ntxXlh`h2P48(as5 zaN3wLh;BGEReYWSOckRH`BV|CZF}iAuqVcP>7cHH>41c?p*K6uO%u!_r-{>~<}}G+ zZA#gl#@JkPjzSbr{~X3RT6I>P1LXo3Pc;PJOd(fkj=kz!N1f@tp}#Q8h-=

{V;k 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index cbec48463037b91a0c7906b15c82bffd07c2dfcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json deleted file mode 100644 index a399d8254b8f080867d339cc89ceabb4912f8892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2437697 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

{%}ZeBus+`9!aS*B3?+yuNUq65UpMePQR}bI%Jc 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 b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json deleted file mode 100644 index f33e39011c8e04ab11102b16aeb4e8cc76be530a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2425323 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 0b46cf49d2f672a809fd6e71a0aa3bfdf664606e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10626 zcmb7~%Wfk#5Jj{0R~Ws{qO1CyUkL(1V|Oeew&lpu0Kvfj9+G~jc&?p6vY3c$HXp@X zw{BJY$JO<9^L;%&?+=g7Z`VIkGk3Hfzf)^}n_9n@C;4eV|N8OU;_syk4~8K&{L=7l zyfoU&&%rLgZ3&3UfQkuyWJ`EHT~Q-?`x$8H;3c8x!G;^kDL3$&0p*7=3}T$ZLmkP zJ{@j$X@+o?=CprUHxJKwUYpFjcA92e%;E~^Jg39W;eK-gXRvJZx^_WkbGv=sJ#0^F z-pclVGmOofbza_g+#J{E^L;+ZE5HlL(+Y<_tFCmgyKKhWZ=3gr7ue@_!VYpXz@#+W zfQj6J;cPAe*Jb#C3FiQxGN27m$sJ3ubQuu9n%mJ0%Jb+-xg)@^JRh;8fhTIQ#R%Tl z889F^UmnnN%M+H2j#XxyF(9G;{a*9)WM;>l{?lDfybBt}I;^_D^k$p_rs6KW!vJqF z15VN5n2~qOvALtjzhyw=;MWdJS#fb55xg`vBPZu}#ml*);^y2D`MC^;9GyEX@^tAS zNS%-|aRb0Sa(A9G@^@}W?#%7T zWl!`VCj+~@B3@XNm7txrbq7{v9E#lKv_ePAibFYhz-Sn{91ejklG(5;Ps$F9d}NU_>e;mj!q)qIalfTs$b2U&_5O9+6&*PUCcB z=M+wso53e^O!AG>FNs*VsYqWZDH_$Lq=dLTV`j~eNN`FlzyM|p!u$$eiLq2Hno8Gz z6|ZELOEM8NIYBwYqb6LfphH-mhUOtuT5wI{F{qFc*qwI68C-+`_UQDQg)@k_fvbaf zs7#o35IblKb&A3xL1O|FCc!llIRZ|GCAoLurc~vt(Wy~{1W&h@d#xvQ#xY?~0>u{I z6PJ`s9ye*kj)~W5Qi^k+i50j-Sdo1F-;>e8Hh@ZvB_?BGLJ}|L?NWVXK4NqyW27V5 zQsh*1{1V1+Y)Sl0(n0c$luj2|nu=E7CKW)F@Jk<%x+Ce5B=r0tW=V{B-Y{J zXo|?7VHh)vH4(mGgbeRSEX(Ljr;{{lWGVsiB~(E!p=J>Rq+dA9W(s0P5$YzsqZ*ZB zU>D=TB^@E(&2&);1ze{vur5hnnSg9!O!MjCOUOL$?;f|O^D%$mt^p%FJVPAwyB)Q( zs28z5i9$*+R9y^TMxtPOT&k&LFQd;Jtw~vG5|zmUQqBD2N)bz>a>Ng7;tZOCl3L_G z=%P{xM(mgIQnqEmf<8^Gi!JG}F1*g*VRSgkPYPH;9ko3#JpI)~oiB-&q>J-dD!WN5 zEZmSSiDS`{^aP3~`Ru7RcafiRZq{N%BuSB7qL=7N@g7PP(UB7xOHs6a(r^{^qa6$nkJ~%zxfi zIaBj3|54LspZ==pGm)ZYeSYf@a4^3RUNpjk;gK;!WV^ygUSU{qh7|=EPvZPaFVf>D z)i3$L$@14Hs7FYbinJ(kpz>% diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 1d0d0d95446450f2ca0c26dea2686eb7727da475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18538 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json deleted file mode 100644 index 64dea58e4a03f1388732f346320f253032861aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14324 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 CpuhtF diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json deleted file mode 100644 index fbf1b494d3042f8808421e61df026cbc409fb875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22136 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 CpuhtF diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json deleted file mode 100644 index 3f60c21b6351d2dde2d58b3a5858cb6ba8bdffeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28239 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 WeQf;T>CeAHwus@+|F`;Gvi|~JllHs- diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json deleted file mode 100644 index d62434f6baadb9846364c73e9adecc40ce2acf4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8203 zcmai(TW`}q5QTZ}uZZ%@gU|TRUqQ$UiD@F5x+G2|g!=}pcaMS&>TQd<)XCHP+#%^=oA2(y4RN35gWwm}* z^x@@&^{GE!ZjvESzI(J`I$`*+*qSW9PHxfFF z2Jo92JkUa^oB}hv5J9bLx~PP|bDR+w%u)-(X;x&k8|x6Y;u!@VfYJ?As_?i1Mlm$v z0W}>b9BCqPB;jFhi$Ji<3z0*n_=*@TRe((7&^w1=En@)zf|i6sj^N8cT;houYZcfi z5Udb%!t;!kcp{xbzY;!b;1u{E;6vrmSPha!5C{Pldi;(hgxTqVm{(K}0^m>cza7AA zu@JVXGuw@Cy13p|I*)01UybX(>V2U?kv#3TrkP2ovjS4SU0wkz@~nR(FLk5;>wlUT2wL zEH6|0zwFCICB*{4w70k}1qR!TAcGPpVi^{XwB8SqlXZ5MwRD8#6oL~>5rdz((g2Zx zA;r$lL@>#$)^I*h!81y1l<-x-HDIhDLI`{X7_UU$@ptP{xIvu^ltvC-Q(M|Wq&Lu7 z79Oh}95I-G#0-OB^$zJd&DKmFl3s=*Yg)L!(Um;l>d&xRM&aht6 z=+%eskF5_+dA`7E7|br);OHaHP9!E{Hp0xfkj2faCtXKiI_r>^kSjjs*3^>I0wwST zHhb1LfzMUXuGzlLp|<{Y8BUjDx1a9#rn|c3bsW?HpiOC5MNbEL&MLGOOOE^OK!bR& zo|e4iL?pr%$!0Z$!C*4l&6&+89NZdH0r`(``jkXp+XTWI!jZ*??DAd6oDbKxoAGi= z*WpXRi22xn^?2E4*$2qkJ(V)+65uPgPsViYO_{!8HkAOrCp5juUR6exHd&ip9#R-; z{Sr&6C4-^D?$<0HY@*e`83>0x-xAxr#b8bo>*h-)tQ9*|&{0e{wuRos%{g-VF2RwC z0k=L-yy&1CXqI(UcCo?R9I_>GY`0j<1SYFkuw}vHJ%;Ex@q#AUc8PUEyaup}YuQ5( ziniOJ%@LLeFpjpN*9J8!U*d(GF^S0Z6`EAK!n-Vf6ESGo^Z+Q6g2i!y0@x6-6E~m& z>b#C_-fu=u!{s)8a$J<)_4o7%v^z}SK;LRoWCIra3&069xRWnA;FsA@Ud4| zR)U{H9ALC0a?r08jsIMU1wW8*5_|*oDCs_0&{Csc6f#b$^rgsrmRCjdZnN^--;TfU VQoEw8dVMl|z)ydk{(b(O{}*g=g*yNM diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json deleted file mode 100644 index 4ccecf96b034cd01f6daf3bed5fb1960dc1f1d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10871 zcmeI&%W~UB5Czbz^%W|vvtSP&AoDA!6pNM^OBG3UD9V+TOaC4~FB9k5aTZxh3rPS5 zGd;2v2m-8?E<#1#A_J4nMf7~99n@@-R=J?m^Ce?Oi*p8a$-nDIwe zz1NB{l)%f^A(PDGVSx)*O$W_mpuq? zx5wQe%JycnSWaH__4xY21vyfzLz?!pmt=L*?pmfQKp(}MU!yId5DnU49z>EQH&Js0e332Hrm#C?x zOdy16!IELpp4P^yU9m=o9@_#-){Hguj7tAUY(1f=`|vh|Mo~Of;PHkXjBLIf%rJGt z${A&+YRDV>qY-L~6>18&D!>IA!)~pRQ%eWnXFx-{uh7JT@oTre#%XKLHbYUWvMrcX zH(w%C(@Sg3n$Drvrgo>n@-oEtKrQUnMMi#kfc+KqNd(4jjpEuO~K=3S|irI_nI z&<=^zxe9*|v`=d3e}S$tGIgj<2G3Y$n28aQqXeCquCEkAmI$Yi?)1R2Unn_`rC$cdBAY{xnBFHwkDa{z@1-_+Gvo+PG1bP{O zE!4^ziV#b(fQ}Y>Y^EBTN?U$|4`4>;sxhMs{Ga zRB;e7mawJEt1f$wP49{u3q4$tuoD!_Cd{-^8QdazO1A=JzE+&6I><%o!vzvbOg&d9V665fgL%m zyp%*#!WL(Xn4&Rs#(-GVC>CzEHlizlIkQSq*HM8OLo8Xc$X!*IsW zp|t*JU)DZ+cps39zEK|9nu?e{1=E?E>b|8ndA?TR&}!3$!hh&-$B|Q-l%Np#k|8ym zAyCmQ$HN}FXdFA}k&r~$7B9OPR^wtlbg9Eeu&bp)=y0ZmaXKI;SW;>5$OGfR)EV7Y zWKTVJtM4h>1VtQK;pF6POU0i3d=Dy5B3TzMqU7`ftgG z@2Ey0c=BQRu4{AMf7st1S4_vGSD{^)_HBHnvcUsaffy`>v_#4a@el=fxH(7bfZ;yX}8q$^iW16>- P!&iyJ&-34xZxsIl1TF79 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json deleted file mode 100644 index 92152079f156cba97998975b5dea517e86430198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10621 zcmeI&O>P@U5C!0@bqay&ELhFIp|4^D1T8U^5J_|>%1B`7?wOHfn)5v;&H?O&?U`A%QwNs_P85F+1_my%gLLf zp1=NJa@ajS-3@MnlodL-ilK!(aRb`Ay8}lp5;*qqsYc1li5fN z3fY>ocXb@CHBh=_$Iz9!m|>1J+9^O;Qzp!q(B^DWbG8td9&(AAYRUpas1|G)Chci$ z>>C|>tk7dyV9A=Xhn`XC|A?(8G<6@|hR`UAQ3W0!*vZI-Iz(paQ=Pl5dC|0bso^G; z7YGsRXqZ5@YBN?yD|Si|^fN;&?Yw4%TA|986v>P}Dvyn`!m_nQo5FL6(=8CH>7{c| zrPQjf3K^R;%Q#11l=JZDWQ84TtET@wE=kr3Z8dpyfq`5gGbW}m zm5d$P*SBi>Rj-i=x2CG6_-aX96+{y`3Tr0Kua#V$=b+j@>Zvg~wa7BZ;~bIAv~&F^ zqf#2cXdG>^L8w?fM{#DFQO3oxeu#`M0*(bl)bdS3cNp3X%{nWp)&&a)3zOXzkvI}) zqZ}DUSzqWgM6MQ0!US{vGKVSQ5nkT+lg9X5f*@Bg^hYAAe`V$+C`|{YrY1U~lu^+h zqDgL1r$^PS+e5fP*N@?%hEJhE;^&>wJIVCCUo75BLTlqWdLFd zLuQqyqL(+a>>XJ zES4&+JjN2Xba~Yk-8#K1+|8C@nRrV~!EC}z86&;bQYU{t?GI1)r#s}cd6$=n0q8<#bg!nfyJ&=tV400@Kqwv} zr2 zu4Y})V?{<4jST~`Y$=YTi=`*%tZ}_oVLba7rRL&NHt$@G8`0s6h#RSfAS}-wT_Br) zA|NY~i2}=dD!^em6uel%!|-SfiOyBRCw^jB zY37LuFi#R67evso??M&Q{FKH@@H?n?2~poXY0xi$%xcy6o27^|=G_@2#>vWCetZ1; X(~z$8pY5Dx4&Ofxe_sE6`x^2ecG=I< diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json deleted file mode 100644 index 610f314274a8ea11b43e2762021ebc113cf60396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11302 zcmeI&%Wm6N6a~Nl20R zp2t4>JTAXny?ZzLygNSb4-b>~@4obx!;R_N|NE=Q)Ao4Ud^#RBr@uG1+sE7f$KTEm z4iC4*;@AH#{%baP@yPG5u9;jPo*quUiO!Is{sZ- zL&g2>w7uD$wiih0U%K7xKi&@eOy=Eu^14_5!}Z~~+g#sn_Ya%9!}XuLo6Xy!wVKW^ zp4@#pTn`YNUfetF?{}N~$6?)CRhvy$tFG2nmpkg4e^uNw76hGg1-T(Y^ynPvJ=f{_`@e6I%jc?T4E!S>YD_&Xg%9>4a@*Y6`k?%^9yOy=IR^EP&XBv6?b8 zR-F05*ibVtSH9oE<8!obQ(=^g0*X-@7;M{NmvT*TxIoLAW2Y9*5>*Qg6Tl2LIy4U{ zW=K&>%)3C3;ySIpa!K_NF=PKO(J~CR)RL^n_5!+$nhuS7;vGwrfd_mN(hJ~I<(f#j z)T}dBXbV=TPAT+$o8f(hShGUO2Ccd25@YwtZEUO+iUgomY^uK({2p;(G>6oht_m4j zVcbYm$q+4I$r^JM4?WU>P)Nvae4DAN14Y#^p5&XLnW9Fx9EUeiR;HzvOQL9#;@1Mz z7%hpcqE?7>+1zz545r>F?WtU2te4D2w1m(rK-2;>Slj)>;ibdF8`@eOo2<}W6DyTm z6%1Wb?KJeNIi{*PI7}%2G=7>T)C|d$q7kxvcGv{zXV?(g zc-gdPG?dVb5Nnc&iPv}vWGS)c40f^v61&Z!DagkLL4(^-)D){mT`tiyLDIKtV>fo7 z$c&e%JgP99S*5cz?ScoI4@3om&=pc+y17gf(W9Q_6JffbGaJTEAuw&JW~3G)uuSBl z7(B?>;i^a?hE20Usj2RjxGIR|XH8S+T{fw~^C+tSi{FvC1tiBoz~d~YpR191Bge1+ zV3f>SY!D_E&$jGYB$^jXvWa>-5{_&W1C3}UI^xv&T2gM8!=|B8wdE7gwkj<$u_Z;B zB~J*gs0Ph66<{^WBegFbl!#?~vrt4-`9SkZ^YOSB#vUCleE3p%~ISdgog>#yDB;XgO3_wg_$n5eA zT!SofjdPWfWM7KSp6xYAwTP^JK7kVEFw7-@uUk*dNykv-M~ zq|`2EbVlSmfF1>Zv?a}=Fox7ojynbuGS(WAWSeSAGbVb0Z)+4YusD&B0SuhZ8;THH zlHdeG=-4bZbd|pR4j;gbTp9$%8CXLBpypy@4(3-@F6Zj9PPCO#OGb5Ie_a-jh}1IV zHCN19jjrYm2c_k7)`lvWO_=GUGP#-JOS%=9$vRHorKvbKarRes3$EY`7JG5b1)taI z<F;I)ujdS~|MU$k3529WckdMLa}JD=$?Lk*8RR zT0&E27>oh2vPZFTbF>jt0o>Ul&uQ!EK+GYwEZJl)eh8Vz{l|yx>FGFpQo%O>#-m50 z9y3Ms0lAnPl_v`QM-pTISUv^QS(_TZWi&bVs|aYV8AW@LWfX0pSGp8Mqh2zlMlb{_ zn(cV_!y-D)ne3q;iJbpC#W1GDdf3u{jbv9#g)rbO3mw}=eA!az@Tdbz%bFZjD=I2U zBNDP~DUM@`Wh5A^aX6aJbGTMoE{@dm#N50Q6VAxE5j`<1R`+PM9RiAg;OJ<2qfv|W zm7mneBqh^(h8`1UXf-4BbEm-_bf&!?eW>CgDyo*X^`9sYd% J_vMq&e*u+1Fv9=< diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a7883..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json deleted file mode 100644 index 396272fa1a1883de3ee586149451ec124a5798cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10979 zcmeI&-BKGz5Cz~|^As*!=R!UD&#RbkPm@ zJ-goRPrIw#X?JGp;ic>S&AaQq(qz7#Pd=|dJh(g@_uI?s-Oc;$?cwr|{nhq$XsxF6 zvyuA`hszFTaX1vBU49Tf@zFU5!_7JHnqHe!+Hs z=S+fr**?$TFNUX$8?*8A8IQ~9X6x|_%^T~*ctAPh>`e7tB(FDTX6Vn`W;~(SwP6pd z@%UPfuNAlypr%Y%OGK_vOG8gCT1%u@pq4eyXH3}65!=;Lb4JY3Td|8Jdf8wo1Zs`< znI4t!6xq0BFbj!6AzO3St~Fb04U{ffF?6LaW|(7xb_!6|lmRmav^h)EoF&Ain_Qx% znlgb9ss&4iNe5aR`^K6zR_L)Uuw>0xL(i!6f5g@knz|2fLueGmQw1Jx*ult#Iz(pa zQ)^e-aHDDUQo~IwFAyTs(J+B*)n?3)R$MDZ(9aC9wDX1;YK1CWQY0gWs5~~#3d`0K zZ3@pNPPag)rkBp$l~Sv^Dr9WZEYH~jPuUNb4p!K)wrcwC&n3xPp{*vbE-;YuN2nLf z!EsGmEU??eRdY_2BHAm6c7qM7v9AcFHOFJhfKow(YXU%2LD z3G^=)1W)5j^e#!W6iAjhe}wd>6z)ez?`r5jpsOMg0jqPEy~2Bp4KX6Jp`bGhgSA57 zpcPIb-RXg4F=Jv1Q_0woeSN96pY%PX76=uK=P1rhGs?JF)(?@fMZmFuh+4jB=rx8mL$l6` zs&&Bx!op;?MI?>{+9*dxQPvmw43Vn^lQ6)XzszAuc!ZY^{iHEImmtU)4E>SF>R*|8 z2};vJsi}#MC}mW%n`n|-)ag+*>-G?CP&OG*Gp{fgjBHYBYsHjWLMGwb0#NL5y#fbW zBpJq-Ajw(>^947g`-I&~Zi+gs6tc|sbo;RD*d3a6Sum(TsSTW7E?Jre%SC52y;em; z!Gx}xaU|dustiC(VaTlVbX*-fVvRL!&0S-`4U3&tYk_z)g^st?+|Dl+sF(Tdp^yuM5r?Ht7rgwxmUW`X7`bF*2Np{eM;>DdTe`gJif*0W74BxsuuQxqreHQ6`097 z@)EvM3l(GUudEiF!52*SB5#7vYxQ#A+3V8RW8!`>`Sam$e7MV#`u-3x09^=;?$va5 z7md&nEVB^~2*pF>wDM9CQE45VEnC8=a-_n~r$xDY;o93$j zp~oG^-f2>Tf+z1~NDXHQR5Z)+u!k;M_UTAIW4vwgvWsCgF4jYrI&1{HTEbMN!42PINu|Lf4~(N(XLMVUQAK0JfGk^zb&K1QjzIF!vZSK~%>I3wal zsv!u=y+;?wCZGrij*g-?3biOO%Z6PrNy+qnm=Yb4*t(%1s(p`P@u!l4qjl*7CPZf9 z0aT#wml5l4CnLw-1_Bk!+I*fVL24MSi-~b zXbg$YRl+A;F|0K6!~~c-iH{2+XxMk53Tb{yV Date: Sun, 21 Apr 2024 03:48:19 +0700 Subject: [PATCH 09/65] fixes --- .../v0/v0_methods.rs | 6 +-- .../create_genesis_state/v0/mod.rs | 3 +- packages/rs-drive/tests/query_tests.rs | 39 ++++++++++++------- .../rs-drive/tests/query_tests_history.rs | 6 ++- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index d934f63a7b1..3029f033e43 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -16,16 +16,16 @@ use crate::state_transition::documents_batch_transition::accessors::DocumentsBat use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentReplaceTransition, DocumentTransferTransition + DocumentReplaceTransition, DocumentTransferTransition, }; use crate::state_transition::documents_batch_transition::document_transition::{ DocumentTransition, DocumentTransitionV0Methods, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::{DocumentDeleteTransition, DocumentsBatchTransition}; use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransitionV0, + DocumentDeleteTransition, DocumentsBatchTransition, }; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index da357ec0ec1..20a540e4f39 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -317,7 +317,8 @@ mod tests { assert_eq!( root_hash, [ - 123, 106, 97, 8, 95, 223, 24, 44, 147, 229, 106, 103, 31, 32, 29, 97, 198, 204, 237, 215, 138, 194, 34, 107, 129, 234, 97, 250, 155, 104, 75, 210 + 123, 106, 97, 8, 95, 223, 24, 44, 147, 229, 106, 103, 31, 32, 29, 97, 198, 204, + 237, 215, 138, 194, 34, 107, 129, 234, 97, 250, 155, 104, 75, 210 ] ) } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 136311c6e9f..a696c6df347 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,7 +993,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67 + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, + 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2304,7 +2305,8 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 60, 109, 98, 63, 192, 76, 21, 51, 95, 13, 145, 173, 155, 30, 5, 194, 221, 33, 152, 195, 108, 127, 146, 37, 82, 5, 166, 38, 67, 162, 1, 83, + 60, 109, 98, 63, 192, 76, 21, 51, 95, 13, 145, 173, 155, 30, 5, 194, 221, 33, 152, 195, + 108, 127, 146, 37, 82, 5, 166, 38, 67, 162, 1, 83, ], ); } @@ -2450,7 +2452,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67 + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, + 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2891,7 +2894,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 124, 137, 76, 15, 82, 78, 62, 179, 206, 204, 2, 84, 187, 107, 28, 121, 186, 221, 98, 66, 187, 78, 66, 70, 54, 10, 193, 108, 39, 59, 195, 209, + 124, 137, 76, 15, 82, 78, 62, 179, 206, 204, 2, 84, 187, 107, 28, 121, 186, 221, 98, 66, + 187, 78, 66, 70, 54, 10, 193, 108, 39, 59, 195, 209, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3013,7 +3017,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67 + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, + 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3161,7 +3166,8 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3712,7 +3718,8 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3805,7 +3812,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3898,7 +3906,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3991,7 +4000,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4182,7 +4192,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, + 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4382,7 +4393,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, + 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4586,7 +4598,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, + 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index cafbc6cee40..ef1e5528fee 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,7 +291,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 54, 217, 155, 152, 174, 237, 193, 15, 240, 181, 31, 17, 238, 127, 246, 92, 20, 222, 37, 39, 104, 146, 240, 98, 159, 130, 29, 227, 5, 94, 69, 207, + 54, 217, 155, 152, 174, 237, 193, 15, 240, 181, 31, 17, 238, 127, 246, 92, 20, 222, 37, + 39, 104, 146, 240, 98, 159, 130, 29, 227, 5, 94, 69, 207, ] ); @@ -1654,7 +1655,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 117, 239, 44, 103, 118, 107, 30, 109, 225, 15, 234, 90, 59, 0, 22, 79, 32, 4, 94, 225, 241, 206, 146, 22, 138, 217, 87, 208, 96, 176, 216, 114 + 117, 239, 44, 103, 118, 107, 30, 109, 225, 15, 234, 90, 59, 0, 22, 79, 32, 4, 94, 225, + 241, 206, 146, 22, 138, 217, 87, 208, 96, 176, 216, 114 ] ); } From f22c1aab82b23dce17c03c85d286d5bf5937cfd7 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 03:58:01 +0700 Subject: [PATCH 10/65] vectors --- ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74128 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24209 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74128 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 0 -> 24209 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74128 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24209 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 0 -> 24335 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 0 -> 8837 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74128 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 0 -> 22299 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74128 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 0 -> 8837 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 0 -> 75594 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 0 -> 8690 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19700 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 0 -> 1466620 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19700 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 0 -> 21205 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19700 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 0 -> 2668626 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19700 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 0 -> 2437729 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19700 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 0 -> 2425355 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 10644 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 18554 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 0 -> 13407 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 0 -> 14334 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 22156 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 22156 bytes ...cdc46e3cf0d7d4ce093bba24086e17410ed7d.json | Bin 0 -> 28889 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 0 -> 8229 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...106e5eda740be44679cc960ea35f2134af628.json | Bin 0 -> 10897 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 0 -> 10645 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 0 -> 11313 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 0 -> 11003 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + 61 files changed, 25 insertions(+) create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.791831000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.791314000Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.792844000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-20T17:32:57.733023000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.792219000Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-20T17:32:57.732964000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-20T17:32:57.729112000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.792584000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-20T17:32:57.825471000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-20T17:32:57.819765000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-20T17:32:57.844598000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-20T17:32:57.853232000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-20T17:32:57.858773000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..0528f564cf7e762ed8d49371c89b999bbd16f7ed GIT binary patch literal 74128 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..0528f564cf7e762ed8d49371c89b999bbd16f7ed GIT binary patch literal 74128 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json new file mode 100644 index 0000000000000000000000000000000000000000..1325a37dbf1ae244fe10f739c30802fef6748e81 GIT binary patch literal 24335 zcmeI4U31$;vWEBCzXHW_l`l5Z;eet(_FT!ay>YV6CRR4dN$jIQ-Ror#`1AE{OeaQ&rZL5_Tu}me?0zZ_W85y(~n=gdHm(ki^o?l zJ~_CkhW~haRzE&C8@Q*V)t&a7%lvBnl)Il}qob^N?4S6FpZoC4%WP8nMhF|Md^RqN z$*m0h;Qg%rD6i*brGw*gw3zy0UVma&Eid|Tx%?;oGFwc77P?Pb-}7QI&n_ljub)?o zwqS1-dFAWpV|z|MzkOPas@vJz)cCku6k|XB#0R;G#bnZ2O!uBAe&;>W2)`_Cv9XU^ zo+;lJzIq-_bnx`@^yK5}=4Mb7A3htOT^?O#58?I35NYq?jSbK0G0ao7JOUOR8|kQq$pM^LOW@jf^{H>dgFlqmwXiZ&BoL7D0%B zrPh_5=XamIR?|4EuUBX@(_`lMRZ-s>^Qnlv(S1j#xl4terxvDtf`!1?& zllAA86?+{$w=LD1MC7&|B$|BXB=x+?iz``RHlO<{hTi}EHrxB@bnlz~-pT9D$Gz7- z_dhsvziiIDe#l9tdGR-2T+OcySOefwBhep>3MbE2iC&iO66 zdPjXMBW)86OxQd0kyysF5N+uznU~3=eCw-GR{O-VYZ5-}zZbkpSTMzv!E2o*z!Yq4TT zBHgrDR;-@P=hk<5c;$_0`06Z+ta}Gev#QE&sj7?Hxj&5q4P%0TS>Ag-_tQW#2lPGj z*_~spw0D3hfwLfUvZyTpTQCffakgBH>ANX0cIUq(!!qG^ELmuC;t06pcU-hXcMW4ZZN=Jo{oXo4W`SB3~m*?1gjdN%3I(CJ?Uk&LFcf%;)tSkYls`@Er#CPAc@CaJ}-RYjc`HC


ZDbm-W@i&8F14vb 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 iY2bcKuRHOyQuE=U3H4GygebQbDUPw z*ZmyTOP+O%JOj$QCy7ka$QjD$HVC{>+uTM?2c@(>D%m9y7`c; zxc<7hKKupayyixNeA!(0&lmPoHD3SZGH%Rv-mb%qh+%$U1h>R>sOO3sKb#M-Ey{Mj zM1eg9ywK4MEf$2T`IbHPXz)Tp#e79n-TX$+GhnM0N2tRBHBe)q8a%Sb0yPklG6^y@ z&>?OEB|D?Xf_knqj%)E4o~ zWQ+)gG5W0m=}#d$XD;%41C?mz2)qytbP(fO;v2M^N^FWtW(Y5)h?g$_?fo=NoY7fDniZG8pk&O!UZaj9u<%C9D8r5p%|?9i$csC3Rm_R zN2ytt3TFhFnjoUy!K}+dfCLrHcw$Kg=cxq7EVQ_R2=oEKk06c>V@zSJ1O^}|N}OT! z430FzvQ%K~i6R)Sy@LnP7=)&sWFTd}G3I2aCZ@>L!{=!;-JV5~;XJ=tJd`4FsWjOQ3yB40DygZ?y*L1>A^p0y&u)VQN`7%NB{$DNiC4f^~>U0+yKQav5_W+<-$14?`|wB+_NX z#T!8iFki3<5;=l>e)zNkbj#dG)(EnIdMGOEo4U)WGLL`WX1V#I_~$h3PrJn?4L8$} z5_3p;#Bspfzy`{4B%Q?U};)Mqe#S>*t>94W4#N9kK*K;DckA_8+03-ZH8bBLBL!31iHN|pdR$5%zKtR z!Gs)nT6maRR#+NW4yFeR2gZlxEmqt%=VIe%xCV1riD1nSy~QrjLRM_@Oh}TGmBUoi zCe|YC441~-sC_JxF+-c>tdwDFu%RX)r~$^_(Sise3ESjT0~DiFGSt}{EYxkbW!))~ zK4*AgKt}y!dDOGJ&!Z45Hlri^$v*Hf={50Ta@kL(r~HwBCV25Re+ph~)3@MvYZfv( z=dJWVYhA;f_X%DN&m>HrXjwOs$-HE<`q^d!RD{7|m6UZa{Kmx2U+e=+b!(!nLL^69 viwfAXqk<)aLl-e=poU86^+P;eYTe_%&$(Pt*}lD*|A-;~d;S0NCk_7rAVA#0 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..0528f564cf7e762ed8d49371c89b999bbd16f7ed GIT binary patch literal 74128 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 ed)@c{_m5q>G7e9Fz4F7ye_j9o?!O4#Tk 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 HKltSz$Dyc@ literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..0528f564cf7e762ed8d49371c89b999bbd16f7ed GIT binary patch literal 74128 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 x$~2xZ*S&5V#xnq|G)f6!+%w5+~NQL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json new file mode 100644 index 0000000000000000000000000000000000000000..e5b544d05db47d1f97c8c0be3c10b8439fc631b5 GIT binary patch literal 75594 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json new file mode 100644 index 0000000000000000000000000000000000000000..b0522e468fbb350016966f27936a4859939ef3c2 GIT binary patch literal 1466620 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�!SSFzn>W_WxNQ3G-V+J*nf^Mc*En3gRbG3Wbq=m$ z9KQivG`GhHG8;C{6DtwsiLDbpJWqTBjB>3$R}3@M_293AdX0LCT+4M5uD87cxW%%t zyqPbyX|iwTi@hTf=ygz^ak%=dK3A3#a6DG8e)D<8MV#wiea@rLtWWQ?A<%oi1g=Is zSIvvR=r;s+k7JAi^;vyBg+8My zDA#hGgX^F^!+3yWoD5AIyxlAle$JOO_Hu_;oMyaZy0EL+FTCAt;uqPi{)oa)u$#EB zTXik(dFC6~MnB-nl>+O5Zo#|J#KGImH3RHV(f!q+qL4u-Uo*Y(x z#!8_+zjHND{LT~mcH$hzDU8$4gfo_zJUE10lbPP2JiNJw}0ufQ%x=C0{kZEFTDEuHMf5& zVu#Dj2f_=#@nzzWTxH*@5%|ExFK_svg^%kNnx&cVpzB+mf#S3higE{a^qqwtalD=w za1jeVJm0Y*YSk6fN`&cN%M(oR3Oki#wQyK{fi7>QAv8d&u z9ymjx;7kOj@GTR+R+t}wUARhsdQ2Dm5}dLpQq1=1@8qw*pEyD73g0lT7FS#na?XZo z5sj6fS_=dw*a@(#W^i5znuKx(@T6@uWLDiW<9AqH$~*pS{s{gNbY~>EtVTXZ=~`X* zJ8~4P2H_p=V9K+yU;HcYR8<~ORxb0(w=kKRFxXj>;9mix@h24?PQ}IXco|m}ucC=l z75=Hyjek2SSPD6`I1R^Jf;AXn2{SxMY; z^%ls)xD|R7^bC8da5S%` zifQ#D-iXK(KV;%!qRbc^B%-W51{mUxd`}P=MX&LPzkf4&5Hlry@T#1SAB84|AH98H zNATNsS4-5w0`;`2zu|W%GlXcmQg`U2SIe5!n7`rraJZ}%Eq9D+E^^WBg>uS{;xfAs z!b0aftr%Om?^WMYCsw0lm8Pt^lJ{?Ndc_|;ar(pSE1$bMKNlhE-+8sjV7UMTW@Y#b znOn`DEHF(hb`}CLQ$#3rtHSe2x_HG`YbE?$(`u>1^3G}^S$T~&41_|kDWCM_>)8z> zg&q}p#i2>c+0PTF+i8^vtR{(71%k6o;aUok!#|Q8&v90`KwOn|$ndJ*Ppd@VS)LeK zbYo0hZadk5R$7NYLZN7zrWHpf&61ckYVx_vggoQtJn#*snc#qHD|NO6i`{9>= z{QTn@9%}LGcjxrHvMsCU-dL?)-O#~x1|vCol+_71qF3`Ams4b|a5knYO`O%J{)O|$ zs%*vCfNO{~&MWO)6?+Ig=ZMuPTy-V?4vOVE{#;EvnD4pPT@8=bpT%Y1Y7+W)!Wn2M z$H#+n0uB61($_8p7i_hF;E!N2f>&!*pyiNV#VV^`a^=ofH!|Uu{&&h7=(*L}cEt?- z&eeK(y)0S%62G0i>XWe?8?;swgjE)|T7a(>2`fEZ6-HON7k{fYb*m#d?XBi?E<~sj z^e!uVP4}~!N6Tt$g=uajGkHmQ=E`;*!H}?fUqKaImbL6xYYA1vD#M zg$u{kJutM?|4x8Labu1Md&la=yKCJBIIkBc4J<3_^!gw2)V=O6|L6a$0MuMDG%$m! Otc9{5G>EL_ss#WE{(e#b literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..348f1953ea70832d271ea0c5f015878ece72bb76 GIT binary patch literal 19700 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json new file mode 100644 index 0000000000000000000000000000000000000000..ac77510963d614ba5c340eb14d253ea0dfa7a6d5 GIT binary patch literal 21205 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 I{i5W50O9yt$^ZZW literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..348f1953ea70832d271ea0c5f015878ece72bb76 GIT binary patch literal 19700 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json new file mode 100644 index 0000000000000000000000000000000000000000..47a7cc84c41a9d724c1b9f4115a1c6e89c9c100c GIT binary patch literal 2668626 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
Tz;jnP>LX^4MIb zjzSbTKX6_pxyIq1FFaoa+Xc7=m^*#Mt9j-s&aqdYPovN1sHo5Ca}9l_Ur*|_`K5YY zvp){SO>%9XDc2>rPI7F1DaR!_p6hqqV4yMF)_!C}9GYMDDPw-wtMCK)B^>dbzrF!Z zId|O{SQhB(P3kxLfO0L@HMq|C>zjFEKTVF!e)TBC@%0(gKz&x9gY61j!(Rhb_zFIH zGhbZAI`-=IY4jQ$5A|BTuA$dd;O){oM~ z)N}Jkxj$k4c!x2;5N;fE2AK|r=8w;Fgx`}FWyt4`U~Q)#atC~JtltjoD)^FZ4c+4! zkIS`O7vUNmj-+0jH+FL{HrJ7(5XaYROat{=y$-eua1AiwEBNT$d~p@$*sIS+)#q)D zRcFl3Zilw*)#kuRNLA6&`$D6orrY@rr1=2(M z=xu<30FZcjj8y4ZZOSc`QLtl_2E#?GlXUQEozya?t~oe)FFco)~rCF7{X;k>me;>vLB#kdZ} zw8tsavA|_uxGnsMZa6eW?2wou_A2C4#3?VmfJL#^O9zDoOvjvBqyHz?VqF94oarz{ z?B~R>>7_>@4zJFb1gf*@9B5a-8m(n|YmNajTnAFd1!J)n`y$wHw=Z_E#*@WbtZQJM zQ)fuO7>jWYjORKbri$?{uA589QHg?HJEzvBj4RWz7wbY;!w#pgzQT22xc$W;k>jd;>vLB#kdZ}^wMnTWydLXzrm$oxP9V4^uwVkWQWWYvR5IWLULN< zum+1_trrgpk7inK=nsmq7}vmfPMu91`#EuJdht<+0_se!oiiOcTD4ZK1MLb}Z?EIv zGLSmnFcxdEu7Nf5b_Zk30WlWi8W_)cX;a5xANx)(J&IAmbb!n`Z*2-G=HI^YdgTh3 z!&l@?iK(Pmm&7`S@f~Iw!|fS@sD?vR#6Ckz5qlNBI7PgJMX`3t7!+189q`sUwML^v zti`$r*4s`2+@ddiH&yKC$g$Z88HFgI);V>?(WUYdPs zj-k&xrUZ^g?8Uwa_8>EdHRg<1i**gGa~PW{#=Ev|E*VE94)3*16<4NXFV=;yhHprz zHK(PfL(>sx6N?9+YFEhN3l6wr{KYBbiz%aOef(=cUeE|pomJ;EsI#e}>ReKt*_Y;+ zuIBp(JwhBqPo#Q(s8(w@yR{2+fgc#&7Cz$@C2tQDxi!2duV`qry6pw8i5F z*McVS*{-idAQqU`F921HRp+3Nr-Q?FK5#Y? zYq2hZHOS1VwW(r1CyvedWfbD@YK=C!YOPua+6AyqsWVsIVl2irFrK=;`hoU@Sc`QL ztl_2Er`{Xq)E$i!r-9R;$TUC?FNZZ6`(iEDHL%WMjHAU^jB8*#=e-fvh_zT3!5ZEh z`U|rRj300;VlCE1um+hqtT89VTC8heox|9aG2XRxGi4l=C=kcYd1+I|mFd`vbs?O_xCX{^ z>THVG&xvExTaQ8%Q0F->4Q*GgRqH^z0@mB>IJgYNFT7t=ti`$p*3jD>j4=nqSd436 zJm;m+4HRp!E`l}4q_^fcr{<=P@h-2MOUO})!+UL0$Cc^Wi*+5WQ|kN%7lI+2I9?jj z4Tq+R9ST#$UWG4C72m+3SnIWe!V0DXUK^6S-5Ghq!(uJgMX=s>3g8xf>o-%zevTZQ zUV0RwfLiC&8Aq$ms&k-R0OP5?^&8Y$ti`$r*6`9(ed;$j7%>;~BAA0r*o+--jX5IL zVqF949LA=I@vg0#OTAQ57m`wK5?AY|@qYwr3p7SKhH4az* z)&F3-0M`H$J_S)^yWk(>SdMFOJgLv-aUG85{B(oSz;Ijpk@;|F9@!}|kL*?Wfjkn9nEmaX4{3l?&h^)U zWdR>Dso&@W%C%hA;5w<#=863@IX3z#sSkRqcvC+6xZ2 zWBdc_M*NC=!S5dg2=!=mYh#Vc;m(}Fk7};~g5Pt))=gXZW?j*IUm9L=;oE^H z=tJuGkR-=o0dUDNW`g?sB)z^qL!spQ!|AM1;pO_vxQ61gU(In+&*7WoUha#mBe%T- z&a?E}3qZzj`?YDXKU({}H7b6TetUS`Z{J);Mk#Xoynsc(CCAVKeaV;kl5O_zzI@VW zJTBMzjv~GTemkkxXk5y*To>VbPOmWysj0T3= z+K&u}L$BZKlz2a5ufh*pmkNKK)9Wi>lxzKTU|7I+OzJiIfO0L@HMmadvw31aEsjk; zJqmGrea19UpVjAJy8_qn)9hF8jR7`%2;#?f#XmR?oCihb!FEq$k83*l;LI0i9YxBny>e$P5A+F(wb6nqGJTTmTZDc$gnm=|* z%pZFd^7&(uW56fJ`su)~g74VY(4BtA4UfyUTo>UQ9SrubllpBQ*-w*W(_fE59ACdN z4b*S-JJ>G3HNb?=Kz!J4_y;+b;~E^#^{a1i=W;FAMYx8)PUgVR@%*%T;tFx><+u*VbAFm%$e{1gcLdu7^qKwXy>ZT$+|3`=^Kaiy_x&<= z^aa&(^}L3jC-vEUQGGt6K4TiF&+2mxeWt$#sPGkt7uy~GAlGtTgzKsP^&QWaYq_q$ zbyAaDDI@cHh+}!nw-NS=X?o+CjGVk`iTDe#XM1cKBGRP@25Vi z&o%UU&QHIXFRIsP)N9yp^;*5Iq1ONtz5?-Kd%-`*u^iXnnAcm=hh)ded4X<=^TK&i zb6zC5Mz>t9<+=vfNsi4U<850v?-Lu9V9fCVRqcv=?*#|kG0uNJAAJj7@cReBf&FeT z`2E!959MkN>zQ^zgXzix7XHI4YyLoyTf=MKF>b`{(=v)r;O&1moQ4UChq6U1-eL!hBJ3w}BW;&C~a;~E^# z`RNCom|V+s5w78<+0RbuHx8F`IWNNb_Sz1<tRfgHGr{ z*r_m2>{a;cJnh@~>*iWNl z({GPL6wvdeKI3rpS$z(c3vfKw58=hYaxK?IxQ5?`0Ppz@xE8sV>mpo(%p}*C6>=@t zHMmZ4Y`z$8+q$_f9F;h}pEh4yp^m*=7vdVuVXj~O2IGO@w#Pxn!=d?Or^fuTSK+Jk z$2Y(z*ZS+guz)Yg`Rh0IN90(JYj8Z*uYNO6?5D-C>90p23h48spN71v*Xnh!U4iTE zwH$l~um5<%KghLQ*Wen0yT>tRfgH)@ZU*}%^z2YV=u>bIHpfYalKq%G%$oa$7>_g;n2LXQ)1rOtMCJPBOEc<+g?{L z7r-dj`su*1fbW>pYj7{ua$SS#q&}NB_S53n^wXmd$Jb{}1NB*b4z??B4L{BPHNb_> zK-{=o@DFk>=S4W*?pf?{jc3cXT-V?_sn1Y*IhNxZ98dN?%oF2nTsPN^qY?%EbyBa* z7gwlbFV}^*h9k~#-C#U0+2AF%k#C&lT=h&;yr_pD) zb@f?&uA$G9ej09FuI0K2*HGM~4>4~Xr{2EPhm2wz&rh2#%JH{vSG2tfa6ETC$O5B* z;kNc8)8Wv3@u~UzDwFm=ky`^*cZ?e`YcE*d^9gtSh#TzXf;YAz*Z7s^{PhAjQ6H28 z9tY3mP|oFiJvruc^hy0jA5gAcHwKG5VLYg4SNPc%9B{`t&oy7*`-e9M=dWeK8BC5p zl&kSNgLXl|t`LH@@E`OcF){KSPwF$Kfn3XV4Sk;U(-3gEmg^#1Z?ENWRs_Zi7shfe z*EP6?k=WxH-4i*M;~E^(Pt%9|>~V75m{$fS>tVb+be)u z_6d2xj9klg4X%^=jKk$vj%#o{*YCJOu;p5=i*Su(X3}57#mKpw7vUUa!f5RIYs?b4 zmg^c^Cpk7xjJIvw%o9f?D)jZ{^w~Udg*x_fU5INqhn!yDU^Fn?o-@dBI5c1El$bB} zDtvXmcms@bt)C7I3;2+vK4aY|$8ubQF|%?u&50 zz1D*dLEO09@DFk=*EP6?;O=pZSs=%9T!Z6DzYSL-*K%EiYmk}LYxBl<8`sTTW>lg; zpKnsH%^O#!V=vcrxX$S_KbTYBq3;Nm53kR6^F{T!=I3L>PtWzM@93AP-|F`%^xOPV z{Vu8BNq>#Q)o1nj6#8tQs6Lm}=bWG3juTaD)%u8P4XW*hsMRI48s-?i3{Z?m)n>K% z1lnw$Lv1dp&GgaPaZ1~9u-dM+pFrE~k*Mt@wHqa5(g%ocav$qnvsbe(jHP0;mlv zinUHUD6DV?0h}~D*pS%mE(pKyUd+Y32<8yv9MA?_(T=D4^asjB&K;tU3qE z1u&j!eC#aiwuK+QoWq^h#tdq&ut%>vfa3-3Yq_F1xzJKAS2TL?1l75YI?s7&fD3f+ zD5RYn`=z0NGQYtdfRZ?6=N~3f$^M|hPf1Lu`Yr& zd;`5T$0;>mz&VD{e!R3^J7Q;?E%n+lYrcKE1C=lK+6&MWYt_7lnsZ)!>`y>%xo#I@ zF|L8}l-FKN75h1IZ1$~3Au7Z%@Y*@G#?h*^Y8_}-z#6^+pkfJwgBR~pT%|hps&yT; z&S4C!RcF=t4C)NWBGzJE1Z$8v*QYjh9OvD>(}av-9Nt@-I*Rr2?_IpYbzlhR4cm^W zhC?qzeJcJdR^jb|BDaRF>K)@ov1~7RO+JC&{&T|_eZd=h#S8EUKKRb_iryC-@EfOy zSFnhRj^}bH)?&S$`hFlB$4mr!+YLQlvLMzj83V<`t2NF(VlCD+u+FJ7juvAv zu7NSH`CvmYI|k@GrUh#ir-jp^=CsIRjYXtbi**gGa~NYiD#l`517n(&9M-0e@h+~L zspF_bg-!_sH;1*U{aKps53BEomJ-=>OAMAVa&x^tczd`!OfWvQ^j%K?K@4#D8}Kuv?-z( zm%Mjz>Y5MU^rq?1bi_O_pw9Htd*hTTxtltw<|kBh^aE9M)x3t9=hWF$QFT6{I%5*3 z&Z=__b*8rlsBjhN2Hs5>RqGR~H85ALRqGmRol|F1Mb-I)>TIeg)-|z);Ldq#Q%5nc zi8<_X%9Jo((p&4T59qC5Oc7P*6RI=%eX6tSTtl6wy!4ByqH29YwTAOntySw9Y7H>q zDzJX!w=;;b7}vm<*H_bo?2U8N0Mo*0;54W?4RTncDK6GxT?6YJ#-@((uC1H*GLA|x z&N$jPf4!J8u1v>XtP5cc-;h#kerKSjL(>sxA6=~YozV|eomJ;EsIw`f z>ReKte`=qaOI+1k^*)1odoQEvT~fVs-r5vVj7wt7Fg=Ggx`CPwO-B*a0Wxz~n<}c- zCsb=wMX@f4bxNII;W99U)5c39s^QS@S?n{!?^*0s$bZk`l$U-5i(;*p4hk!Te$6*Y+mX#3Q+<3Z6^V4aqz3Doce|)}LZ6)-|xssk5n~rlY3mfN#iQZK^2NHL-?onDW+da2*(K z&mcrQ9GW`z8D#3%tMJ9C;~Q8MYrS<)SfIg|G9hnhjEJ!q*T8t{nvgeB#C}d3njDfZ4tUA|JXPS`Nac-KR zyXZ7=n$(;oIjl`7$9cQ&G%=$X1-y98tXbtsg7bx462Q2&t^*Z3r za}5neRRR5{w?&TSIIyeWJAi7EYaA}ua$SUL_-Qt`0q&lDV^JgLa$bb>DY<-Q2_ z+nyMDje}dmG>~h#uE90H+~e4MG2XUyv(GmwaeTiG!B(Hu=U}@6*YMj(y~eZUTCR(5 z4aH4zZQi(=kl5=(MllNLb&_NAML9m<{fi5X28P?(k4%R{^Tj@8%olqV^7$hB(;VmY zdjXtsuD=c}3;2+^>-l*1om|Ux4X%^=Y@XOplVfw8I0|umea19UpVjAJy8_qfI0Mw3 zd~q>fT*W%}>h)>#8XXVyTD`8J*GYYby34T~*Wh@v-(j9OPPKif?-<1>=%?AQ-Ww@G09Gy2mvh zmutB$!ZkV`Nxe3I?B-x>t}90&j<4642I{qX9c&li8eqa#z@)URdE+Y1u~(l@qt5_c zeO8}q==0C*S6|`I!d!LCw6l%HrIut5XaYN zOat{iKE(9H6V`>Uj-4PwF$&UykLt2FH{A z5c9=xs_i>{$0$ZYzn#=;^G3NoVcvL$@xTyn8*>Jk4u|HA&vSrzW0WDEH-fdDe#af~ z$+3Pqu&dxZwl#E*YdkL3a$SULbTH=n)pzs9ZWhMox^WcZ`1%bSqkgO3!FBmpo3ag#p8d~uw5`%WJ+ig7$YZJsE{ zhsYD@L$c$XzH=h$Tl6g<6vW~Is@fHL`ho-Q80YiIx$B}{%qP|Rl6udH@%@9~z^s2V zoa*z3a}MzS+dOi3kiOH0 zjA9&LztK-uzt!(xy8zcYeSQF34B@`<+Q@7;^!~=D=6io*l;NxU)epcZ*XnZ(eV+5v z5A^-yTCR(5z3mmiEe>uE^Tlo!#^yS46ykV(8Wvf7R-c3A0vyj>pZ73NT*W!|>T?}^ zrk~y$L!kG335<$*uAZMl&yn)TwOrTWI;qd*i{n(>clwf1jN|)l^F_HXc|Q#ObxyBe zVKgv=+s11n)8Wv(@p%p~Z;Ud0b>8?280A_&9T*nyA<)pBe#a{wmt#4u!SP)G`qg}~ zn}e~rP8@|OpwINv94GY~hpXS}cd%Z8^X;`Ad@hTC%lnGJ{LiG7NE zT6#C$Guj%OtNgO6MjP8+*kI@CW_|pL0V$&A#5=I5`ghuk*ll zWlY|J^B~DJ`YCcP*EP6Ka*Pv{9LsSHj_Fg9T;p)Lmg^#1W61ze;VZD7Xm8%{7;odc z+0P!8IKH0-=<2n49c&liI;qc4cR7~h8XQmhY4gU_bi`iYF^W+@pMP?{+Wb+@OXiPL z`n_CWL@n|>8%H6Iuh*Cc>a}_uY!~1fV8U0xq%0Tn#8sSQuRfnfp8>l1tUlM! z=e>S4A5ZEz+`8P$eG%@V$VslvAIGV=@AN677{~M5=8JNC!hEs8XkfUl{m67UG+%sb zzMr2OWyt4?bAGx3M!D8c2ZjZF$K3TG4Shkmmg^c^=hlV1#b1u)xCY0Q`iyBH*K%Ei zYjl_={k8dHyshhIUvE_6`2HFl5A|F94z>$$4P$|IAh2Di?s6>0H8`I1*XD_<>4?3) zV-%x+K2vd%dTqWa*C)&u7Z?u=VOua~kl}D>zSyUX_b>J;A(BFR>T|GMfaAHo;bLC7 zigWDM=Q{dKe+~hLUxwLV_{AmawR(LDy~folaxK?2xK8S`dF43O_MN_C6yx}Q+PqS( zYvz@34s-tc3gdwx>^RO1$c#8NzkHq(ygxF^kk2pY`XN`qDA)Syz_5TXfrjq%KdyLO zj^(%p$CLVOp4iR7*jzV`LKM*FNk0vFSFhFUV7mg>+iN-a3>>^%%@%>ur0(za)XB@6RtIxr50gmUc2f3LquHqbf^|_8dvp>x-1bNSgz?i7t>h~%1 z8>>#amg^c^C-vDpah!VlP9HLgaeRMmo+#HP^TatneTUJ&5N;di0%SNGnlC=j0p^QQ zhOf>S?|@OR_0xf20UrVl-RXDS@wgnzaSe{=`qg*y#BL78<~nf{qJTcrPiMzTeaGSI zyZRn;p~5`aUi-n9;NazM9=VEp?A7-=`VPSb$J;TC>a02+QJq1xy%Dwf1ifrf4JB8r z)#?*ywS5w`x};X8d^8SLo7LtMXtO;IwYj7=@Aa%9$8gT@)oAUh-D>vT91wN%%j zI;G8CZLI^T=|JEbQdE1bwN%%n8m=Klb%V#iaC^cavfa3NH46USA`W3QUmQFG|+4#t=RsZd#Z^IxR}3kW)*{ zD_jbOaO#*bh<-RUm3*E-OeLcX`BW0DZJU-W*b`&DcTiW*wB)b`^p;5z)&LW(0#bf8bzG%6_Nwz))ET`D)me3}q0W1K>zsN+ z&Ba{Ii(n1`&S7mTInKjy+uZfkm;_O9zDoOvltUA2;;>#9FLtV4YKEQ^f8J#^#c66yosej7gw6tImOT1+39p zrnlx8Aj5Uw#crmKtCYuHH9w1*qxYejtL8P-Jg3f3YcUq%8W_)YLQECMdA9E~9itcp zy>?EmO&P`dd@17{t^-3jZOj-%IUJfYKF8 ztnsi|i**sK(Y%=IQ{PP;yHgmOOU6-%!>czejOwj=2igU&2AFUekoLPN;wsItSDnwI z&M@Yxv+7(!o#(tX)LX2@x(L<~+?)w9RUGHtzSD$^VjRv(n<9$w`BFqqLrsUKBj!1= zc;J-Zu8_kQ9B{`tpCZyrXUF^nzJGXQ;k92(AyxMisyq6Fs{02KXbtsg7vx!29>8zD zY+fT0!jV_^oI2xO5o0kfVp3*0BlJvSE!IV_hCR-ywW*_C`h;E@Qm8NQsAh_&f=hPc*chy_u*jy5hLL6S5F$q*>)j80vfHhjnbKct2ah2}atKMf( zZ}d7;Z`Heodc#&=4G3v}#aN8RxCX{^oexvQah~lvO~)ukL2sQ?Yg0wBK3}T%2G@Zh zoHk|*q8koP6`yASQ^hDlK2-#3+g|z&?1`~nI;g8)Iv}BJ=*^CE(*(1~Y2q}gIZbj{ zn^JbCF*cW+qYwquKZh}nR-IMnK)C?MQw_m4Q^-}CW3M{bQD=H@=r7DN;+i)Yd(~RC zK7(2VbFmid8d&Gl*%We|XZudmF^X|`FKr4b)-_W|_=YKO-7c^l7{Yqv%z!M2Lu1M3 zDZyAW%8-vGr&=NH0vP35cO4iOuqDvY?cPVb;Bh&Y;~E@K>a$5=HwR;L**FSOK%Xc5 zG~`{qR>u3{Z~^}3E;LvZ&v#w<{u)#p>_GXz_%<+=#hAd~)@ z24#8yOCV=8I3wH(!i0e09Fq0Ha*% zw*$ipz5{+6n!3{;X?R?&<+=#h+g<_OViL4w-q_8;*jy)$LKM*Jq(0+t^;vxmmJ4t^ zcRk3?T5enW;l(-Jd2LLg#!r;z_knOp+ZLQ`mMfZ)3tiQ6MSBNNP@n7QGyBsVLy-4; z2uKEecoeTqu)jn5wljMCC^;XDefxHYIc${E_JY##33n9tMoGXMd&LXz2R``DQ!rj| zz#Zc+?}y+IMm_N7Re^15I1|e;&M~N8yFkh0_<33> zr_V5)axK>ZY6af`3C`*D0+2D(cc|B0j}Pak7kFa1RB`V}Ja1u$b%^z2&V=vcrxXy8Wh0(xpdyXK};n3?; zI~C3AoT3W(>zwBN^c675wSGDNol&axUjZIN$aT;Fgnu7nIAjT-V?_ zsn0lEj^(%p$CLirJTczJb+i95DpAm1LxA^u2V9GKtzHM)6}SeONv>hAG=&t1jB95gN%nm^T$4=%pZFdzB+%r0YIj+I+T>tv!{f_;#I5yXjqYwr3nf^Md*En3gRg_vy$SB6~{k8d{ zT$jurbN-qiT(1w&hs4A_yguK}6V>OE`aI{S@93AP*Xs2t^xAw;y)LQONk5Il)o1m& zrase$WXAvxPs(*ku9NxT^kbrr%C- zZT=|NHMxc(&T-A)NgtvQso_JC9GgF?&u7$U^!e0h^|^*V(@%4p)Nk`h_4|zajcK5M ztKT*B8(_j`pgrAQ%oEk;GwL(CC+f5MTtlBH{WJtzuI0K2*HGM~4>4cVhm`aoNsi4E z<+vorbJyoRU^Fn?)_!C-9Qt{weaiTGsl5t6@Oi0l#Pru3=k)vmSmj>79hma+iU+7_ zSNMPz9B{|@2e{wX+?~GP1CPtKT-V^56XW}bH|CSrn=kg$=GgpPoKcA5>ocZ-`usr# zTEqFPT_6Nk9XVcxikb?nva)95waxO%N#2ipaFNK&66 z*m5k#H8`H^Uz;zEQ*GbrJ4P`I=rjA%94GY~eMj|M{SMYEa1Mu@_Gx~mVE!Rc3Mn@y5*N7G5TCR(5z3q9S$Cw1|71Kbj z<+=vf0CSIH^Tc@D*3G`&s6@ej2m5+^tRf%>dIpF*D@*m5n`MYsl;Nxe2-9H-j8(|3$w9N$ly zFUobvd@-fZ%LPUQL%40cHZmIy%@d!R@BNEWhA++&mkVH&YyEU!SiyI|Pyf{Z^>RV~ zMDFFj2>07w0^DMfEc_Tnxt8l1T*DLZag4*|SdMFOJav7@axq_ww{hL<^NmUr^xF{N zJ-vo&QLokOV7mg>AT!A|47Oa$bq%hQ9Gfq$rX%+Hj!}%`>$CZyT$juje{R3J!FXV} z?QxLtaA^M6r;ztE_9}dJ{@4JcThUw1ALWDND|`t^?b18VsdejQ6o{04Ym zaPYFA2_o0}j^OzCdJXR7TCQtwoz!RZ$$nlPn|^u};`sWEX`nu<&%t&Du3?ecaR#{X z8F=!tct7MS-mzD|Pov-Hc&Oj%cMbhc>N5mej^(%p$Gk!$$+danIMw!@zGD=lpubLX zZN4biHSdRnBhGPsh4H{}`?ZnbaOicd&vSsEzZzx8Uk{k%81TulembzL;5)W8bf=GZ z#p7}<*G0HS2ZQ};j+1(B{@BgK*jz`BLL6VuF%8sn^*q=vz%{^x?||4ZSM$YHoMW#( zpGKeI*41bAxrRPZ`e_KbT+4M4uA#U|A7b7(PQ87n4;jTco}V^fl;acTi#Hez47ar( znGT2Mi%-orUyL&3^F{h;j&nZb1~}zhe;rsB@F8>8^WD$~lxw-J!F5uf%@ey>7@Oa}`ZL$8zi48fLTIj+I+ zWWU2aahz)VPTw(#QP5AbU%fX@>brTQ^WcPebt5b6q(KaeTeTG*GYA>tMS8 z*8mf~0%E@0%^O#7j=lPPRDIrVU#rfla}9N#>sEtudm(D~33}C_8jeNnR=aCx_qMYJ z#r8ea=JRPYrhwY4HrLQ*`f7j*PXVpA2clM=Ppgqfs?}Wv|6I3^4t91gv-y3d&ArPWb|pM7aHJV*n3 zVyq_#>Iz)ZH087#T7P0K)W?P!$oO;8Ui@BH=!5jjd!x~FSu@>tZSm!V{MI3gr z@ATHA7zLJyQ+?_Ma*W}&@FTk6&=m1GRZJ114EYps%1bX`QLHr`LE+)m8vQ@97V8>V zr@ZuHirAgO*!0q)5CzqlCL}w~O$!{Yx~uLnH407(fC^WFhTmc;xk`QPRr@+>pTiiv z5Y<_AK7%@&I;ze!?~VbPIkkofQLR<$GpMyGq-tGKtyAiJg&boDr;V3Jw8NpPW1k`3 zyV$Gn1F7RSd)u9kD_9h3O-E2zp@9c4%|13Hb_a7jEaqZf1oJ8NHkIt>%(2<09)&2N z-Z^!~(W!|abmxg0etySwYs5RD`VlCD+u!cKED+8(F z6=N|L;~E&xd1+I`VITWWFFlG;VTlOeKyS@)O3iPOZw%qY@zRKPI5c&9P9^Vkj52(2 z>UaZ-Vy#ID3Ja(?By`(r-|(;)i*XH%r@Z#fRIxjQvFWu(AquGToR@~StJbP@pj`p$ z?R6Yn1{!=fQ^r-QW3O7*QETY!4#t=Rs-!5qFK zXG%;Rhn?&@z4a(YfhA)K<2&RS!|fS@sD?vR#OKs7MT|0haf)~ci(;+m2nq|R^OTpq zqfsK(VqFC5ZKnWku_U~kDt4zZHof#HL;)=-~zL4I}R0So`ZYeHhKV15BI~ z>8(u>hn?&@z4a)@;nmp`QLIaTcnUf$FR}2ig^|M(Y`%?x?jX<0{p$SFO*Y*64kx)~a<4 zwa%$Cq+N`~xCX{^eQPWk#agV3U=6{Y>rl#?+FovlS zV==CQF-=SkYg5R07uU_s$*4quB__Rh3hOt>Glp>5cxgmG9GXIQNWAy4S0SH5PO0@9 zSQKkbNKjZnts$Y?4Z$}&EXHD71LHY$Hihix#Ifn6MocgesiJCK zQms>7x?P~h7{Y4fwUO0uXpGpWh%sWX!WYMg?E)C(TH6sAR%qd2oySf!$I#sE-blOP zak-cKBHV9#32=*5>Xd9al(;nxh}#r ztWr|1akyN|brG(&JuiF)+Inrr^KQR34fJ;~fyE5w42JEMzbX&lc)^TbuK4Q~x~zrE z8$7{&$nd`fdmppw={1)BaxK?2xK8Rb4wqv&uEFu#_1DXG zCb+Hr@ZucqWSN*k=8eJA`{s42Q3v{Ijv>hK&!5(fAQ|xCQM@+6X4bhqhw!81e8v2m zoOjN*+1uk9sSjY=er>rnXCIUC=jV~o&^?YJ*mA7D4m1l~_cW=`=81nl-FtuI-%C+} zYdD9TUSA>580tH4zB6BZvS0pw#w$FrT_>iPNLx1F0j%#o{=cjoCyuRgAl)$qZi=^?h}LH?r{uK)o1lN zu&dDL1DQ##;cDbsu8VLDGLu}xh{&~E7vXwNugx3dZCp1$KV(#*fDg&(^9_QG;r1Ni zLeT5=Vj1Y?hxEDdTYp~a4Q$G_z9Xfl56wFAyIv&UXNl_;2It3B-c1xy;iS-?E+i_ zO!x}4{o399aY$0%sn4Sr1vsAc(@=NyS$z(+D{u`z&3<-Lzwv5vF6Tu!hXNhmZ@0gmVT)%-pi^;vxmwkvQAKh1tM$4Nam ze;g9lck1~lMg{KY{5GDgo~!4zzD@uc52UmT~}zSDP%VieHlNk47g zDA(~V!Dy3J;2MrN=R+Pa9vE)FHZmO!{oak|Ip7sb@y43B2CDo%^e9}CW56fJ`ssk^ z`1)+VsPCxhJJ7+H^VbiY0@ZKz`xN>O8za|pU4v_Y37>&BUVC5>Bgb-FgX6h=^#dIa zxt8l9T*F@{^%~EXYq>7MH550=HH?W|%XJN|lN_5T#@n`T=H#Oi1^d

+Owm^WYT% zj^XyX0+|no=8v7KX8sseSQZHG9R_*1;DEVx*l@6#eiuI0K0*AU!2jxh`5SdMFO zJn5&=PLXT5F2Xg)ob=Z)CUP$4ML37ENcs|VzvWu4YjB<8_zmDGr{7(|#S z_9A?Fp7;hB!ynJ@O!*zE4(|cnG^qwz)t5MI@^HbN6IS zaxBL+IG*&|=8MB(_MLuv6r;jA63!u|*UJS0jUn7NUK^PXhvtpXx#IncQHC$Re{s10 zM!D991cn9l8XCIY?^rH)T#n_q2FFu=dbyY{c5^T`{q!hA0e$|d{p#fcxmUl{?_j+G z=i6&L_ztx7mW%o0D&DbIzw78X1b2^P%mVdUeLjUgqbn%aa$SS#q&~xVfMdKEhB$b8 z*cSY#D^3l|9WT$u?sCIVX#7@?<$|BFV4AiE`j&S*;nM-1e{DSD4dcd^Qey_N;Llj_ zcVqa1XsqGs?FC+Ox#Ahig{5X)c)8ocFS7geM>Kwd-NJ?4r_%D8XFh>r)B*2YYp@se*7C6RTgDL(eNmKHXhv`5={Ogzx5b@+ZC0-kh6+m zyz_FjEIv)L|6S*$e03t!{a%G%L-*xNzIp}vCSSb@`qo~BZ{LpLTh*`rUU`1(RZzcr z71Xa@1@)`fz`jneLTt_TQ#tM|Mgx6{ntAV`ma7I^k1EZPg$SW1w1E7iR%LN_x-)l-}fr$?|T*W_q_`G`(6Y6 zeXl}n`uq1f=2{=Qcs zHvRp39rX9_IOy;Dq|o1Y8ua(iIibIgGVtEU=6$12IJ%YKO`4~;Z`Ac;e}7#+_A0o3 z>{W36*sI|BvDd)$W3NJNt{>m);QH|$2iK2%Qn-HXG<-6~UjOx+Bwqj3+2E?l&mDTg z5v6hc*!=vQ6$X5Y(kD&z{>Nvf^k2_1__=Al4EnEk7|I&XwL3pR((9EpMgR4zjQ;Cc2K`qrgZ}Fs2K`sBgV(P{5xjo&IVFOIPhX1l>6B{!%l_A(<(vJl z_ey;FULCKG?uGIC=w1b{kM33Q`siK-uaE9E@cQUph1k44`n?YJC*E=J`sh9>ygs_q z@M+;?KJ=U<=0lwgHm|%s`Uyvr#{Pu;iNS*XiBSmq6TJ|Auk;g#ulQbR`(M4(_P=@+ z?0@wt*#GKPu>aL-VE?OEAvXJ8?{%>M^^Sx6uRba4e{~w{e?8}f*XKkTyguj2LO2Jn z&*_!G_0L`(J@B|aaHY7P5Advv{jXjI`(IBO?0}p!eNQXQAD{S`KXz|!{`iE! z&-d+R(0{$d@J;{qEJRz7|LDJZUG!g1I`m(i1^w3(hEFGtSNKx!Y7# z@be3M8N5FF9R^;4;q^Jsx_Es~Uy%?FKOf);N0i3T2k`R&1`B>Zz$k>*=k!9D4?S_P zKhat6`kW^W_9vnY_9s>rXe;ecJS$^=;#mg!6TJ-fC*EP8R@k3-*2VsW{fQ?C?=*b+ zm;?J0_9s?8{C=q%Wuc*5}M z`%PIV1J_5!O#DSBKY|e&neMuCGRP>Kk><8 z+MgJ-cz?$_Z5qB90H4pQ|9Tcm|JBQ&|9Xc(|JCcD|B52$zn)V<|24{hPxQe@xahw| zne<=lw9$V>CCrDOIG7K07R-l+HsIu8J``}6552=-KJ;D(`xDPP*q`WSus`t*gZ+tK z2m2FI1p5=uDba1E`B3NK{jR0oj~x2_%Awyc2mQVr^!s4Y?^lNV6;z)n7kxsXs0eF=|NAFCS4@54 z@x%Z9m`g&R2nT(lHs}*^L7%7$pNEG&p-&t$#tr}Pca()bQ4IP-Fz6F2gFX=s<_iac z`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|! z^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i1 z4EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=Z zZ^QNQ&?iO?^AjtFKCvA1iE_{_3)* z`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_) z_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga z9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa z92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&- zr9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp) z34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq z7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaH zpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3 zet$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_o zD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2 zgFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl z4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z1 z7&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MA zs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29W zpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW z6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelL zCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R z#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7 zg89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@ z9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I z7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B- z1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0) zQ4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7( z&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^ z@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6! zzpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0q zE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl z%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG& zL7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{h zCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+R zD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+Rq zMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1X zIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t z{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l z%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9H zpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H z>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|j zbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H z2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4 zu^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI z{2mL-6^!t_J zeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3); zK2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pN zC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMW zmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#! za_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n# zGJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@ zKk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlS zE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{< zf_3)*`NEzF^MyGP_vOj{W91k$_8;~8 zre~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i z&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b043 z6Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajc zCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89 zg*g%T<;nhI{ z2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pkn zam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw# zLZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@E zi3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nz zzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6 ziQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPe zuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$* zaL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP) z3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtF zKCvA1iE_{_3)*`NEzF^MyGP_vOj{ zW91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y< z;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_ zg+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~ z&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWs zKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a% zqB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiA zF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4( zBav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=gl zaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4 z>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHF zTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerN zCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc z=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ z&?iO?^AjtFKCvA1iE_{_3)*`NEzF z^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=Q zF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FH zK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(O zLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK z^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q z^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8 zH?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906 ziEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$ri zFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e z|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s z<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$ zhd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)c zmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu> zT+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvat ze!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgF zeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6 zY%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE( z(Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMr zKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8 ziCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D z&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D z_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0Y zMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP- zFz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@ z@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9 zgg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ib zk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7Q zzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i z9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp z_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L| z^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00) zVE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1} z4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26 zD~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e z$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7< z`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9 zKbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{ zL|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2th zacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~ z==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr z9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+ z9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY? za?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh z%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$% zL@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf z_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`h zo(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INV zLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$ z`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ z`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?i zhxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw z+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy0 z5f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ z6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T z<;nhI{2mL-6 z^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu z>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G( z`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x= zF&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9D zBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~ z#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><- zK5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|P zf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv z!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1 ziE_{_3)*`NEzF^MyGP_vOj{W91k$ z_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|x zC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX z`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs z!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^| z!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q z9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf z8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&R zJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY z4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09E zeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N z#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStr zSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0 zJ`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO? z^AjtFKCvA1iE_{_3)*`NEzF^MyGP z_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT z81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(# zH|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ z4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^# z|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_ zPs9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjx zm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*- z27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC% zzB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh z)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac z`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|! z^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i1 z4EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=Z zZ^QNQ&?iO?^AjtFKCvA1iE_{_3)* z`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_) z_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga z9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa z92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&- zr9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp) z34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq z7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaH zpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3 zet$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_o zD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2 zgFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl z4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z1 z7&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MA zs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29W zpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW z6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelL zCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R z#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7 zg89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@ z9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I z7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B- z1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0) zQ4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7( z&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^ z@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6! zzpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|jbH&sr9zX0q zE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H2ZH&+9*JBl z%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG& zL7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{h zCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3);K2Z$%L@?+R zD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pNC(duf_3+Rq zMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`ho(c1X zIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#!a_INVLBB5t z{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n#GJGB$`h-4l z%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@Kk*zJ`;S9H zpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H z>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{_3)*`NEzF^MyGP_vOj{W91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i&?hRw+F<|j zbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b0436Dxy05f0`H z2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajcCq@qQ6Dx;4 zu^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89g*g%T<;nhI z{2mL-6^!t_J zeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pknam*Mu>_3); zK2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw#LZ7G(`b1pN zC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMW zmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nzzia9DBZq#! za_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6iQ1q~#07n# zGJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPeuj><-K5=X@ zKk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP)3kQPv!XAlS zE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtFKCvA1iE_{< zf_3)*`NEzF^MyGP_vOj{W91k$_8;~8 zre~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y<;eG|xC(1>i z&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_g+5UX`b043 z6Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~&?nAs!}ajc zCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWsKbC^|!k!89 zg*g%T<;nhI{ z2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a%qB49Q9{Pkn zam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiAF+cGf8~cw# zLZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@E zi3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-Nz zzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4>_09EeIgw6 ziQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHFTr15N#)tPe zuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerNCxStrSQ+$* zaL^|Pf$V9gg$Z17&q)cmW4i14EjVc=o2f0J`oP) z3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ&?iO?^AjtF zKCvA1iE_{_3)*`NEzF^MyGP_vOj{ zW91k$_8;~8re~==X6!zpo7QzGvate!p_)_sc=QF9-cT81(y< z;eG|xC(1>i&?hRw+F<|jbH&sr9zX0qE(v`i9Q29WpijgFeWEga9v=FHK5@(#H|#%_ zg+5UX`b0436Dxy05f0`H2ZH&+9*JBl%@@Xp_cyQW6PP}6Y%xFa92@(OLqeaZ4*En~ z&?nAs!}ajcCq@qQ6Dx;4u^jY?a?mG&L7!L|^oelLCkBE((Ib&-r9KfK^oa^#|1lWs zKbC^|!k!89g*g%T<;nhI{2mL-6^!t_Jeg)Mh%0-{hCo00)VE^%R#ndMrKkPp)34J0Q^oiP_Ps9a% zqB49Q9{Pknam*Mu>_3);K2Z$%L@?+RD}z1}4(1C7g89N8iCinq7siM8H?Qjxm_BiA zF+cGf8~cw#LZ7G(`b1pNC(duf_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4( zBav&RJ`o@Ei3(x=F&OMWmV)`ho(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=gl zaY4VY4D-Nzzia9DBZq#!a_INVLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Fh)F&Q4 z>_09EeIgw6iQ1q~#07n#GJGB$`h-4l%osQ9KbD0)Q4IP-Fz6F2gFX=s<_iac`NAHF zTr15N#)tPeuj><-K5=X@Kk*zJ`;S9HpQsM{L|o7(&Tqr@@X#kl4)YT$hd!|!^oerN zCxStrSQ+$*aL^|Pf$V9gg$Z17&q)cmW4i14EjVc z=o2f0J`oP)3kQPv!XAlSE6o?ihxa$H>l2thacnU^@f;ibk3&MAs1Eu>T+k=ZZ^QNQ z&?iO?^AjtFKCvA1iE_{_3)*`NEzF z^MyGP_vOj{W91k$|G(IOyrRm_-~RCb{zQELyMO%q`(OXuKOMh+xc+*-*Wd7O_g~>J zzwf`~?;mah|9t%=Z$r>-`_N{`K$uSN#0B|9rvw>-ER}>-C5H`O|$1{PT_CFV|n!0%e>;Luo6a3s)k>8)|Kk@sA>!0%P*Pq~H<^3P{{k{I7e!jnI*B|@$5BGoN z=l&f4mL&H!e&)4<0y8h*T{QiEQ&l|*FKT=(Pyq`bc zf1*F#mR)~_pS$?|{^|ZxeBOEgej)pu`9EL(3*X1(_a3MI%k`)HwE63Ql>6uO2KDF5 zxu09YpFdvYe(wRbpU*zPhwc44@i`qo_tWcx^7C=#LVNl4dq4iJfB!G{KlkUa|F>JA z`$YfzUjO6${NWPf`Xhe+{h!;p&-3%=hW~s0bNt*w{PFq+`~1{>K6&03k>C4&@t@nu z>!0iQ{!Rb+`}L>%JV-uwjlbV4Z?W&6&p%y%i|^CzIw|*0;YId7nz!XQ=imEr`+MJ( zem)P0`!Ii=GCzN~q`Us*{SSGAzt7pvU#@@3pX)F9arkr9zOPF65BJaCuKywK+t}^+ z{b&4M-|naP$DZ#C!Tsd=x&PQd_wDNE&(~r7%k{5+{`zmu`^Wqr|Kq>>S^c;F<)8lH zAOGq9_;>&D-~ZSD_;3IF|L%YI7yr3=S^0SO`3v8F=UbfL-|NwHUoJml{pC76zxVIP z=V#*geh~cWGUKE3{qy&I{Cz^_eO>weJSqNg`T4mo{{8wn``&OqH|_hsavze5EFSK~;^I!kd|N5W*{eSzXfBav*^4!10pFjKkc>cYQ*YExA z^2h6<^K%b--0vCpzklCRK7WDxM1P)h_aEtY?dN_P-%r-x`>A&S`v2U|k3U_{sQ=G* zh_B9{-_GBgK1bxJ?K zo%gNeulISmFYuqA^!tVEgDFm-p}Z{VQ?bU4HLB<@XwK!~HznZ)tu$uZj0x^#1kxxy#(=q4($CfA!(= zkN@yb|M@@6gXMLF__zPl|NamE^Z)km{?mW>SMDtLPyT(+ynbVT?u+c_w0=H;|9m*z zkGfCMyno4lK3?80jo(|}{SR^woL{;{3S{-w%!ZuJ^~k{i{BmyY7Gczy8l$SAPERm;dKK`OoM7Z~xEyfB*U4 H{PX_}Mu(fH literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..348f1953ea70832d271ea0c5f015878ece72bb76 GIT binary patch literal 19700 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json new file mode 100644 index 0000000000000000000000000000000000000000..8d42780da1314ffcf203b41405e3efcfd78878b8 GIT binary patch literal 2437729 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json new file mode 100644 index 0000000000000000000000000000000000000000..e6f8492c798806035acbed63ffa818f1e9acb958 GIT binary patch literal 2425355 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%0DFe_Y{+ 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 VfB%<%x&MFj|IPpVm%sbV{{ePV5t;x1 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..16eed9d48e9bf224fce28bcc1720c0798dba3417 GIT binary patch literal 10644 zcmai)-EQMX42650rwDZ23z7P>`zl3YcoQ`?n#8GNFHkJmIj`mw#h#%@Yh9%=H+$qF&dAs6E+?BYTddT}9#-!dVG zU|g^qhRcNNS1L9%jH4}mKf*ojByT)80RpJaSqiO!w^--#{DX6<3bg> zaUqBAGKQ^k7{`6fp&S>ga9(CiupLa5P$;Hjh{+gI8aHTM{Gg|bGLXgkt~SD=##eNZ z+34_2$LRUQ8jg^$Hl*qqfWMN75#%il>9P%p!VAcR0Jpc|?bNM1mRMm^6JW!sg^rq~ z-pt`kZcq&FTZjA93$e<^l#*lHCQ`29V`3Y_KDnk-C}Z5q3^#6!+V7xjQ{8cAJuXle zD{NF$LCnnge$m|u9^oyPGzmYWQ#f2*FcBNCxKl_Wir}_tKR1W@R#bhaaIt{XZ3PfG z!&}JUL<9nYb&v{ct~jRVsaNly*Gv;*SBxyY5JMYi*%oSBW2`_sLLz26TO*il4W&5o zL7}+CBaEW~LQoB|3%qZ{*w#=Cy=S5(86y&gL}DYhPY4MUh@vKy801^l9c3 zcS=Dq3o))kPaYB2qqRtYjNq&Q!;M*s(6Kcy(3Po+!u0EnkcQAFBv=TPCT}1(69&Zz zI{2NWX9*s%e8C{0#1jm-!kWy4;&$|ak*asTk>O;DTM){6s2?G`=6u38kxR`@5^SW= z3QRN)afUL>67V<-1qjK)otky#JsQt*OC%t{nVKba8uOfyBQjnEy2vSg4qKAKthL0lJ^*qjWUq{4#c)0_o}57?>EwWk-#K@ zGqqt4#`{KEB)b+TrR{74q3n=voh6}EYbyYRlZ%;SBN%FSC8Ri0j58}SP^v~?*n=p? znnHY5Xasy1QA1+G5|#dgF=>zZpHV=(K#C+HB6TV`R3K2$iG{l{!HJM2c^S@vghuyt zQZr`}EM^i<5Xwr^z>-o$8*_ouW(Enig%v0wbRuAgp7$78_ z8f0l=6M{t=5j3L|aMFK5A)Y&V4wx~hFfeDY_$t+2sTL}#vE$-kUk9Tk~HC7+6$$eB?JD{eO~tu&)d`a z7)Rc49u^`ZJB!9IG9NICSWu3w>)>Oo^FAwIc>%#ekeK9?zGf^%SynnrI+i}t6(s2< zU>Fh0#hqCW8QGaMzJ_G2H!!M$lXpVhHAua4H z5D;u2+hg!Z>7&Y}ix`V}iCFPEnZdLten}iB36KsNrIhY~gt%mP_IXTzg)b%g3DYg# zCDo8UT)v@-Y*llUQHIsFj$01kro-t5Eib|HI=RNs|)#rMJS9EpC~n1u~)W^(`wp_NduZK g>Gh{%<%8><{(A|!Qri8WGvgz@`1k(*$0vLL1L6MC0RR91 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..4f098886a58ef4403b75cd388367a6e254062963 GIT binary patch literal 18554 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json new file mode 100644 index 0000000000000000000000000000000000000000..73d7c1d6c87db55a28d8e21dfbaf385468a1fac3 GIT binary patch literal 14334 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json new file mode 100644 index 0000000000000000000000000000000000000000..26ea2400cf8930fe6a3e1b4a085a611984d8bfda GIT binary patch literal 22156 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json new file mode 100644 index 0000000000000000000000000000000000000000..12a843e9bc7048161bd561991d2aea4aafa26770 GIT binary patch literal 28889 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json new file mode 100644 index 0000000000000000000000000000000000000000..21c535cabdd031820be105632d426dc5d4cd07d0 GIT binary patch literal 10897 zcmeI&%WfM-5Czbz^%VlwS+IKe%&!CiK}(E9L=qK>G7=d2_sqzW%sJPFH(A;X+dVV= zsMoDq)%<*Mc{%yCJ3j6Y_mkf)Klj7o!SwzA{pj(uJ)SlX$HV6I&*o)9yeW5bb$Gfz^@?xrPkMuV+VxLP$EV%P=g@(@Q$=g=_^Q*&gx4F96?(a9ZhpWGK*PHh*Yd(KJRR87f z;czv0$eCYEPW!vv=I(J=wwBc`x>>iZHl3dD(2H|ATpeyVU%j!;5Ad@0{(4yBy7$4m z?P)h0WqZ46ZStzF=eG%ye4c97$XM-K*?^gA5>96jnEejK!T{b6wLmzQ51dzf=} zf?;?j=gZrgzil`SFE2ZWem|X!KWI~CEE%sB;|bMRvSY<1C$7br9fl*;Y&l-Cb?&j| zLB|qp#-=mWP~D0>8gjMr!IUX$jydB{wLntltB9pStj9;J5CS1<#gP@EG+vvt=ZY~y zHsmehGUQ{9+Tk^Q?2V;wb7s`c2Mr^m?^>hK6(8ym|WkkjwPE;Q-08KsD_T4 z5!^b&Y&xErn!DtbJ!{F5amvPwv_^QZst8@JvG9UJEZLLK5sJ5{nV}zJXTEMJ{n$6x zc$$v5#JLx^QJ-hV3nm24+=3;FEm$xDy%y-NgtKaBWzCEQM=JfS=B%({g=$FQcq7nB!)x(3LQ2gbD(9OHC1q_bXrP=aIZrqYJE%s7keo5G`b4i53XpnkX&( zNi~-K6Ao50RP_yrSF*WNRs=$u@gTSYPAUMG%wWxe5jYBJ_zRV|uo8`-0liC&I2&vI z%(4T)?Eh%wpIP>cUPi_8@Mu92u4V+9wo7telFEp4z(-zI5}F@xDW;0qrj42ds*x$#9q0j{!(UK&!qj0tajdu z86YMy_Bi1+ZAFSx?`6lL1{!lp)(VhOa(8Y~Dm zaz!awlASh1{Y^+RP@*d#%afpm&qiCrSRFe|v|WrUK1ZPFk?4Qr0a>6F$O1#1mXI0{ z80cgBpvtUSe5^mx_quN#iVhpn02$5)q}` zR<(k#fEid()~L}Bz~L=nh~hFvV}n|-q8*F`QF%g}QHhjpZlPUrljw5jL3W7BV}h6w zNS0<%>l=AEN1MThA{(N|rfCAB!?w}sEK`LJWn0ojQD)etm;#JEQw%gUMO(8?;St6@ zdMwFMa(rwXJvH1fWQ;7YskCL##%L}9c;uBZBqu~exSETBgySJAMq0(+2l5<^|#gIXb&8UJQy)x`y#?SJY2pPCX7w{>f*cZ^SJ+b zzdb!2hueSdt1VLE>=u;Gi@xXx7#aNy{#b)D58q2}Vu9$FTL4N-^|cZZyj^K#@u(t9 zsS@(I?G?0w&BP6L*%u9mmkG#KqQMZ=kk+iQo)9m7+p~yfo)utbkw`piJSN=V_>e-y zH9=I$S-u1LAV(A;nYWk`_#eUQCm;WJR7Ad{k5AcBc4idB0K z0zyT9H>J=+Lb{kupKDRqhn`GzCCL-XvP6zw z2B_I+^cXBQ!z&7RZ=|E_wxb%NTN*?$78EA#KB&%Yua9g!+}~+0lLj2BPp{wgr&q3f Z`uAa=D>Yrbe>wbKarpD)-`8I+{s$Qn^tAv0 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json new file mode 100644 index 0000000000000000000000000000000000000000..59b15a0b6086638b6215c1cbad9aa6f28542787c GIT binary patch literal 10645 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 00000000000..7f0850a40db --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file From d881ba8e8877efdd2724768a6799926734e9eb30 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 05:13:04 +0700 Subject: [PATCH 11/65] more fixes --- .../document/v0/document-meta.json | 18 +- packages/rs-dpp/src/block/block_info/mod.rs | 2 +- .../class_methods/try_from_schema/v0/mod.rs | 14 +- .../schema/enrich_with_base_schema/v0/mod.rs | 17 +- .../src/document/extended_document/fields.rs | 7 + .../src/schema/document/v0/documentBase.json | 28 ++ .../state_transitions/documents_batch/mod.rs | 319 ++++++++++++++++-- .../crypto-card-game-all-transferable.json | 38 +++ .../crypto-card-game-not-transferable.json | 38 +++ packages/rs-drive/src/drive/defaults.rs | 6 +- .../v0/mod.rs | 80 ++++- .../drive/object_size_info/document_info.rs | 11 +- .../document_create_transition_action/mod.rs | 17 +- .../v0/mod.rs | 181 ++++++++-- .../v0/transformer.rs | 48 +-- 15 files changed, 687 insertions(+), 137 deletions(-) diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index 90f0f8e7516..98d432a1736 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -533,7 +533,14 @@ "$ownerId": true, "$revision": true, "$createdAt": true, - "$updatedAt": true + "$updatedAt": true, + "$transferredAt": true, + "$createdAtBlockHeight": true, + "$updatedAtBlockHeight": true, + "$transferredAtBlockHeight": true, + "$createdAtCoreBlockHeight": true, + "$updatedAtCoreBlockHeight": true, + "$transferredAtCoreBlockHeight": true }, "propertyNames": { "oneOf": [ @@ -548,7 +555,14 @@ "$ownerId", "$revision", "$createdAt", - "$updatedAt" + "$updatedAt", + "$transferredAt", + "$createdAtBlockHeight", + "$updatedAtBlockHeight", + "$transferredAtBlockHeight", + "$createdAtCoreBlockHeight", + "$updatedAtCoreBlockHeight", + "$transferredAtCoreBlockHeight" ] } ] diff --git a/packages/rs-dpp/src/block/block_info/mod.rs b/packages/rs-dpp/src/block/block_info/mod.rs index edd9b543951..6f43eefc1bd 100644 --- a/packages/rs-dpp/src/block/block_info/mod.rs +++ b/packages/rs-dpp/src/block/block_info/mod.rs @@ -14,7 +14,7 @@ pub const DEFAULT_BLOCK_INFO: BlockInfo = BlockInfo { // Extended block info however is not immutable // @immutable /// Block information -#[derive(Clone, Default, Debug, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] +#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] pub struct BlockInfo { /// Block time in milliseconds pub time_ms: TimestampMillis, diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 97dc67881d9..00b4084ebf1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -48,7 +48,19 @@ use platform_value::{Identifier, Value}; const UNIQUE_INDEX_LIMIT_V0: usize = 16; const NOT_ALLOWED_SYSTEM_PROPERTIES: [&str; 1] = ["$id"]; -const SYSTEM_PROPERTIES: [&str; 4] = ["$id", "$ownerId", "$createdAt", "$updatedAt"]; +const SYSTEM_PROPERTIES: [&str; 11] = [ + "$id", + "$ownerId", + "$createdAt", + "$updatedAt", + "$transferredAt", + "$createdAtBlockHeight", + "$updatedAtBlockHeight", + "$transferredAtBlockHeight", + "$createdAtCoreBlockHeight", + "$updatedAtCoreBlockHeight", + "$transferredAtCoreBlockHeight", +]; const MAX_INDEXED_STRING_PROPERTY_LENGTH: u16 = 63; const MAX_INDEXED_BYTE_ARRAY_PROPERTY_LENGTH: u16 = 255; diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs index ea4066ebbdb..71ebe9771ed 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs @@ -8,7 +8,17 @@ pub const DATA_CONTRACT_SCHEMA_URI_V0: &str = pub const PROPERTY_SCHEMA: &str = "$schema"; -const TIMESTAMPS: [&str; 2] = ["$createdAt", "$updatedAt"]; +const SYSTEM_GENERATED_FIELDS: [&str; 9] = [ + "$createdAt", + "$updatedAt", + "$transferredAt", + "$createdAtBlockHeight", + "$updatedAtBlockHeight", + "$transferredAtBlockHeight", + "$createdAtCoreBlockHeight", + "$updatedAtCoreBlockHeight", + "$transferredAtCoreBlockHeight", +]; #[inline(always)] pub(super) fn enrich_with_base_schema_v0( @@ -43,13 +53,14 @@ pub(super) fn enrich_with_base_schema_v0( )); } - // Remove $createdAt and $updatedAt from JSON Schema since they aren't part of + // Remove $createdAt, $updatedAt and $transferredAt and their height and core height variants + // from JSON Schema since they aren't part of // dynamic (user defined) document data which is validating against the schema if let Some(required) = schema_map.get_optional_key_mut(property_names::REQUIRED) { if let Some(required_array) = required.as_array_mut() { required_array.retain(|field_value| { if let Some(field) = field_value.as_text() { - !TIMESTAMPS.contains(&field) + !SYSTEM_GENERATED_FIELDS.contains(&field) } else { true } diff --git a/packages/rs-dpp/src/document/extended_document/fields.rs b/packages/rs-dpp/src/document/extended_document/fields.rs index 0466c759b01..09400b60edd 100644 --- a/packages/rs-dpp/src/document/extended_document/fields.rs +++ b/packages/rs-dpp/src/document/extended_document/fields.rs @@ -8,6 +8,13 @@ pub mod property_names { pub const OWNER_ID: &str = "$ownerId"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const TRANSFERRED_AT: &str = "$transferredAt"; + pub const CREATED_AT_BLOCK_HEIGHT: &str = "$createdAtBlockHeight"; + pub const UPDATED_AT_BLOCK_HEIGHT: &str = "$updatedAtBlockHeight"; + pub const TRANSFERRED_AT_BLOCK_HEIGHT: &str = "$transferredAtBlockHeight"; + pub const CREATED_AT_CORE_BLOCK_HEIGHT: &str = "$createdAtCoreBlockHeight"; + pub const UPDATED_AT_CORE_BLOCK_HEIGHT: &str = "$updatedAtCoreBlockHeight"; + pub const TRANSFERRED_AT_CORE_BLOCK_HEIGHT: &str = "$transferredAtCoreBlockHeight"; } pub const IDENTIFIER_FIELDS: [&str; 3] = [ diff --git a/packages/rs-dpp/src/schema/document/v0/documentBase.json b/packages/rs-dpp/src/schema/document/v0/documentBase.json index d745088cd11..a8ee99ae9cb 100644 --- a/packages/rs-dpp/src/schema/document/v0/documentBase.json +++ b/packages/rs-dpp/src/schema/document/v0/documentBase.json @@ -41,6 +41,34 @@ "$updatedAt": { "type": "integer", "minimum": 0 + }, + "$transferredAt": { + "type": "integer", + "minimum": 0 + }, + "$createdAtBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$updatedAtBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$transferredAtBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$createdAtCoreBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$updatedAtCoreBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$transferredAtCoreBlockHeight": { + "type": "integer", + "minimum": 0 } }, "required": [ diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index aa701b348ab..459a44aa7df 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1623,48 +1623,113 @@ mod tests { #[test] fn test_document_transfer_that_does_not_yet_exist() { let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() + let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() - .set_genesis_state(); + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Never); - let mut rng = StdRng::seed_from_u64(433); + let mut rng = StdRng::seed_from_u64(435); let platform_state = platform.state.load(); let (identity, signer, key) = setup_identity(&mut platform, 958); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + let (receiver, _, _) = setup_identity(&mut platform, 452); - let profile = dashpay_contract - .document_type_for_name("profile") + let card_document_type = contract + .document_type_for_name("card") .expect("expected a profile document type"); let entropy = Bytes32::random_with_rng(&mut rng); - let mut document = profile + let mut document = card_document_type .random_document_with_identifier_and_entropy( &mut rng, identity.id(), entropy, - DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillType::DoNotFillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, platform_version, ) .expect("expected a random document"); - document.set("avatarUrl", "http://test.com/bob.jpg".into()); + document.set("attack", 4.into()); + document.set("defense", 7.into()); - let mut altered_document = document.clone(); + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - altered_document.increment_revision().unwrap(); - altered_document.set("displayName", "Samuel".into()); - altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( - altered_document, - profile, + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 0 documents, and the receiver to also have none + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), &key, 3, 0, @@ -1674,9 +1739,9 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition for transfer"); - let documents_batch_update_serialized_transition = documents_batch_update_transition + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition .serialize_to_bytes() .expect("expected documents batch serialized state transition"); @@ -1685,7 +1750,7 @@ mod tests { let processing_result = platform .platform .process_raw_state_transitions( - &vec![documents_batch_update_serialized_transition.clone()], + &vec![documents_batch_transfer_serialized_transition.clone()], &platform_state, &BlockInfo::default(), &transaction, @@ -1706,6 +1771,216 @@ mod tests { assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have no document, and the receiver to have none as well + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_delete_after_transfer() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, _, _) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5327760); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + + // Now let's try to delete the transferred document } } diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json index a312cb5cb15..b14e8fe5adc 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json @@ -81,10 +81,48 @@ "defense": "asc" } ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] } ], "required": [ "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", "attack", "defense" ], diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json index 0615249052c..3032f982cd6 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json @@ -81,10 +81,48 @@ "defense": "asc" } ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] } ], "required": [ "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", "attack", "defense" ], diff --git a/packages/rs-drive/src/drive/defaults.rs b/packages/rs-drive/src/drive/defaults.rs index 730e90e027a..19bad964781 100644 --- a/packages/rs-drive/src/drive/defaults.rs +++ b/packages/rs-drive/src/drive/defaults.rs @@ -64,13 +64,17 @@ pub const OPTIMIZED_DOCUMENT_REFERENCE: u16 = 34; // 1 + hops + DEFAULT_HASH_SIZ pub const DEFAULT_FLOAT_SIZE: u32 = 8; /// u64 size pub const U64_SIZE: u32 = 8; - +/// u64 size +pub const U64_SIZE_U16: u16 = 8; /// u64 size pub const U64_SIZE_U8: u8 = 8; /// u32 size pub const U32_SIZE: u32 = 4; +/// u32 size +pub const U32_SIZE_U16: u16 = 4; + /// u32 size pub const U32_SIZE_U8: u8 = 4; /// Default float size as u16 diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index 9fec5ec253c..5f9c96d1ab5 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -11,6 +11,12 @@ use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::document::property_names::{ + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use grovedb::TransactionArg; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -29,21 +35,77 @@ impl Drive { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { + let required_fields = document_type.required_fields(); + + let is_created_at_required = required_fields.contains(CREATED_AT); + let is_updated_at_required = required_fields.contains(UPDATED_AT); + let is_transferred_at_required = required_fields.contains(TRANSFERRED_AT); + + let is_created_at_block_height_required = required_fields.contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = required_fields.contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + required_fields.contains(TRANSFERRED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = + required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = + required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = + required_fields.contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); + + let block_info = document_create_transition.block_info(); + let request = UniquenessOfDataRequest { contract, document_type, owner_id, document_id: document_create_transition.base().id(), allow_original: false, - created_at: document_create_transition.created_at(), - updated_at: document_create_transition.created_at(), - transferred_at: None, - created_at_block_height: document_create_transition.created_at_block_height(), - updated_at_block_height: document_create_transition.created_at_block_height(), - transferred_at_block_height: None, - created_at_core_block_height: document_create_transition.created_at_core_block_height(), - updated_at_core_block_height: document_create_transition.created_at_core_block_height(), - transferred_at_core_block_height: None, + created_at: if is_created_at_required { + Some(block_info.time_ms) + } else { + None + }, + updated_at: if is_updated_at_required { + Some(block_info.time_ms) + } else { + None + }, + transferred_at: if is_transferred_at_required { + Some(block_info.time_ms) + } else { + None + }, + created_at_block_height: if is_created_at_block_height_required { + Some(block_info.height) + } else { + None + }, + updated_at_block_height: if is_updated_at_block_height_required { + Some(block_info.height) + } else { + None + }, + transferred_at_block_height: if is_transferred_at_block_height_required { + Some(block_info.height) + } else { + None + }, + created_at_core_block_height: if is_created_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + updated_at_core_block_height: if is_updated_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + transferred_at_core_block_height: if is_transferred_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, data: document_create_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/object_size_info/document_info.rs b/packages/rs-drive/src/drive/object_size_info/document_info.rs index ee250888156..0386fe0a81e 100644 --- a/packages/rs-drive/src/drive/object_size_info/document_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/document_info.rs @@ -1,5 +1,6 @@ use crate::drive::defaults::{ - DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U8, U64_SIZE_U8, + DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U16, U32_SIZE_U8, + U64_SIZE_U16, U64_SIZE_U8, }; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DriveKeyInfo::{Key, KeySize}; @@ -113,7 +114,13 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { ) -> Result { match key_path { "$ownerId" | "$id" => Ok(DEFAULT_HASH_SIZE_U16), - "$createdAt" | "$updatedAt" => Ok(DEFAULT_FLOAT_SIZE_U16), + "$createdAt" | "$updatedAt" | "$transferredAt" => Ok(U64_SIZE_U16), + "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => { + Ok(U64_SIZE_U16) + } + "$createdAtCoreBlockHeight" + | "$updatedAtCoreBlockHeight" + | "$transferredAtCoreBlockHeight" => Ok(U32_SIZE_U16), _ => { let property = document_type.flattened_properties().get(key_path).ok_or({ Error::Fee(FeeError::DocumentTypeFieldNotFoundForEstimation( diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs index ec14a24a3a1..aeddcefce93 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs @@ -4,6 +4,7 @@ mod v0; use derive_more::From; +use dpp::block::block_info::BlockInfo; use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; @@ -37,21 +38,9 @@ impl DocumentCreateTransitionActionAccessorsV0 for DocumentCreateTransitionActio } } - fn created_at(&self) -> Option { + fn block_info(&self) -> BlockInfo { match self { - DocumentCreateTransitionAction::V0(v0) => v0.created_at, - } - } - - fn created_at_block_height(&self) -> Option { - match self { - DocumentCreateTransitionAction::V0(v0) => v0.created_at_block_height, - } - } - - fn created_at_core_block_height(&self) -> Option { - match self { - DocumentCreateTransitionAction::V0(v0) => v0.created_at_core_block_height, + DocumentCreateTransitionAction::V0(v0) => v0.block_info, } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index 79dc6b8546e..38cb650fd88 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -1,5 +1,6 @@ pub mod transformer; +use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0}; use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; @@ -8,7 +9,13 @@ use std::collections::BTreeMap; use dpp::ProtocolError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; +use dpp::document::property_names::{ + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use dpp::prelude::{BlockHeight, CoreBlockHeight}; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; @@ -20,12 +27,8 @@ use dpp::version::PlatformVersion; pub struct DocumentCreateTransitionActionV0 { /// Document Base Transition pub base: DocumentBaseTransitionAction, - /// The creation time of the document - pub created_at: Option, - /// The creation block height of the document - pub created_at_block_height: Option, - /// The creation core block height of the document - pub created_at_core_block_height: Option, + /// The block_info at the time of creation + pub block_info: BlockInfo, /// Document properties pub data: BTreeMap, } @@ -36,12 +39,8 @@ pub trait DocumentCreateTransitionActionAccessorsV0 { fn base(&self) -> &DocumentBaseTransitionAction; /// base owned fn base_owned(self) -> DocumentBaseTransitionAction; - /// created at time - fn created_at(&self) -> Option; - /// created at block height - fn created_at_block_height(&self) -> Option; - /// created at core block height - fn created_at_core_block_height(&self) -> Option; + /// block info + fn block_info(&self) -> BlockInfo; /// data fn data(&self) -> &BTreeMap; /// data mut @@ -96,9 +95,7 @@ impl DocumentFromCreateTransitionActionV0 for Document { ) -> Result { let DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info, data, } = v0; @@ -115,6 +112,26 @@ impl DocumentFromCreateTransitionActionV0 for Document { .contract .document_type_for_name(document_type_name.as_str())?; + let required_fields = document_type.required_fields(); + + let is_created_at_required = required_fields.contains(CREATED_AT); + let is_updated_at_required = required_fields.contains(UPDATED_AT); + let is_transferred_at_required = required_fields.contains(TRANSFERRED_AT); + + let is_created_at_block_height_required = + required_fields.contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = + required_fields.contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + required_fields.contains(TRANSFERRED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = + required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = + required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = + required_fields.contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); + match platform_version .dpp .document_versions @@ -125,15 +142,52 @@ impl DocumentFromCreateTransitionActionV0 for Document { owner_id, properties: data.clone(), revision: document_type.initial_revision(), - created_at: *created_at, - updated_at: *created_at, - transferred_at: None, - created_at_block_height: *created_at_block_height, - updated_at_block_height: *created_at_block_height, - transferred_at_block_height: None, - created_at_core_block_height: *created_at_core_block_height, - updated_at_core_block_height: *created_at_core_block_height, - transferred_at_core_block_height: None, + created_at: if is_created_at_required { + Some(block_info.time_ms) + } else { + None + }, + updated_at: if is_updated_at_required { + Some(block_info.time_ms) + } else { + None + }, + transferred_at: if is_transferred_at_required { + Some(block_info.time_ms) + } else { + None + }, + created_at_block_height: if is_created_at_block_height_required { + Some(block_info.height) + } else { + None + }, + updated_at_block_height: if is_updated_at_block_height_required { + Some(block_info.height) + } else { + None + }, + transferred_at_block_height: if is_transferred_at_block_height_required { + Some(block_info.height) + } else { + None + }, + created_at_core_block_height: if is_created_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + updated_at_core_block_height: if is_updated_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + transferred_at_core_block_height: + if is_transferred_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -153,9 +207,7 @@ impl DocumentFromCreateTransitionActionV0 for Document { ) -> Result { let DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info, data, } = v0; @@ -172,6 +224,26 @@ impl DocumentFromCreateTransitionActionV0 for Document { .contract .document_type_for_name(document_type_name.as_str())?; + let required_fields = document_type.required_fields(); + + let is_created_at_required = required_fields.contains(CREATED_AT); + let is_updated_at_required = required_fields.contains(UPDATED_AT); + let is_transferred_at_required = required_fields.contains(TRANSFERRED_AT); + + let is_created_at_block_height_required = + required_fields.contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = + required_fields.contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + required_fields.contains(TRANSFERRED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = + required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = + required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = + required_fields.contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); + match platform_version .dpp .document_versions @@ -182,15 +254,52 @@ impl DocumentFromCreateTransitionActionV0 for Document { owner_id, properties: data, revision: document_type.initial_revision(), - created_at, - updated_at: created_at, - transferred_at: None, - created_at_block_height, - updated_at_block_height: created_at_block_height, - transferred_at_block_height: None, - created_at_core_block_height, - updated_at_core_block_height: created_at_core_block_height, - transferred_at_core_block_height: None, + created_at: if is_created_at_required { + Some(block_info.time_ms) + } else { + None + }, + updated_at: if is_updated_at_required { + Some(block_info.time_ms) + } else { + None + }, + transferred_at: if is_transferred_at_required { + Some(block_info.time_ms) + } else { + None + }, + created_at_block_height: if is_created_at_block_height_required { + Some(block_info.height) + } else { + None + }, + updated_at_block_height: if is_updated_at_block_height_required { + Some(block_info.height) + } else { + None + }, + transferred_at_block_height: if is_transferred_at_block_height_required { + Some(block_info.height) + } else { + None + }, + created_at_core_block_height: if is_created_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + updated_at_core_block_height: if is_updated_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + transferred_at_core_block_height: + if is_transferred_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs index caec3badee9..eaace5d1959 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs @@ -21,32 +21,10 @@ impl DocumentCreateTransitionActionV0 { base, get_data_contract, )?; - let created_at = if base.document_type_field_is_required(property_names::CREATED_AT)? { - Some(block_info.time_ms) - } else { - None - }; - - let created_at_block_height = - if base.document_type_field_is_required(property_names::CREATED_AT_BLOCK_HEIGHT)? { - Some(block_info.height) - } else { - None - }; - - let created_at_core_block_height = if base - .document_type_field_is_required(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)? - { - Some(block_info.core_height) - } else { - None - }; Ok(DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info: *block_info, data, }) } @@ -63,32 +41,10 @@ impl DocumentCreateTransitionActionV0 { base, get_data_contract, )?; - let created_at = if base.document_type_field_is_required(property_names::CREATED_AT)? { - Some(block_info.time_ms) - } else { - None - }; - - let created_at_block_height = - if base.document_type_field_is_required(property_names::CREATED_AT_BLOCK_HEIGHT)? { - Some(block_info.height) - } else { - None - }; - - let created_at_core_block_height = if base - .document_type_field_is_required(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)? - { - Some(block_info.core_height) - } else { - None - }; Ok(DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info: *block_info, //todo: get rid of clone data: data.clone(), }) From 5898e748a6415e69a477fae6bcc23ea2950dab16 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 05:23:23 +0700 Subject: [PATCH 12/65] more fixes --- .../state_transitions/documents_batch/mod.rs | 57 +++++++++++++++++-- .../document_create_transition_action/mod.rs | 2 - .../v0/transformer.rs | 1 - 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 459a44aa7df..67939412946 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1411,7 +1411,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 5327760); + assert_eq!(processing_result.aggregated_fees().processing_fee, 9350380); let query_sender_results = platform .drive @@ -1803,7 +1803,7 @@ mod tests { let (identity, signer, key) = setup_identity(&mut platform, 958); - let (receiver, _, _) = setup_identity(&mut platform, 450); + let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); let card_document_type = contract .document_type_for_name("card") @@ -1920,7 +1920,7 @@ mod tests { let documents_batch_transfer_transition = DocumentsBatchTransition::new_document_transfer_transition_from_document( - document, + document.clone(), card_document_type, receiver.id(), &key, @@ -1964,7 +1964,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 5327760); + assert_eq!(processing_result.aggregated_fees().processing_fee, 10277100); let query_sender_results = platform .drive @@ -1982,5 +1982,54 @@ mod tests { assert_eq!(query_receiver_results.documents().len(), 1); // Now let's try to delete the transferred document + + document.set_owner_id(receiver.id()); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + document, + card_document_type, + &recipient_key, + 2, + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1107610); } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs index aeddcefce93..f8f9c0380c8 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs @@ -5,12 +5,10 @@ mod v0; use derive_more::From; use dpp::block::block_info::BlockInfo; -use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; use dpp::document::Document; -use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs index eaace5d1959..a1694c6a505 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs @@ -1,5 +1,4 @@ use dpp::block::block_info::BlockInfo; -use dpp::document::property_names; use dpp::platform_value::Identifier; use std::sync::Arc; From 90fc5eabb9892b81d71a1e74945f3182b5b655a0 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 05:36:59 +0700 Subject: [PATCH 13/65] more fixes --- .../state_transitions/documents_batch/mod.rs | 20 ------------------- .../tests/strategy_tests/main.rs | 4 ++-- .../drive/object_size_info/document_info.rs | 2 +- .../v0/mod.rs | 2 -- .../v0/transformer.rs | 2 +- 5 files changed, 4 insertions(+), 26 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 67939412946..ca11a668b69 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1656,26 +1656,6 @@ mod tests { document.set("attack", 4.into()); document.set("defense", 7.into()); - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); - - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); - let sender_documents_sql_string = format!("select * from card where $ownerId == '{}'", identity.id()); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index fe40692b299..1f0d30beb48 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1777,7 +1777,7 @@ mod tests { .unwrap() .unwrap() ), - "b46905d816d6c39e3f18c17725a6961e845f82feff5a4b7d8dc7955a33506bb3".to_string() + "2609439c79ea50f6f6a2d4e4f357f710097fa2fab8a196e35c176689b2f2687a".to_string() ) } @@ -1902,7 +1902,7 @@ mod tests { .unwrap() .unwrap() ), - "0e99bbeba931c57ed4bc8ad813da9879da7188bc5193190480d7538ce7977692".to_string() + "58b927769fb1782259883aa91a91a60c6d451cc5f95d3e0d905abcd9ff61f434".to_string() ) } diff --git a/packages/rs-drive/src/drive/object_size_info/document_info.rs b/packages/rs-drive/src/drive/object_size_info/document_info.rs index 0386fe0a81e..bd07aad98a9 100644 --- a/packages/rs-drive/src/drive/object_size_info/document_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/document_info.rs @@ -1,5 +1,5 @@ use crate::drive::defaults::{ - DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U16, U32_SIZE_U8, + DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U16, U32_SIZE_U8, U64_SIZE_U16, U64_SIZE_U8, }; use crate::drive::flags::StorageFlags; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index 38cb650fd88..6a8ff004988 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -2,7 +2,6 @@ pub mod transformer; use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0}; -use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; @@ -16,7 +15,6 @@ use dpp::document::property_names::{ TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; -use dpp::prelude::{BlockHeight, CoreBlockHeight}; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs index a1694c6a505..5b3286ba221 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_create_transition::v0::DocumentCreateTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionV0; impl DocumentCreateTransitionActionV0 { From 95dc96a4337b1b30a0b777ccb8f21b01011363f1 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 06:01:27 +0700 Subject: [PATCH 14/65] removed marketplace for now --- .../meta_schemas/document/v0/document-meta.json | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index 98d432a1736..c5067f16e1f 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -485,19 +485,9 @@ "type": "integer", "enum": [ 0, - 1, - 2 - ], - "description": "Transferable without a marketplace sell. 0 - Never, 1 - Always, 2 - Yes, but individual documents can be marked at creation as non transferable." - }, - "marketplace": { - "type": "integer", - "enum": [ - 0, - 1, - 2 + 1 ], - "description": "Built in marketplace system. 0 - None, 1 - Public Offer, a user will make an offer that needs to be accepted, 2 - Private Offer, a user will make an offer that needs to be accepted, 3 - Direct purchase (The user can buy the item without the need for an approval), 4 - Public Bidding, 5 - Private Bidding, 6 - Set at Document Level." + "description": "Transferable without a marketplace sell. 0 - Never, 1 - Always" }, "requiresIdentityEncryptionBoundedKey": { "type": "integer", From d7f37a9b511727f2b7835799c2447c47285fb012 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 06:22:35 +0700 Subject: [PATCH 15/65] fmt --- packages/rs-drive/src/drive/object_size_info/document_info.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive/src/drive/object_size_info/document_info.rs b/packages/rs-drive/src/drive/object_size_info/document_info.rs index bd07aad98a9..1901f0eb97b 100644 --- a/packages/rs-drive/src/drive/object_size_info/document_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/document_info.rs @@ -1,6 +1,6 @@ use crate::drive::defaults::{ - DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U16, U32_SIZE_U8, - U64_SIZE_U16, U64_SIZE_U8, + DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U16, U32_SIZE_U8, U64_SIZE_U16, + U64_SIZE_U8, }; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DriveKeyInfo::{Key, KeySize}; From 9d3c834b0cf57109dfe1e8fa91688c222230fb7b Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 21 Apr 2024 06:31:43 +0700 Subject: [PATCH 16/65] wasm-dpp fixes --- .../test/integration/document/Document.spec.js | 3 +++ packages/wasm-dpp/test/unit/document/Document.spec.js | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index bd8dc73ec90..f3f4b8f2e50 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -60,6 +60,9 @@ describe('ExtendedDocument', () => { $updatedAt: null, $updatedAtBlockHeight: null, $updatedAtCoreBlockHeight: null, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, $dataContractId: dataContract.getId().toBuffer(), $id: document.getId().toBuffer(), $ownerId: document.getOwnerId().toBuffer(), diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index a6680c01a6d..8e7f80d90b5 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -90,6 +90,9 @@ describe('Document', () => { $updatedAt: now, $updatedAtBlockHeight: 1, $updatedAtCoreBlockHeight: 1, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, }; rawDocumentWithBuffers = { @@ -105,6 +108,9 @@ describe('Document', () => { $updatedAt: now, $updatedAtBlockHeight: 1, $updatedAtCoreBlockHeight: 1, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, }; document = new ExtendedDocument(rawDocument, dataContract); @@ -291,6 +297,9 @@ describe('Document', () => { $ownerId: await generateRandomIdentifierAsync(), $id: await generateRandomIdentifierAsync(), $updatedAt: updatedAt, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, $type: 'test', ...data, }; @@ -415,7 +424,7 @@ describe('Document', () => { it('should return serialized Document', () => { const buffer = document.toBuffer(); expect(buffer).to.be.instanceOf(Buffer); - expect(buffer.length).to.equal(647); + expect(buffer.length).to.equal(648); }); // TODO: remove or replace? From 1b75aa809d0c788d020cad138b40d39a660d53f8 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 22 Apr 2024 12:40:00 +0700 Subject: [PATCH 17/65] more work on nft support --- .../document/v0/document-meta.json | 22 ++ .../rs-dpp/src/data_contract/config/mod.rs | 6 + .../rs-dpp/src/data_contract/config/v0/mod.rs | 11 +- .../document_type/accessors/mod.rs | 19 + .../document_type/accessors/v0/mod.rs | 3 + .../v0/mod.rs | 2 + .../class_methods/try_from_schema/mod.rs | 2 + .../class_methods/try_from_schema/v0/mod.rs | 30 +- .../document_type/methods/mod.rs | 2 +- .../src/data_contract/document_type/mod.rs | 4 + .../document_type/v0/accessors.rs | 5 + .../src/data_contract/document_type/v0/mod.rs | 7 +- .../document_type/v0/random_document_type.rs | 6 + .../src/data_contract/v0/methods/schema.rs | 1 + .../src/document/extended_document/mod.rs | 2 +- .../src/document/extended_document/v0/mod.rs | 5 +- packages/rs-dpp/src/document/transfer.rs | 2 +- .../src/errors/consensus/basic/basic_error.rs | 15 +- .../consensus/basic/data_contract/mod.rs | 2 + .../data_contract/unknown_trade_mode_error.rs | 47 +++ packages/rs-dpp/src/errors/consensus/codes.rs | 1 + packages/rs-dpp/src/lib.rs | 1 + packages/rs-dpp/src/nft/mod.rs | 55 +++ .../document_transition/action_type.rs | 4 + .../from_document.rs | 45 +++ .../document_purchase_transition/mod.rs | 19 + .../v0/from_document.rs | 40 ++ .../document_purchase_transition/v0/mod.rs | 36 ++ .../v0/v0_methods.rs | 44 +++ .../v0_methods.rs | 36 ++ .../from_document.rs | 44 +++ .../document_update_price_transition/mod.rs | 26 ++ .../v0/from_document.rs | 36 ++ .../v0/mod.rs | 286 ++++++++++++++ .../v0/v0_methods.rs | 58 +++ .../v0_methods.rs | 49 +++ .../document_transition/mod.rs | 50 ++- .../documents_batch_transition/methods/mod.rs | 101 ++++- .../methods/v0/mod.rs | 36 +- .../v0/v0_methods.rs | 96 ++++- packages/rs-dpp/src/util/mod.rs | 1 + packages/rs-dpp/src/util/units.rs | 30 ++ .../state_v0/mod.rs | 29 +- .../mod.rs | 87 ++++ .../state_v0/mod.rs | 71 ++++ .../structure_v0/mod.rs | 62 +++ .../state_v0/mod.rs | 31 +- .../state_v0/mod.rs | 31 +- .../mod.rs | 87 ++++ .../state_v0/mod.rs | 69 ++++ .../structure_v0/mod.rs | 46 +++ .../documents_batch/action_validation/mod.rs | 2 + .../advanced_structure/v0/mod.rs | 28 ++ .../state_transitions/documents_batch/mod.rs | 373 +++++++++++++++++- .../documents_batch/state/v0/mod.rs | 20 + .../documents_batch/transformer/v0/mod.rs | 97 ++++- .../rs-drive-abci/src/test/helpers/setup.rs | 35 +- .../crypto-card-game-direct-purchase.json | 133 +++++++ .../document/document_purchase_transition.rs | 61 +++ .../document/document_transition.rs | 15 + .../document_update_price_transition.rs | 47 +++ .../drive/batch/transitions/document/mod.rs | 2 + .../drive/document/index_uniqueness/mod.rs | 2 + .../mod.rs | 70 ++++ .../v0/mod.rs | 64 +++ .../mod.rs | 70 ++++ .../v0/mod.rs | 55 +++ .../v0/mod.rs | 7 +- .../v0/mod.rs | 29 ++ .../document_transition/action_type.rs | 2 + .../mod.rs | 98 +++++ .../transformer.rs | 33 ++ .../v0/mod.rs | 37 ++ .../v0/transformer.rs | 57 +++ .../mod.rs | 85 ++++ .../transformer.rs | 31 ++ .../v0/mod.rs | 26 ++ .../v0/transformer.rs | 52 +++ .../document_transition/mod.rs | 16 + .../src/version/dpp_versions.rs | 2 + .../src/version/drive_abci_versions.rs | 4 + .../src/version/drive_versions.rs | 2 + .../src/version/mocks/v2_test.rs | 20 + .../src/version/mocks/v3_test.rs | 20 + .../rs-platform-version/src/version/v1.rs | 20 + 85 files changed, 3322 insertions(+), 93 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs create mode 100644 packages/rs-dpp/src/nft/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/util/units.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json create mode 100644 packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs create mode 100644 packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index c5067f16e1f..5768525fabc 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -481,6 +481,18 @@ ], "description": "Public key security level. 0 - Master, 1 - Critical, 2 - High, 3 - Medium. If none specified, High level is used" }, + "documentsKeepHistory": { + "type": "bool", + "description": "True if the documents keep all their history, default is false" + }, + "documentsMutable": { + "type": "bool", + "description": "True if the documents are mutable, default is true" + }, + "canBeDeleted": { + "type": "bool", + "description": "True if the documents can be deleted, default is true" + }, "transferable": { "type": "integer", "enum": [ @@ -489,6 +501,16 @@ ], "description": "Transferable without a marketplace sell. 0 - Never, 1 - Always" }, + "tradeMode": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3 + ], + "description": "Built in marketplace system. 0 - None, 1 - Public Offer, a user will make an offer that needs to be accepted, 2 - Private Offer, a user will make an offer that needs to be accepted, 3 - Direct purchase (The user can buy the item without the need for an approval)" + }, "requiresIdentityEncryptionBoundedKey": { "type": "integer", "enum": [ diff --git a/packages/rs-dpp/src/data_contract/config/mod.rs b/packages/rs-dpp/src/data_contract/config/mod.rs index 26aaba3636b..56febc24857 100644 --- a/packages/rs-dpp/src/data_contract/config/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/mod.rs @@ -117,6 +117,12 @@ impl DataContractConfigGettersV0 for DataContractConfig { } } + fn documents_can_be_deleted_contract_default(&self) -> bool { + match self { + DataContractConfig::V0(v0) => v0.documents_can_be_deleted_contract_default, + } + } + /// Encryption key storage requirements fn requires_identity_encryption_bounded_key(&self) -> Option { match self { diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 35734a01e59..e8175fff48b 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -27,10 +27,14 @@ pub struct DataContractConfigV0 { /// Do documents in the contract keep history. This is a default for all documents in /// the contract, but can be overridden by the document itself pub documents_keep_history_contract_default: bool, - /// Are documents in the contract mutable. This specifies whether the document can be - /// changed or deleted. This is a default for all documents in the contract, but can be - /// overridden by the document itself + /// Are documents in the contract mutable? This specifies whether the document can be + /// changed. This is a default for all documents in the contract, but can be + /// overridden by the document itself. pub documents_mutable_contract_default: bool, + /// Can documents in the contract be deleted? This specifies whether the document can be + /// deleted. This is a default for all documents in the contract, but can be + /// overridden by the document itself. + pub documents_can_be_deleted_contract_default: bool, /// Encryption key storage requirements pub requires_identity_encryption_bounded_key: Option, /// Decryption key storage requirements @@ -53,6 +57,7 @@ pub trait DataContractConfigGettersV0 { /// Returns whether documents in the contract are mutable by default. fn documents_mutable_contract_default(&self) -> bool; + fn documents_can_be_deleted_contract_default(&self) -> bool; /// Encryption key storage requirements fn requires_identity_encryption_bounded_key(&self) -> Option; diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index 3b4aef6b3c7..d9f83586466 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -13,6 +13,7 @@ use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; pub use v0::*; +use crate::nft::TradeMode; impl DocumentTypeV0Getters for DocumentType { fn name(&self) -> &String { @@ -87,6 +88,12 @@ impl DocumentTypeV0Getters for DocumentType { } } + fn trade_mode(&self) -> TradeMode { + match self { + DocumentType::V0(v0) => v0.trade_mode(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentType::V0(v0) => v0.documents_transferable(), @@ -197,6 +204,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { } } + fn trade_mode(&self) -> TradeMode { + match self { + DocumentTypeRef::V0(v0) => v0.trade_mode(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeRef::V0(v0) => v0.data_contract_id(), @@ -301,6 +314,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { } } + fn trade_mode(&self) -> TradeMode { + match self { + DocumentTypeMutRef::V0(v0) => v0.trade_mode(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeMutRef::V0(v0) => v0.data_contract_id(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index b297b3dd9b1..f04753daa2b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -9,6 +9,8 @@ use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::nft::TradeMode; pub trait DocumentTypeV0Getters { /// Returns the name of the document type. @@ -47,6 +49,7 @@ pub trait DocumentTypeV0Getters { /// Returns the documents transferable flag of the document type. fn documents_transferable(&self) -> Transferable; + fn trade_mode(&self) -> TradeMode; /// Returns the data contract id of the document type. fn data_contract_id(&self) -> Identifier; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs index 12177daec65..1bc7ae36619 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs @@ -15,6 +15,7 @@ impl DocumentTypeV0 { schema_defs: Option<&BTreeMap>, documents_keep_history_contract_default: bool, documents_mutable_contract_default: bool, + documents_can_be_deleted_contract_default: bool, validate: bool, validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -41,6 +42,7 @@ impl DocumentTypeV0 { schema_defs, documents_keep_history_contract_default, documents_mutable_contract_default, + documents_can_be_deleted_contract_default, validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs index 023291dc5ba..6a0bc14fc38 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs @@ -16,6 +16,7 @@ impl DocumentType { schema_defs: Option<&BTreeMap>, default_keeps_history: bool, default_mutability: bool, + default_can_be_deleted: bool, validate: bool, validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -34,6 +35,7 @@ impl DocumentType { schema_defs, default_keeps_history, default_mutability, + default_can_be_deleted, validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 00b4084ebf1..5983a7e4a65 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -44,6 +44,7 @@ use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::property_names::{CAN_BE_DELETED, DOCUMENTS_KEEP_HISTORY, DOCUMENTS_MUTABLE, TRADE_MODE, TRANSFERABLE}; const UNIQUE_INDEX_LIMIT_V0: usize = 16; const NOT_ALLOWED_SYSTEM_PROPERTIES: [&str; 1] = ["$id"]; @@ -106,6 +107,7 @@ impl DocumentTypeV0 { schema_defs: Option<&BTreeMap>, default_keeps_history: bool, default_mutability: bool, + default_can_be_deleted: bool, validate: bool, // we don't need to validate if loaded from state validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -207,28 +209,42 @@ impl DocumentTypeV0 { format!("document schema must be an object: {err}"), )) })?; - - // TODO: These properties aren't defined in JSON meta schema + // Do documents of this type keep history? (Overrides contract value) let documents_keep_history: bool = - Value::inner_optional_bool_value(schema_map, "documentsKeepHistory") + Value::inner_optional_bool_value(schema_map, DOCUMENTS_KEEP_HISTORY) .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_keeps_history); // Are documents of this type mutable? (Overrides contract value) let documents_mutable: bool = - Value::inner_optional_bool_value(schema_map, "documentsMutable") + Value::inner_optional_bool_value(schema_map, DOCUMENTS_MUTABLE) .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); - // Are documents of this type mutable? (Overrides contract value) + // Can documents of this type be deleted? (Overrides contract value) + let documents_can_be_deleted: bool = + Value::inner_optional_bool_value(schema_map, CAN_BE_DELETED) + .map_err(consensus_or_protocol_value_error)? + .unwrap_or(default_can_be_deleted); + + + // Are documents of this type transferable? let documents_transferable_u8: u8 = - Value::inner_optional_integer_value(schema_map, "transferable") + Value::inner_optional_integer_value(schema_map, TRANSFERABLE) .map_err(consensus_or_protocol_value_error)? .unwrap_or_default(); let documents_transferable = documents_transferable_u8.try_into()?; + // What is the trade mode of these documents + let documents_trade_mode_u8: u8 = + Value::inner_optional_integer_value(schema_map, TRADE_MODE) + .map_err(consensus_or_protocol_value_error)? + .unwrap_or_default(); + + let trade_mode = documents_trade_mode_u8.try_into()?; + // Extract the properties let property_values = Value::inner_optional_index_map::( schema_map, @@ -511,7 +527,9 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_can_be_deleted, documents_transferable, + trade_mode, data_contract_id, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 240e1d96681..3ec1d080a75 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -216,7 +216,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn requires_revision(&self) -> bool { - self.documents_mutable || self.documents_transferable != Transferable::Never + self.documents_mutable || self.documents_transferable.is_transferable() || self.trade_mode.seller_sets_price() } fn top_level_indices(&self) -> Vec<&IndexProperty> { diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index eed70afb856..c799fd9532f 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -26,6 +26,10 @@ use std::collections::BTreeMap; mod property_names { pub const DOCUMENTS_KEEP_HISTORY: &str = "documentsKeepHistory"; pub const DOCUMENTS_MUTABLE: &str = "documentsMutable"; + + pub const CAN_BE_DELETED: &str = "canBeDeleted"; + pub const TRANSFERABLE: &str = "transferable"; + pub const TRADE_MODE: &str = "tradeMode"; pub const SECURITY_LEVEL_REQUIREMENT: &str = "signatureSecurityLevelRequirement"; pub const REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY: &str = "requiresIdentityEncryptionBoundedKey"; diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index b3b875ba577..ba0d0b5f03b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -11,6 +11,7 @@ use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; +use crate::nft::TradeMode; impl DocumentTypeV0Getters for DocumentTypeV0 { fn name(&self) -> &String { @@ -65,6 +66,10 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.documents_transferable } + fn trade_mode(&self) -> TradeMode { + self.trade_mode + } + fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 9f99f217a59..d5564a4176d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -12,6 +12,7 @@ pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use platform_value::{Identifier, Value}; +use crate::nft::TradeMode; mod accessors; #[cfg(feature = "random-documents")] @@ -54,8 +55,12 @@ pub struct DocumentTypeV0 { pub(in crate::data_contract) documents_keep_history: bool, /// Are documents mutable? pub(in crate::data_contract) documents_mutable: bool, - /// Are documents mutable? + /// Can documents of this type be deleted? + pub(in crate::data_contract) documents_can_be_deleted: bool, + /// Can documents be transferred without a trade? pub(in crate::data_contract) documents_transferable: Transferable, + /// How are these documents traded? + pub(in crate::data_contract) trade_mode: TradeMode, pub(in crate::data_contract) data_contract_id: Identifier, /// Encryption key storage requirements pub(in crate::data_contract) requires_identity_encryption_bounded_key: diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 5a977161c45..43745516f96 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -72,6 +72,7 @@ pub struct RandomDocumentTypeParameters { pub field_bounds: FieldMinMaxBounds, pub keep_history_chance: f64, pub documents_mutable_chance: f64, + pub documents_can_be_deleted_chance: f64, } impl RandomDocumentTypeParameters { @@ -118,6 +119,7 @@ use rand::Rng; use serde_json::json; use std::collections::BTreeSet; use std::ops::Range; +use crate::nft::TradeMode; impl DocumentTypeV0 { pub fn random_document_type( @@ -242,6 +244,7 @@ impl DocumentTypeV0 { let documents_keep_history = rng.gen_bool(parameters.keep_history_chance); let documents_mutable = rng.gen_bool(parameters.documents_mutable_chance); + let documents_can_be_deleted = rng.gen_bool(parameters.documents_can_be_deleted_chance); let name = format!("doc_type_{}", rng.gen::()); @@ -423,7 +426,9 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_can_be_deleted, documents_transferable: Transferable::Never, + trade_mode: TradeMode::None, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, @@ -588,6 +593,7 @@ impl DocumentTypeV0 { documents_keep_history, documents_mutable, documents_transferable: Transferable::Never, + trade_mode: TradeMode::None, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, diff --git a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs index 03bf8f8f5b3..91a4cfbb6d4 100644 --- a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs +++ b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs @@ -48,6 +48,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { self.schema_defs.as_ref(), self.config.documents_keep_history_contract_default(), self.config.documents_mutable_contract_default(), + self.config.documents_mutable_contract_default(), validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index ae9e23e6069..c97b4b588b1 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -75,7 +75,7 @@ impl ExtendedDocument { /// Returns a `ProtocolError` if the document type is not found in the data contract. pub fn needs_revision(&self) -> Result { match self { - ExtendedDocument::V0(v0) => v0.needs_revision(), + ExtendedDocument::V0(v0) => v0.requires_revision(), } } diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index 918d190e145..b08f2a60199 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -46,6 +46,7 @@ use platform_value::converter::serde_json::BTreeValueJsonConverter; use platform_version::version::PlatformVersion; #[cfg(feature = "document-json-conversion")] use serde_json::Value as JsonValue; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; /// The `ExtendedDocumentV0` struct represents the data provided by the platform in response to a query. #[derive(Debug, Clone)] @@ -161,9 +162,9 @@ impl ExtendedDocumentV0 { .map(|document_type| document_type.documents_mutable()) } - pub fn needs_revision(&self) -> Result { + pub fn requires_revision(&self) -> Result { self.document_type() - .map(|document_type| document_type.documents_mutable()) + .map(|document_type| document_type.requires_revision()) } pub fn revision(&self) -> Option { diff --git a/packages/rs-dpp/src/document/transfer.rs b/packages/rs-dpp/src/document/transfer.rs index ea0615743cc..df528d74bf4 100644 --- a/packages/rs-dpp/src/document/transfer.rs +++ b/packages/rs-dpp/src/document/transfer.rs @@ -32,7 +32,7 @@ impl TryFrom for Transferable { 1 => Ok(Self::Always), value => Err(ProtocolError::ConsensusError( ConsensusError::BasicError(BasicError::UnknownTransferableTypeError( - UnknownTransferableTypeError::new(vec![0, 1, 3], value.into()), + UnknownTransferableTypeError::new(vec![0, 1], value.into()), )) .into(), )), diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 65ad96ade7a..f830074ac26 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -6,17 +6,7 @@ use thiserror::Error; use crate::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError; #[cfg(feature = "json-schema-validation")] use crate::consensus::basic::data_contract::InvalidJsonSchemaRefError; -use crate::consensus::basic::data_contract::{ - DataContractEmptySchemaError, DataContractHaveNewUniqueIndexError, - DataContractImmutablePropertiesUpdateError, DataContractInvalidIndexDefinitionUpdateError, - DataContractUniqueIndicesChangedError, DuplicateIndexError, DuplicateIndexNameError, - IncompatibleDataContractSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, - InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, - InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, - InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, - UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, - UnknownStorageKeyRequirementsError, UnknownTransferableTypeError, -}; +use crate::consensus::basic::data_contract::{DataContractEmptySchemaError, DataContractHaveNewUniqueIndexError, DataContractImmutablePropertiesUpdateError, DataContractInvalidIndexDefinitionUpdateError, DataContractUniqueIndicesChangedError, DuplicateIndexError, DuplicateIndexNameError, IncompatibleDataContractSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTransferableTypeError, UnknownTradeModeError}; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, }; @@ -93,6 +83,9 @@ pub enum BasicError { #[error(transparent)] UnknownTransferableTypeError(UnknownTransferableTypeError), + #[error(transparent)] + UnknownTradeModeError(UnknownTradeModeError), + #[error(transparent)] SerializedObjectParsingError(SerializedObjectParsingError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 30fa795b1f3..8924d285b70 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -23,6 +23,7 @@ mod unique_indices_limit_reached_error; mod unknown_security_level_error; mod unknown_storage_key_requirements_error; mod unknown_transferable_type_error; +mod unknown_trade_mode_error; pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; @@ -50,3 +51,4 @@ pub use invalid_document_type_name_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; pub use unknown_transferable_type_error::*; +pub use unknown_trade_mode_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs new file mode 100644 index 00000000000..bbf57f33351 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized trade mode: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownTradeModeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownTradeModeError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownTradeModeError) -> Self { + Self::BasicError(BasicError::UnknownTradeModeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 07f19201fa5..383a27dffcc 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -91,6 +91,7 @@ impl ErrorWithCode for BasicError { Self::ContractError(DataContractError::KeyWrongBounds(_)) => 10241, Self::ContractError(DataContractError::KeyValueMustExist(_)) => 10242, Self::UnknownTransferableTypeError { .. } => 10243, + Self::UnknownTradeModeError { .. } => 10244, // Document Errors: 10400-10499 Self::DataContractNotPresentError { .. } => 10400, diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index cef2d9f3e77..30a65a87c18 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -48,6 +48,7 @@ pub mod signing; #[cfg(feature = "system_contracts")] pub mod system_data_contracts; pub mod withdrawal; +pub mod nft; pub use async_trait; diff --git a/packages/rs-dpp/src/nft/mod.rs b/packages/rs-dpp/src/nft/mod.rs new file mode 100644 index 00000000000..9796c66ba0d --- /dev/null +++ b/packages/rs-dpp/src/nft/mod.rs @@ -0,0 +1,55 @@ +use std::fmt; +use std::fmt::{Display, Formatter}; +use crate::consensus::basic::BasicError; +use crate::consensus::basic::data_contract::UnknownTradeModeError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; + +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum TradeMode { + None = 0, + DirectPurchase = 1, + PublicOffer = 2, + PrivateOffer = 3, +} + +impl TradeMode { + pub fn seller_sets_price(&self) -> bool { + match self { + TradeMode::None => false, + TradeMode::DirectPurchase => true, + TradeMode::PublicOffer => true, //min price + TradeMode::PrivateOffer => true, //min price + } + } +} + +impl Display for TradeMode { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + TradeMode::None => write!(f, "No Trading"), + TradeMode::DirectPurchase => write!(f, "Direct Purchase"), + TradeMode::PublicOffer => write!(f, "Public Offer"), + TradeMode::PrivateOffer => write!(f, "Private Offer"), + } + } +} + +impl TryFrom for TradeMode { + type Error = ProtocolError; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::None), + 1 => Ok(Self::DirectPurchase), + 2 => Ok(Self::PublicOffer), + 3 => Ok(Self::PrivateOffer), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownTradeModeError( + UnknownTradeModeError::new(vec![0, 1, 2, 3], value.into()), + )) + .into(), + )), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs index 9052109dca2..fd7c376f7b9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs @@ -8,6 +8,8 @@ pub enum DocumentTransitionActionType { Replace, Delete, Transfer, + Purchase, + UpdatePrice, IgnoreWhileBumpingRevision, } @@ -22,6 +24,8 @@ impl TransitionActionTypeGetter for DocumentTransition { DocumentTransition::Delete(_) => DocumentTransitionActionType::Delete, DocumentTransition::Replace(_) => DocumentTransitionActionType::Replace, DocumentTransition::Transfer(_) => DocumentTransitionActionType::Transfer, + DocumentTransition::UpdatePrice(_) => DocumentTransitionActionType::UpdatePrice, + DocumentTransition::Purchase(_) => DocumentTransitionActionType::Purchase, } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs new file mode 100644 index 00000000000..dca2eb33aa3 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs @@ -0,0 +1,45 @@ +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::fee::Credits; + +use crate::state_transition::documents_batch_transition::document_transition::{DocumentPurchaseTransition}; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; + +impl DocumentPurchaseTransition { + pub fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + feature_version: Option, + base_feature_version: Option, + ) -> Result { + match feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .document_purchase_state_transition + .bounds + .default_current_version, + ) { + 0 => Ok(DocumentPurchaseTransitionV0::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + base_feature_version, + )? + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentPurchaseTransition::from_document".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs new file mode 100644 index 00000000000..9a5664cfaae --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs @@ -0,0 +1,19 @@ +mod from_document; +pub mod v0; +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum DocumentPurchaseTransition { + #[display(fmt = "V0({})", "_0")] + V0(DocumentPurchaseTransitionV0), +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs new file mode 100644 index 00000000000..90ff16ad7ed --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs @@ -0,0 +1,40 @@ +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document, DocumentV0Getters}; +use crate::document::errors::DocumentError; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; + +impl DocumentPurchaseTransitionV0 { + pub(crate) fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + base_feature_version: Option, + ) -> Result { + let Some(revision) = document.revision() else { + return Err(ProtocolError::Document(Box::new( + DocumentError::DocumentNoRevisionError { + document: Box::new(document.clone()), + }, + ))); + }; + + Ok(DocumentPurchaseTransitionV0 { + base: DocumentBaseTransition::from_document( + &document, + document_type, + identity_contract_nonce, + platform_version, + base_feature_version, + )?, + revision, + price, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs new file mode 100644 index 00000000000..e69e415ad5c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs @@ -0,0 +1,36 @@ +mod from_document; +pub mod v0_methods; + +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +use bincode::{Decode, Encode}; +use derive_more::Display; + +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +use crate::fee::Credits; +use crate::prelude::Revision; + +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display(fmt = "Base: {}", "base")] +pub struct DocumentPurchaseTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: DocumentBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$revision") + )] + pub revision: Revision, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "price") + )] + pub price: Credits, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..941c9266320 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs @@ -0,0 +1,44 @@ +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; + +pub trait DocumentPurchaseTransitionV0Methods { + /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. + /// + /// # Arguments + /// + /// * `base` - A value of type `DocumentBaseTransition` to set. + fn set_base(&mut self, base: DocumentBaseTransition); + + /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. + fn revision(&self) -> Revision; + + /// Sets the value of the `revision` field in the `DocumentReplaceTransitionV0`. + fn set_revision(&mut self, revision: Revision); +} + +impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base + } + + fn revision(&self) -> Revision { + self.revision + } + + fn set_revision(&mut self, revision: Revision) { + self.revision = revision; + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs new file mode 100644 index 00000000000..68cb48bb5e6 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs @@ -0,0 +1,36 @@ +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::DocumentPurchaseTransition; + +impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransition { + fn base(&self) -> &DocumentBaseTransition { + match self { + DocumentPurchaseTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + match self { + DocumentPurchaseTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + match self { + DocumentPurchaseTransition::V0(v0) => v0.base = base, + } + } + + fn revision(&self) -> Revision { + match self { + DocumentPurchaseTransition::V0(v0) => v0.revision, + } + } + + fn set_revision(&mut self, revision: Revision) { + match self { + DocumentPurchaseTransition::V0(v0) => v0.revision = revision, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs new file mode 100644 index 00000000000..4f26ff90bd7 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs @@ -0,0 +1,44 @@ +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document}; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; + +impl DocumentUpdatePriceTransition { + pub fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + feature_version: Option, + base_feature_version: Option, + ) -> Result { + match feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .document_update_price_state_transition + .bounds + .default_current_version, + ) { + 0 => Ok(DocumentUpdatePriceTransitionV0::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + base_feature_version, + )? + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentUpdatePriceTransition::from_document".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs new file mode 100644 index 00000000000..d90afc3db3c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs @@ -0,0 +1,26 @@ +mod from_document; +pub mod v0; +pub mod v0_methods; + +use crate::block::block_info::BlockInfo; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum DocumentUpdatePriceTransition { + #[display(fmt = "V0({})", "_0")] + V0(DocumentUpdatePriceTransitionV0), +} \ No newline at end of file diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs new file mode 100644 index 00000000000..570a3fb5610 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs @@ -0,0 +1,36 @@ +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document, DocumentV0Getters}; +use crate::document::errors::DocumentError; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; + +impl DocumentUpdatePriceTransitionV0 { + pub(crate) fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + base_feature_version: Option, + ) -> Result { + Ok(DocumentUpdatePriceTransitionV0 { + base: DocumentBaseTransition::from_document( + &document, + document_type, + identity_contract_nonce, + platform_version, + base_feature_version, + )?, + revision: document.revision().ok_or_else(|| { + ProtocolError::Document(Box::new(DocumentError::DocumentNoRevisionError { + document: Box::new(document.clone()), + })) + })?, + price, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs new file mode 100644 index 00000000000..0ede0698e91 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs @@ -0,0 +1,286 @@ +mod from_document; +pub mod v0_methods; + +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision, TimestampMillis}; +use bincode::{Decode, Encode}; +use derive_more::Display; + +use platform_value::{Identifier, Value}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +use crate::block::block_info::BlockInfo; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::{Document, DocumentV0}; +use crate::{document, ProtocolError}; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; +use crate::fee::Credits; + +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; +use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +mod property_names { + pub const REVISION: &str = "$revision"; +} + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display(fmt = "Base: {}, Revision: {}, Price: {}", "base", "revision", "price")] +pub struct DocumentUpdatePriceTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: DocumentBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$revision") + )] + pub revision: Revision, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$price") + )] + pub price: Credits, +} +// +// /// document from update_price transition v0 +// pub trait DocumentFromUpdatePriceTransitionV0 { +// /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionV0` reference. This operation is typically used to update_price or update an existing document with new information. +// /// +// /// # Arguments +// /// +// /// * `value` - A reference to the `DocumentUpdatePriceTransitionV0` containing the new information for the document. +// /// * `owner_id` - The `Identifier` of the document's owner. +// /// * `created_at` - An optional timestamp representing when the original document was created. This is preserved during update_pricement. +// /// * `created_at_block_height` - An optional height of the block at which the original document was created. This is preserved during update_pricement. +// /// * `created_at_core_block_height` - An optional core block height at which the original document was created. This is preserved during update_pricement. +// /// * `block_info` - Information about the current block at the time of this update_price transition. +// /// * `document_type` - A reference to the `DocumentTypeRef` indicating the type of the document being update_priced. +// /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being update_priced. +// /// +// /// # Returns +// /// +// /// * `Result` - On successful update_pricement, returns a new `Document` object populated with the provided data. Returns a `ProtocolError` if the update_pricement fails due to validation errors or other issues. +// /// +// /// # Errors +// /// +// /// This function may return a `ProtocolError` if validation fails, required fields are missing, or if there are mismatches between field types and the schema defined in the data contract. +// fn try_from_update_price_transition_v0( +// value: &DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result +// where +// Self: Sized; +// /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionV0` instance. This function is similar to `try_from_update_price_transition_v0` but consumes the `DocumentUpdatePriceTransitionV0` instance, making it suitable for scenarios where the transition is owned and should not be reused after document creation. +// /// +// /// # Arguments +// /// +// /// * `value` - An owned `DocumentUpdatePriceTransitionV0` instance containing the new information for the document. +// /// * `owner_id` - The `Identifier` of the document's owner. +// /// * `created_at` - An optional timestamp representing when the original document was created. This is preserved during update_pricement. +// /// * `created_at_block_height` - An optional height of the block at which the original document was created. This is preserved during update_pricement. +// /// * `created_at_core_block_height` - An optional core block height at which the original document was created. This is preserved during update_pricement. +// /// * `block_info` - Information about the current block at the time of this update_price transition. +// /// * `document_type` - A reference to the `DocumentTypeRef` indicating the type of the document being update_priced. +// /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being update_priced. +// /// +// /// # Returns +// /// +// /// * `Result` - On successful update_pricement, returns a new `Document` object populated with the provided data. Returns a `ProtocolError` if the update_pricement fails due to validation errors or other issues. +// /// +// /// # Errors +// /// +// /// This function may return a `ProtocolError` for the same reasons as `try_from_update_price_transition_v0`, including validation failures, missing required fields, or schema mismatches. +// fn try_from_owned_update_price_transition_v0( +// value: DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result +// where +// Self: Sized; +// } +// +// impl DocumentFromUpdatePriceTransitionV0 for Document { +// fn try_from_update_price_transition_v0( +// value: &DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result { +// let DocumentUpdatePriceTransitionV0 { +// base, +// revision, +// price, +// } = value; +// +// let id = base.id(); +// +// let requires_updated_at = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT); +// +// let requires_updated_at_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); +// +// let requires_updated_at_core_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); +// +// let updated_at = if requires_updated_at { +// Some(block_info.time_ms) +// } else { +// None +// }; +// +// let updated_at_block_height = if requires_updated_at_block_height { +// Some(block_info.height) +// } else { +// None +// }; +// +// let updated_at_core_block_height = if requires_updated_at_core_block_height { +// Some(block_info.core_height) +// } else { +// None +// }; +// +// data +// +// match platform_version +// .dpp +// .document_versions +// .document_structure_version +// { +// 0 => Ok(DocumentV0 { +// id, +// owner_id, +// properties: data.clone(), +// revision: Some(*revision), +// created_at, +// updated_at, +// transferred_at, +// created_at_block_height, +// updated_at_block_height, +// transferred_at_block_height, +// created_at_core_block_height, +// updated_at_core_block_height, +// transferred_at_core_block_height, +// } +// .into()), +// version => Err(ProtocolError::UnknownVersionMismatch { +// method: "Document::try_from_update_price_transition".to_string(), +// known_versions: vec![0], +// received: version, +// }), +// } +// } +// +// fn try_from_owned_update_price_transition_v0( +// value: DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result { +// let DocumentUpdatePriceTransitionV0 { +// base, +// revision, +// price, +// } = value; +// +// let id = base.id(); +// +// let requires_updated_at = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT); +// +// let requires_updated_at_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); +// +// let requires_updated_at_core_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); +// +// let updated_at = if requires_updated_at { +// Some(block_info.time_ms) +// } else { +// None +// }; +// +// let updated_at_block_height = if requires_updated_at_block_height { +// Some(block_info.height) +// } else { +// None +// }; +// +// let updated_at_core_block_height = if requires_updated_at_core_block_height { +// Some(block_info.core_height) +// } else { +// None +// }; +// match platform_version +// .dpp +// .document_versions +// .document_structure_version +// { +// 0 => Ok(DocumentV0 { +// id, +// owner_id, +// properties: data, +// revision: Some(revision), +// created_at, +// updated_at, +// transferred_at, +// created_at_block_height, +// updated_at_block_height, +// transferred_at_block_height, +// created_at_core_block_height, +// updated_at_core_block_height, +// transferred_at_core_block_height, +// } +// .into()), +// version => Err(ProtocolError::UnknownVersionMismatch { +// method: "Document::try_from_update_price_transition".to_string(), +// known_versions: vec![0], +// received: version, +// }), +// } +// } +// } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..74b27a3589d --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs @@ -0,0 +1,58 @@ +use crate::fee::Credits; +use crate::prelude::Revision; + +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; + +pub trait DocumentUpdatePriceTransitionV0Methods { + /// Returns a reference to the `base` field of the `DocumentUpdatePriceTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + /// Returns a mut reference to the `base` field of the `DocumentUpdatePriceTransitionV0`. + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentUpdatePriceTransitionV0`. + fn set_base(&mut self, base: DocumentBaseTransition); + + /// Returns a reference to the `revision` field of the `DocumentUpdatePriceTransitionV0`. + fn revision(&self) -> Revision; + + /// Sets the value of the `revision` field in the `DocumentUpdatePriceTransitionV0`. + fn set_revision(&mut self, revision: Revision); + + /// Returns a reference to the `price` field of the `DocumentUpdatePriceTransitionV0`. + fn price(&self) -> Credits; + + /// Sets the value of the `price` field in the `DocumentUpdatePriceTransitionV0`. + fn set_price(&mut self, price: Credits); +} + +impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base; + } + + fn revision(&self) -> Revision { + self.revision + } + + fn set_revision(&mut self, revision: Revision) { + self.revision = revision; + } + + fn price(&self) -> Credits { + self.price + } + + fn set_price(&mut self, price: Credits) { + self.price = price; + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs new file mode 100644 index 00000000000..3b605d7431c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs @@ -0,0 +1,49 @@ +use crate::fee::Credits; +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; + +impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransition { + fn base(&self) -> &DocumentBaseTransition { + match self { + DocumentUpdatePriceTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + match self { + DocumentUpdatePriceTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.base = base, + } + } + + fn revision(&self) -> Revision { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.revision, + } + } + + fn set_revision(&mut self, revision: Revision) { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.revision = revision, + } + } + + fn price(&self) -> Credits { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.price, + } + } + + fn set_price(&mut self, price: Credits) { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.price = price, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 9ff8246a8ef..45f11dc619f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -14,6 +14,8 @@ pub mod document_create_transition; pub mod document_delete_transition; pub mod document_replace_transition; pub mod document_transfer_transition; +pub mod document_purchase_transition; +pub mod document_update_price_transition; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; @@ -22,7 +24,11 @@ pub use document_create_transition::DocumentCreateTransition; pub use document_delete_transition::DocumentDeleteTransition; pub use document_replace_transition::DocumentReplaceTransition; pub use document_transfer_transition::DocumentTransferTransition; +pub use document_purchase_transition::DocumentPurchaseTransition; +pub use document_update_price_transition::DocumentUpdatePriceTransition; use platform_value::Value; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; @@ -81,6 +87,12 @@ pub enum DocumentTransition { #[display(fmt = "TransferDocumentTransition({})", "_0")] Transfer(DocumentTransferTransition), + + #[display(fmt = "UpdatePriceDocumentTransition({})", "_0")] + UpdatePrice(DocumentUpdatePriceTransition), + + #[display(fmt = "PurchaseDocumentTransition({})", "_0")] + Purchase(DocumentPurchaseTransition), } impl DocumentTransition { @@ -106,6 +118,22 @@ impl DocumentTransition { None } } + + pub fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { + if let Self::Transfer(ref t) = self { + Some(t) + } else { + None + } + } + + pub fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { + if let Self::Purchase(ref t) = self { + Some(t) + } else { + None + } + } } impl DocumentTransitionV0Methods for DocumentTransition { @@ -115,6 +143,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base(), DocumentTransition::Delete(t) => t.base(), DocumentTransition::Transfer(t) => t.base(), + DocumentTransition::UpdatePrice(t) => t.base(), + DocumentTransition::Purchase(t) => t.base(), } } @@ -124,6 +154,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.data().get(path), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } @@ -145,6 +177,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => Some(t.data()), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } @@ -154,6 +188,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => Some(t.revision()), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(t) => Some(t.revision()), + DocumentTransition::UpdatePrice(t) => Some(t.revision()), + DocumentTransition::Purchase(t) => Some(t.revision()), } } @@ -163,6 +199,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), DocumentTransition::Transfer(t) => t.base().identity_contract_nonce(), + DocumentTransition::UpdatePrice(t) => t.base().identity_contract_nonce(), + DocumentTransition::Purchase(t) => t.base().identity_contract_nonce(), } } @@ -181,6 +219,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { } DocumentTransition::Delete(_) => {} DocumentTransition::Transfer(_) => {} + DocumentTransition::UpdatePrice(_) => {} + DocumentTransition::Purchase(_) => {} } } @@ -194,6 +234,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base_mut(), DocumentTransition::Delete(t) => t.base_mut(), DocumentTransition::Transfer(t) => t.base_mut(), + DocumentTransition::UpdatePrice(t) => t.base_mut(), + DocumentTransition::Purchase(t) => t.base_mut(), } } @@ -203,6 +245,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => Some(t.data_mut()), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } @@ -211,7 +255,9 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(_) => {} DocumentTransition::Replace(ref mut t) => t.set_revision(revision), DocumentTransition::Delete(_) => {} - DocumentTransition::Transfer(_) => {} + DocumentTransition::Transfer(ref mut t) => t.set_revision(revision), + DocumentTransition::UpdatePrice(ref mut t) => t.set_revision(revision), + DocumentTransition::Purchase(ref mut t) => t.set_revision(revision), } } @@ -221,6 +267,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Delete(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Transfer(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::UpdatePrice(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::Purchase(t) => t.base_mut().set_identity_contract_nonce(nonce), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 27ae53c2a0a..a47a148baec 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -22,6 +22,7 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::fee::Credits; pub mod v0; @@ -94,7 +95,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, - update_feature_version: Option, + replace_feature_version: Option, base_feature_version: Option, ) -> Result { match batch_feature_version.unwrap_or( @@ -114,7 +115,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer, platform_version, batch_feature_version, - update_feature_version, + replace_feature_version, base_feature_version, )?, ), @@ -139,7 +140,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, - update_feature_version: Option, + transfer_feature_version: Option, base_feature_version: Option, ) -> Result { match batch_feature_version.unwrap_or( @@ -160,7 +161,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer, platform_version, batch_feature_version, - update_feature_version, + transfer_feature_version, base_feature_version, )?, ), @@ -216,4 +217,96 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { }), } } + + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + update_price_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_update_price_transition_from_document( + document, + document_type, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + update_price_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_update_price_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + purchase_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_purchase_transition_from_document( + document, + document_type, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + purchase_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_purchase_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index 8c48bce89cd..f6647ac962e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -22,6 +22,7 @@ use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; use std::convert::TryFrom; +use crate::fee::Credits; pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 { #[cfg(feature = "state-transition-signing")] @@ -49,7 +50,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - update_feature_version: Option, + replace_feature_version: Option, base_feature_version: Option, ) -> Result; @@ -78,10 +79,41 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - delete_feature_version: Option, + transfer_feature_version: Option, + base_feature_version: Option, + ) -> Result; + + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + update_price_feature_version: Option, base_feature_version: Option, ) -> Result; + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + purchase_feature_version: Option, + base_feature_version: Option, + ) -> Result; + + fn contract_based_security_level_requirement( &self, get_data_contract_security_level_requirement: impl Fn( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 3029f033e43..511e90b95bf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -18,9 +18,7 @@ use crate::state_transition::documents_batch_transition::document_create_transit use crate::state_transition::documents_batch_transition::document_transition::{ DocumentReplaceTransition, DocumentTransferTransition, }; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; +use crate::state_transition::documents_batch_transition::document_transition::{DocumentPurchaseTransition, DocumentTransition, DocumentTransitionV0Methods, DocumentUpdatePriceTransition}; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; #[cfg(feature = "state-transition-signing")] @@ -35,6 +33,7 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::fee::Credits; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { fn transitions(&self) -> &Vec { @@ -98,7 +97,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - update_feature_version: Option, + replace_feature_version: Option, base_feature_version: Option, ) -> Result { let owner_id = document.owner_id(); @@ -107,7 +106,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { document_type, identity_contract_nonce, platform_version, - update_feature_version, + replace_feature_version, base_feature_version, )?; let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { @@ -138,7 +137,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - delete_feature_version: Option, + transfer_feature_version: Option, base_feature_version: Option, ) -> Result { let owner_id = document.owner_id(); @@ -148,7 +147,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { identity_contract_nonce, recipient_owner_id, platform_version, - delete_feature_version, + transfer_feature_version, base_feature_version, )?; let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { @@ -207,6 +206,89 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + update_price_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let transfer_transition = DocumentUpdatePriceTransition::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + update_price_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![transfer_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + purchase_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let purchase_transition = DocumentPurchaseTransition::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + purchase_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![purchase_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } diff --git a/packages/rs-dpp/src/util/mod.rs b/packages/rs-dpp/src/util/mod.rs index a4ae012dca4..7e93e63350e 100644 --- a/packages/rs-dpp/src/util/mod.rs +++ b/packages/rs-dpp/src/util/mod.rs @@ -14,3 +14,4 @@ pub mod protocol_data; pub mod strings; pub mod vec; +pub mod units; diff --git a/packages/rs-dpp/src/util/units.rs b/packages/rs-dpp/src/util/units.rs new file mode 100644 index 00000000000..7ee0fc88382 --- /dev/null +++ b/packages/rs-dpp/src/util/units.rs @@ -0,0 +1,30 @@ +#[macro_export] +macro_rules! dash_to_credits { + // The macro takes a string literal representing the Dash amount. + ($dash:expr) => {{ + let dash_str = stringify!($dash); + + + // Parsing the input string to separate the whole and fractional parts. + let parts: Vec<&str> = dash_str.split('.').collect(); + let mut credits: u128 = 0; + + // Process the whole number part if it exists. + if let Some(whole) = parts.get(0) { + if let Ok(whole_number) = whole.parse::() { + credits += whole_number * 100_000_000_000; // Whole Dash amount to credits + } + } + + // Process the fractional part if it exists. + if let Some(fraction) = parts.get(1) { + let fraction_length = fraction.len(); + let fraction_number = fraction.parse::().unwrap_or(0); + // Calculate the multiplier based on the number of digits in the fraction. + let multiplier = 10u128.pow(11 - fraction_length as u32); + credits += fraction_number * multiplier; // Fractional Dash to credits + } + + credits as u64 + }}; +} \ No newline at end of file diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs index f266d18c763..1405076809f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs @@ -4,6 +4,7 @@ use dpp::consensus::ConsensusError; use dpp::consensus::state::document::document_already_present_error::DocumentAlreadyPresentError; use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::{ConsensusValidationResult, Identifier}; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -70,16 +71,22 @@ impl DocumentCreateTransitionActionStateValidationV0 for DocumentCreateTransitio // we also need to validate that the new document wouldn't conflict with any other document // this means for example having overlapping unique indexes - platform - .drive - .validate_document_create_transition_action_uniqueness( - contract, - document_type, - self, - owner_id, - transaction, - platform_version, - ) - .map_err(Error::Drive) + + if document_type + .indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_create_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs new file mode 100644 index 00000000000..c72f4ea28db --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs @@ -0,0 +1,87 @@ +use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::state_v0::DocumentPurchaseTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::structure_v0::DocumentPurchaseTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait DocumentPurchaseTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentPurchaseTransitionActionValidation for DocumentPurchaseTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_purchase_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentPurchaseTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_purchase_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentPurchaseTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..0c4ce65f76f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs @@ -0,0 +1,71 @@ +use dpp::block::epoch::Epoch; +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::platform_types::platform::PlatformStateRef; + +pub(super) trait DocumentPurchaseTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentPurchaseTransitionActionStateValidationV0 for DocumentPurchaseTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + + let contract = &contract_fetch_info.contract; + + let document_type_name = self.base().document_type_name(); + + let Some(document_type) = contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; + + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + + // We need to verify that the resultant document doesn't violate any unique properties + + if document_type + .indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_purchase_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..97eb12bfb93 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs @@ -0,0 +1,62 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::document::DocumentV0Getters; +use dpp::nft::TradeMode; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(super) trait DocumentPurchaseTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentPurchaseTransitionActionStructureValidationV0 for DocumentPurchaseTransitionAction { + fn validate_structure_v0( + &self, + _platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + // We can not purchase from ourselves + // The document owner id is already our owner id, as the action we want to take is to + // insert this document into the state (with our owner id) + if self.original_owner_id() == self.document().owner_id() { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} trying to purchase a document that is already owned by the purchaser", + document_type_name + )) + .into(), + )); + } + + + if document_type.trade_mode() != TradeMode::DirectPurchase { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} trade mode is not direct purchase but we are trying to purchase directly", + document_type_name + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::default()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs index 1329b35eae1..640b68390e2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs @@ -1,6 +1,7 @@ use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; @@ -48,19 +49,21 @@ impl DocumentReplaceTransitionActionStateValidationV0 for DocumentReplaceTransit // There is no need to verify that the document already existed, since this is done when // transforming into an action - // The rest of state validation is actually happening in documents batch transition transformer - // TODO: Think more about this architecture - - platform - .drive - .validate_document_replace_transition_action_uniqueness( - contract, - document_type, - self, - owner_id, - transaction, - platform_version, - ) - .map_err(Error::Drive) + if document_type + .indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_replace_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs index 2eaada0c4fd..3f6c0a747a6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -1,6 +1,7 @@ use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; @@ -48,19 +49,21 @@ impl DocumentTransferTransitionActionStateValidationV0 for DocumentTransferTrans // There is no need to verify that the document already existed, since this is done when // transforming into an action - // The rest of state validation is actually happening in documents batch transition transformer - // TODO: Think more about this architecture - - platform - .drive - .validate_document_transfer_transition_action_uniqueness( - contract, - document_type, - self, - owner_id, - transaction, - platform_version, - ) - .map_err(Error::Drive) + if document_type + .indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_transfer_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs new file mode 100644 index 00000000000..18876a8fe83 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs @@ -0,0 +1,87 @@ +use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::state_v0::DocumentUpdatePriceTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::structure_v0::DocumentUpdatePriceTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait DocumentUpdatePriceTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentUpdatePriceTransitionActionValidation for DocumentUpdatePriceTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentUpdatePriceTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentUpdatePriceTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..06cded8f0a8 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs @@ -0,0 +1,69 @@ +use dpp::block::epoch::Epoch; +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::platform_types::platform::PlatformStateRef; + +pub(super) trait DocumentUpdatePriceTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentUpdatePriceTransitionActionStateValidationV0 for DocumentUpdatePriceTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + + let contract = &contract_fetch_info.contract; + + let document_type_name = self.base().document_type_name(); + + let Some(document_type) = contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; + + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + + if document_type + .indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_update_price_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..730f725be9e --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs @@ -0,0 +1,46 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(super) trait DocumentUpdatePriceTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentUpdatePriceTransitionActionStructureValidationV0 for DocumentUpdatePriceTransitionAction { + fn validate_structure_v0( + &self, + _platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + if !document_type.trade_mode().seller_sets_price() { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is in trade mode {} that does not support the seller setting the price", + document_type_name, document_type.trade_mode(), + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::default()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs index 152a7612984..96e1d0847ce 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs @@ -2,3 +2,5 @@ pub(crate) mod document_create_transition_action; pub(crate) mod document_delete_transition_action; pub(crate) mod document_replace_transition_action; pub(crate) mod document_transfer_transition_action; +pub(crate) mod document_update_price_transition_action; +pub(crate) mod document_purchase_transition_action; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 1e0163bfd44..4e3f8b0a48d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -28,7 +28,9 @@ use drive::state_transition_action::system::bump_identity_data_contract_nonce_ac use crate::error::execution::ExecutionError; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { @@ -168,6 +170,32 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi )); } } + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + let result = update_price_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the update price action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::PurchaseAction(purchase_action) => { + let result = purchase_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the purchase action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "we should not have a bump identity contract nonce at this stage", diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index ca11a668b69..3f90f02d172 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -244,7 +244,7 @@ mod tests { }; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::transfer::Transferable; - use dpp::document::DocumentV0Setters; + use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; use dpp::platform_value::{Bytes32, Value}; @@ -259,6 +259,11 @@ mod tests { use rand::SeedableRng; use simple_signer::signer::SimpleSigner; use std::collections::BTreeMap; + use dpp::dash_to_credits; + use dpp::fee::Credits; + use dpp::nft::TradeMode; + use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; + use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; fn setup_identity( platform: &mut TempPlatform, @@ -597,7 +602,7 @@ mod tests { let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure() - .with_crypto_card_game(Transferable::Always); + .with_crypto_card_game_transfer_only(Transferable::Always); let mut rng = StdRng::seed_from_u64(435); @@ -1242,7 +1247,7 @@ mod tests { let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure() - .with_crypto_card_game(Transferable::Always); + .with_crypto_card_game_transfer_only(Transferable::Always); let mut rng = StdRng::seed_from_u64(433); @@ -1435,7 +1440,7 @@ mod tests { let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure() - .with_crypto_card_game(Transferable::Never); + .with_crypto_card_game_transfer_only(Transferable::Never); let mut rng = StdRng::seed_from_u64(435); @@ -1626,7 +1631,7 @@ mod tests { let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure() - .with_crypto_card_game(Transferable::Never); + .with_crypto_card_game_transfer_only(Transferable::Never); let mut rng = StdRng::seed_from_u64(435); @@ -1775,7 +1780,7 @@ mod tests { let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure() - .with_crypto_card_game(Transferable::Always); + .with_crypto_card_game_transfer_only(Transferable::Always); let mut rng = StdRng::seed_from_u64(433); @@ -2012,4 +2017,360 @@ mod tests { assert_eq!(processing_result.aggregated_fees().processing_fee, 1107610); } + + #[test] + fn test_document_set_price_on_document_without_ability_to_purchase() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Document transition action card is in trade mode No Trading that does not support the seller setting the price is not supported"); + } + + #[test] + fn test_document_set_price() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 6811750); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let price : Credits = query_sender_results.documents().first().unwrap().properties().get_integer("$price").expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + } + + #[test] + fn test_document_set_price_on_not_owned_document() { + + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index d65b0892893..6d2cd8e95e2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -16,8 +16,10 @@ use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; @@ -111,6 +113,24 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition transaction, platform_version, )?, + DocumentTransitionAction::UpdatePriceAction(update_price_action) => update_price_action + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, + DocumentTransitionAction::PurchaseAction(purchase_action) => purchase_action + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::BumpIdentityDataContractNonce(..) => { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "we should never start with a bump identity data contract nonce", diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 07ae9b5e7e7..c702b590cef 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -15,7 +15,7 @@ use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; -use dpp::document::{Document, DocumentV0Getters}; +use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; use dpp::prelude::Revision; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; @@ -24,6 +24,7 @@ use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; @@ -38,8 +39,11 @@ use drive::grovedb::TransactionArg; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; @@ -273,7 +277,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .filter(|transition| { matches!( transition, - DocumentTransition::Replace(_) | DocumentTransition::Transfer(_) + DocumentTransition::Replace(_) | DocumentTransition::Transfer(_) | DocumentTransition::Purchase(_) | DocumentTransition::UpdatePrice(_) ) }) .copied() @@ -502,6 +506,95 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition Ok(result) } } + DocumentTransition::UpdatePrice(document_update_price_transition) => { + let mut result = ConsensusValidationResult::::new(); + + let validation_result = + Self::find_replaced_document_v0(transition, replaced_documents); + + if !validation_result.is_valid_with_data() { + result.merge(validation_result); + return Ok(result); + } + + let original_document = validation_result.into_data()?; + + if validate_against_state { + //there are situations where we don't want to validate this against the state + // for example when we already applied the state transition action + // and we are just validating it happened + let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( + document_update_price_transition.revision(), + document_update_price_transition.base().id(), + original_document, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + } + + let document_update_price_action = + DocumentUpdatePriceTransitionAction::try_from_borrowed_document_update_price_transition( + document_update_price_transition, + original_document.clone(), //todo: find a way to not have to use cloning + block_info, + |_identifier| Ok(data_contract_fetch_info.clone()), + )?; + + if result.is_valid() { + Ok(DocumentTransitionAction::UpdatePriceAction(document_update_price_action).into()) + } else { + Ok(result) + } + } + DocumentTransition::Purchase(document_purchase_transition) => { + let mut result = ConsensusValidationResult::::new(); + + let validation_result = + Self::find_replaced_document_v0(transition, replaced_documents); + + if !validation_result.is_valid_with_data() { + result.merge(validation_result); + return Ok(result); + } + + let original_document = validation_result.into_data()?; + + let original_owner_id = original_document.owner_id(); + + if validate_against_state { + //there are situations where we don't want to validate this against the state + // for example when we already applied the state transition action + // and we are just validating it happened + let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( + document_purchase_transition.revision(), + document_purchase_transition.base().id(), + original_document, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + } + + let document_purchase_action = + DocumentPurchaseTransitionAction::try_from_borrowed_document_purchase_transition( + document_purchase_transition, + original_document.clone(), //todo: find a way to not have to use cloning + original_owner_id, + block_info, + |_identifier| Ok(data_contract_fetch_info.clone()), + )?; + + if result.is_valid() { + Ok(DocumentTransitionAction::PurchaseAction(document_purchase_action).into()) + } else { + Ok(result) + } + } } } diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index a3971dc066c..2cb7d2b2b4f 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -46,6 +46,7 @@ use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; use drive::drive::flags::StorageFlags; use tempfile::TempDir; +use dpp::nft::TradeMode; /// A test platform builder. pub struct TestPlatformBuilder { @@ -125,7 +126,7 @@ impl TempPlatform { } /// A function which adds the crypto card game to the state and returns it. - pub fn with_crypto_card_game(self, transferable: Transferable) -> (Self, DataContract) { + pub fn with_crypto_card_game_transfer_only(self, transferable: Transferable) -> (Self, DataContract) { let card_game_path = match transferable { Transferable::Never => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json", Transferable::Always => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json", @@ -155,6 +156,38 @@ impl TempPlatform { (self, card_game_contract) } + + /// A function which adds the crypto card game to the state and returns it. + pub fn with_crypto_card_game_nft(self, marketplace: TradeMode) -> (Self, DataContract) { + let card_game_path = match marketplace { + TradeMode::DirectPurchase => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", + _ => panic!("not yet supported") + }; + + let platform_version = self + .platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let card_game_contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + self.drive + .apply_contract( + &card_game_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + (self, card_game_contract) + } + /// Sets Platform to genesis state. pub fn set_genesis_state(self) -> Self { self.platform diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json new file mode 100644 index 00000000000..7e406bc8c7c --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json @@ -0,0 +1,133 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "transferable": 1, + "tradeMode": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs new file mode 100644 index 00000000000..97d9cf38164 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs @@ -0,0 +1,61 @@ +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::flags::StorageFlags; +use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::error::Error; +use dpp::block::epoch::Epoch; + +use dpp::prelude::Identifier; +use std::borrow::Cow; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl DriveHighLevelDocumentOperationConverter for DocumentPurchaseTransitionAction { + fn into_high_level_document_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let original_owner_id = self.original_owner_id(); + let purchase_amount = self.price(); + let document = self.document_owned(); + + // we are purchasing the document so the new storage flags should be on the new owner + + let new_document_owner_id = owner_id; + + let storage_flags = + StorageFlags::new_single_epoch(epoch.index, Some(new_document_owner_id.to_buffer())); + + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(new_document_owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + IdentityOperation(IdentityOperationType::RemoveFromIdentityBalance { + identity_id: owner_id.to_buffer(), + balance_to_remove: purchase_amount, + }), + IdentityOperation(IdentityOperationType::AddToIdentityBalance { + identity_id: original_owner_id.to_buffer(), + added_balance: purchase_amount, + }), + ]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs index c141cae6c46..18a9d29aec6 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs @@ -43,10 +43,25 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { platform_version, ) } + DocumentTransitionAction::PurchaseAction(document_purchase_transition) => { + document_purchase_transition.into_high_level_document_drive_operations( + epoch, + owner_id, + platform_version, + ) + } + DocumentTransitionAction::UpdatePriceAction(document_update_price_transition) => { + document_update_price_transition.into_high_level_document_drive_operations( + epoch, + owner_id, + platform_version, + ) + } DocumentTransitionAction::BumpIdentityDataContractNonce( bump_identity_contract_nonce_action, ) => bump_identity_contract_nonce_action .into_high_level_drive_operations(epoch, platform_version), + } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs new file mode 100644 index 00000000000..1401c3a1d4b --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs @@ -0,0 +1,47 @@ +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::flags::StorageFlags; +use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::error::Error; +use dpp::block::epoch::Epoch; + +use dpp::document::Document; +use dpp::prelude::Identifier; +use std::borrow::Cow; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentFromUpdatePriceTransitionAction, DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl DriveHighLevelDocumentOperationConverter for DocumentUpdatePriceTransitionAction { + fn into_high_level_document_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let document = self.document_owned(); + + let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); + + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + ]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs index b7df757580c..79f0e95d4d2 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs @@ -10,6 +10,8 @@ mod document_replace_transition; mod document_transfer_transition; mod document_transition; mod documents_batch_transition; +mod document_purchase_transition; +mod document_update_price_transition; /// A converter that will get High Level Drive Operations from State transitions pub trait DriveHighLevelDocumentOperationConverter { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs index ffeeab47df0..ab2e5908bad 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs @@ -41,3 +41,5 @@ mod validate_document_replace_transition_action_uniqueness; mod validate_document_transfer_transition_action_uniqueness; mod validate_document_uniqueness; +mod validate_document_purchase_transition_action_uniqueness; +mod validate_document_update_price_transition_action_uniqueness; diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs new file mode 100644 index 00000000000..a4e3bc9d05c --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs @@ -0,0 +1,70 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document purchase transition action would be unique in the state. + /// + /// # Arguments + /// + /// * `contract` - A `DataContract` object representing the contract. + /// * `document_type` - A `DocumentType` object representing the type of the document. + /// * `document_purchase_transition` - A `DocumentPurchaseTransitionAction` object representing the document purchase transition action. + /// * `owner_id` - An `Identifier` object representing the owner's ID. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result` - If successful, returns a `SimpleConsensusValidationResult` object representing the result of the validation. + /// If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn validate_document_purchase_transition_action_uniqueness( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_purchase_transition: &DocumentPurchaseTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .document + .index_uniqueness + .validate_document_purchase_transition_action_uniqueness + { + 0 => self.validate_document_purchase_transition_action_uniqueness_v0( + contract, + document_type, + document_purchase_transition, + owner_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "validate_document_purchase_transition_action_uniqueness".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs new file mode 100644 index 00000000000..a9673724cfc --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs @@ -0,0 +1,64 @@ +use dpp::data_contract::DataContract; + +use crate::drive::Drive; + +use crate::drive::document::index_uniqueness::internal::validate_uniqueness_of_data::UniquenessOfDataRequest; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use dpp::document::DocumentV0Getters; +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document purchase transition action would be unique in the state + #[inline(always)] + pub(super) fn validate_document_purchase_transition_action_uniqueness_v0( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_purchase_transition: &DocumentPurchaseTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let request = UniquenessOfDataRequest { + contract, + document_type, + owner_id, + document_id: document_purchase_transition.base().id(), + allow_original: true, + created_at: document_purchase_transition.document().created_at(), + updated_at: document_purchase_transition.document().updated_at(), + transferred_at: document_purchase_transition.document().transferred_at(), + created_at_block_height: document_purchase_transition + .document() + .created_at_block_height(), + updated_at_block_height: document_purchase_transition + .document() + .updated_at_block_height(), + transferred_at_block_height: document_purchase_transition + .document() + .transferred_at_block_height(), + created_at_core_block_height: document_purchase_transition + .document() + .created_at_core_block_height(), + updated_at_core_block_height: document_purchase_transition + .document() + .updated_at_core_block_height(), + transferred_at_core_block_height: document_purchase_transition + .document() + .transferred_at_core_block_height(), + data: document_purchase_transition.document().properties(), + }; + self.validate_uniqueness_of_data(request, transaction, platform_version) + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs new file mode 100644 index 00000000000..6d412a95ab8 --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs @@ -0,0 +1,70 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document update_price transition action would be unique in the state. + /// + /// # Arguments + /// + /// * `contract` - A `DataContract` object representing the contract. + /// * `document_type` - A `DocumentType` object representing the type of the document. + /// * `document_update_price_transition` - A `DocumentUpdatePriceTransitionAction` object representing the document update_price transition action. + /// * `owner_id` - An `Identifier` object representing the owner's ID. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result` - If successful, returns a `SimpleConsensusValidationResult` object representing the result of the validation. + /// If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn validate_document_update_price_transition_action_uniqueness( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_update_price_transition: &DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .document + .index_uniqueness + .validate_document_update_price_transition_action_uniqueness + { + 0 => self.validate_document_update_price_transition_action_uniqueness_v0( + contract, + document_type, + document_update_price_transition, + owner_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "validate_document_update_price_transition_action_uniqueness".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs new file mode 100644 index 00000000000..0166fc9243e --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs @@ -0,0 +1,55 @@ +use dpp::data_contract::DataContract; + +use crate::drive::Drive; + +use crate::drive::document::index_uniqueness::internal::validate_uniqueness_of_data::UniquenessOfDataRequest; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; +use dpp::document::DocumentV0Getters; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document update_price transition action would be unique in the state + #[inline(always)] + pub(super) fn validate_document_update_price_transition_action_uniqueness_v0( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_update_price_transition: &DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let request = UniquenessOfDataRequest { + contract, + document_type, + owner_id, + document_id: document_update_price_transition.base().id(), + allow_original: true, + created_at: document_update_price_transition.document().created_at(), + updated_at: document_update_price_transition.document().updated_at(), + transferred_at: document_update_price_transition.document().transferred_at(), + created_at_block_height: document_update_price_transition.document().created_at_block_height(), + updated_at_block_height: document_update_price_transition.document().updated_at_block_height(), + transferred_at_block_height: document_update_price_transition.document().transferred_at_block_height(), + created_at_core_block_height: document_update_price_transition + .document().created_at_core_block_height(), + updated_at_core_block_height: document_update_price_transition + .document().updated_at_core_block_height(), + transferred_at_core_block_height: document_update_price_transition + .document().transferred_at_core_block_height(), + data: document_update_price_transition.document().properties(), + }; + self.validate_uniqueness_of_data(request, transaction, platform_version) + } +} diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index a39199206f5..519829d55a2 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -35,6 +35,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; use std::borrow::Cow; use std::collections::{HashMap, HashSet}; +use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; impl Drive { /// Gathers operations for updating a document. @@ -51,11 +52,7 @@ impl Drive { ) -> Result, Error> { let drive_version = &platform_version.drive; let mut batch_operations: Vec = vec![]; - if !document_and_contract_info.document_type.documents_mutable() - && !document_and_contract_info - .document_type - .documents_transferable() - .is_transferable() + if !document_and_contract_info.document_type.requires_revision() // if it requires revision then there are reasons for us to be able to update in drive { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "documents for this contract are not mutable", diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index d4d4e148e49..2490a80f9e1 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -6,7 +6,9 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; use dpp::document::{Document, DocumentV0Getters}; use dpp::document::document_methods::DocumentMethodsV0; +use dpp::fee::Credits; use dpp::identity::PartialIdentity; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::prelude::{DataContract, Identifier}; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; @@ -24,7 +26,9 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_replace_transition::DocumentFromReplaceTransition; use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedPartialIdentity}; use platform_version::TryIntoPlatformVersioned; @@ -93,6 +97,8 @@ impl Drive { "no transition in a document batch transition".to_string(), ))); }; + + let owner_id = documents_batch_transition.owner_id(); let data_contract_id = transition.data_contract_id(); @@ -198,6 +204,29 @@ impl Drive { )])), )) } + DocumentTransition::UpdatePrice(update_price_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; + let new_document_price : Credits = document.properties().get_integer("$price").map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; + if new_document_price == update_price_transition.price() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } + DocumentTransition::Purchase(purchase_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (purchase)", purchase_transition.base().id()))))?; + + if document.owner_id() != owner_id { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", purchase_transition.base().id())))); + } + + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } } } StateTransition::IdentityCreate(identity_create_transition) => { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs index f2dda795254..02350c05dec 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs @@ -10,6 +10,8 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::DeleteAction(_) => DocumentTransitionActionType::Delete, DocumentTransitionAction::ReplaceAction(_) => DocumentTransitionActionType::Replace, DocumentTransitionAction::TransferAction(_) => DocumentTransitionActionType::Transfer, + DocumentTransitionAction::PurchaseAction(_) => DocumentTransitionActionType::Purchase, + DocumentTransitionAction::UpdatePriceAction(_) => DocumentTransitionActionType::UpdatePrice, DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { DocumentTransitionActionType::IgnoreWhileBumpingRevision } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs new file mode 100644 index 00000000000..53a84fe1a5d --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs @@ -0,0 +1,98 @@ +mod v0; + +use derive_more::From; +use dpp::document::Document; +use dpp::fee::Credits; + +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +pub use v0::*; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use dpp::version::PlatformVersion; + +/// transformer +pub mod transformer; + +/// action +#[derive(Debug, Clone, From)] +pub enum DocumentPurchaseTransitionAction { + /// v0 + V0(DocumentPurchaseTransitionActionV0), +} + +impl DocumentPurchaseTransitionActionAccessorsV0 for DocumentPurchaseTransitionAction { + fn base(&self) -> &DocumentBaseTransitionAction { + match self { + DocumentPurchaseTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> DocumentBaseTransitionAction { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.base, + } + } + + fn document(&self) -> &Document { + match self { + DocumentPurchaseTransitionAction::V0(v0) => &v0.document, + } + } + + fn document_owned(self) -> Document { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.document, + } + } + + fn original_owner_id(&self) -> Identifier { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.original_owner_id, + } + } + + fn price(&self) -> Credits { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.price, + } + } +} + +/// document from purchase transition +pub trait DocumentFromPurchaseTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentPurchaseTransitionAction` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentPurchaseTransitionAction` containing information about the document being purchased. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_purchase_transition_action( + document_purchase_transition_action: &DocumentPurchaseTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentPurchaseTransitionAction` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentPurchaseTransitionAction` instance containing information about the document being purchased. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_purchase_transition_action( + document_purchase_transition_action: DocumentPurchaseTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs new file mode 100644 index 00000000000..894e13b5bdc --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs @@ -0,0 +1,33 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::Document; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentPurchaseTransition; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionV0}; + +impl DocumentPurchaseTransitionAction { + /// try from borrowed + pub fn try_from_borrowed_document_purchase_transition( + document_purchase_transition: &DocumentPurchaseTransition, + original_document: Document, + purchaser_id: Identifier, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + match document_purchase_transition { + DocumentPurchaseTransition::V0(v0) => Ok( + DocumentPurchaseTransitionActionV0::try_from_borrowed_document_purchase_transition( + v0, + original_document, + purchaser_id, + block_info, + get_data_contract, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs new file mode 100644 index 00000000000..785ccb32b60 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs @@ -0,0 +1,37 @@ +pub mod transformer; + +use dpp::document::Document; +use dpp::fee::Credits; +use dpp::identifier::Identifier; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; + +/// document purchase transition action v0 +#[derive(Debug, Clone)] +pub struct DocumentPurchaseTransitionActionV0 { + /// Document Base Transition + pub base: DocumentBaseTransitionAction, + /// The new document to be inserted + pub document: Document, + /// The original owner id + pub original_owner_id: Identifier, + /// Price + pub price: Credits, +} + +/// document purchase transition action accessors v0 +pub trait DocumentPurchaseTransitionActionAccessorsV0 { + /// base + fn base(&self) -> &DocumentBaseTransitionAction; + /// base owned + fn base_owned(self) -> DocumentBaseTransitionAction; + /// the document to be inserted as a ref + fn document(&self) -> &Document; + /// the document to be inserted as owned + fn document_owned(self) -> Document; + + /// The original owner id + fn original_owner_id(&self) -> Identifier; + /// Price + fn price(&self) -> Credits; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..0ffa540d488 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs @@ -0,0 +1,57 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::{property_names, Document, DocumentV0Setters, DocumentV0Getters}; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::v0::DocumentPurchaseTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; + +impl DocumentPurchaseTransitionActionV0 { + /// try from borrowed + pub fn try_from_borrowed_document_purchase_transition( + document_purchase_transition: &DocumentPurchaseTransitionV0, + original_document: Document, + purchaser_id: Identifier, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + let DocumentPurchaseTransitionV0 { + base, + price, + .. + } = document_purchase_transition; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base, + get_data_contract, + )?; + + let original_owner_id = original_document.owner_id(); + + let mut modified_document = original_document; + + modified_document.set_owner_id(purchaser_id); + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { + modified_document.set_transferred_at(Some(block_info.time_ms)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { + modified_document.set_transferred_at_block_height(Some(block_info.height)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { + modified_document.set_transferred_at_core_block_height(Some(block_info.core_height)); + } + + Ok(DocumentPurchaseTransitionActionV0 { + base, + document: modified_document, + original_owner_id, + price: *price, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs new file mode 100644 index 00000000000..c206f21da92 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs @@ -0,0 +1,85 @@ +mod v0; + +use derive_more::From; +use dpp::document::Document; + +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +pub use v0::*; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use dpp::version::PlatformVersion; + +/// transformer +pub mod transformer; + +/// action +#[derive(Debug, Clone, From)] +pub enum DocumentUpdatePriceTransitionAction { + /// v0 + V0(DocumentUpdatePriceTransitionActionV0), +} + +impl DocumentUpdatePriceTransitionActionAccessorsV0 for DocumentUpdatePriceTransitionAction { + fn base(&self) -> &DocumentBaseTransitionAction { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> DocumentBaseTransitionAction { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => v0.base, + } + } + + fn document(&self) -> &Document { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => &v0.document, + } + } + + fn document_owned(self) -> Document { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => v0.document, + } + } +} + +/// document from update price transition +pub trait DocumentFromUpdatePriceTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionAction` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentUpdatePriceTransitionAction` containing information about the document being update_priced. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_update_price_transition_action( + document_update_price_transition_action: &DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionAction` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentUpdatePriceTransitionAction` instance containing information about the document being update_priced. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_update_price_transition_action( + document_update_price_transition_action: DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs new file mode 100644 index 00000000000..f52e99d0d61 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs @@ -0,0 +1,31 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::Document; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionV0}; + +impl DocumentUpdatePriceTransitionAction { + /// try from borrowed + pub fn try_from_borrowed_document_update_price_transition( + document_update_price_transition: &DocumentUpdatePriceTransition, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + match document_update_price_transition { + DocumentUpdatePriceTransition::V0(v0) => Ok( + DocumentUpdatePriceTransitionActionV0::try_from_borrowed_document_update_price_transition( + v0, + original_document, + block_info, + get_data_contract, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs new file mode 100644 index 00000000000..37f3f8100c4 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs @@ -0,0 +1,26 @@ +pub mod transformer; + +use dpp::document::Document; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; + +/// document transfer transition action v0 +#[derive(Debug, Clone)] +pub struct DocumentUpdatePriceTransitionActionV0 { + /// Document Base Transition + pub base: DocumentBaseTransitionAction, + /// The new document to be updated + pub document: Document, +} + +/// document transfer transition action accessors v0 +pub trait DocumentUpdatePriceTransitionActionAccessorsV0 { + /// base + fn base(&self) -> &DocumentBaseTransitionAction; + /// base owned + fn base_owned(self) -> DocumentBaseTransitionAction; + /// the document with updated price to be reinserted as a ref + fn document(&self) -> &Document; + /// the document with updated price to be reinserted as owned + fn document_owned(self) -> Document; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..2ad7cadc60e --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -0,0 +1,52 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::{property_names, Document, DocumentV0Setters}; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::v0::DocumentUpdatePriceTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; + +impl DocumentUpdatePriceTransitionActionV0 { + /// try from borrowed + pub fn try_from_borrowed_document_update_price_transition( + document_update_price_transition: &DocumentUpdatePriceTransitionV0, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + let DocumentUpdatePriceTransitionV0 { + base, + price, + .. + } = document_update_price_transition; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base, + get_data_contract, + )?; + + let mut modified_document = original_document; + + modified_document.set_u64("$price", *price); + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { + modified_document.set_updated_at(Some(block_info.time_ms)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { + modified_document.set_updated_at_block_height(Some(block_info.height)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { + modified_document.set_updated_at_core_block_height(Some(block_info.core_height)); + } + + Ok(DocumentUpdatePriceTransitionActionV0 { + base, + document: modified_document, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index d5df86cb324..a12ed9abb56 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -10,6 +10,12 @@ pub mod document_replace_transition_action; /// document_transfer_transition_action pub mod document_transfer_transition_action; +/// document_purchase_transition_action +pub mod document_purchase_transition_action; + +/// document_update_price_transition_action +pub mod document_update_price_transition_action; + pub use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; use derive_more::From; @@ -19,7 +25,9 @@ use crate::state_transition_action::document::documents_batch::document_transiti use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; /// version @@ -36,6 +44,10 @@ pub enum DocumentTransitionAction { DeleteAction(DocumentDeleteTransitionAction), /// transfer TransferAction(DocumentTransferTransitionAction), + /// purchase + PurchaseAction(DocumentPurchaseTransitionAction), + /// update price + UpdatePriceAction(DocumentUpdatePriceTransitionAction), /// bump identity data contract nonce BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), } @@ -48,6 +60,8 @@ impl DocumentTransitionAction { DocumentTransitionAction::DeleteAction(d) => Some(d.base()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), DocumentTransitionAction::TransferAction(d) => Some(d.base()), + DocumentTransitionAction::PurchaseAction(d) => Some(d.base()), + DocumentTransitionAction::UpdatePriceAction(d) => Some(d.base()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } @@ -59,6 +73,8 @@ impl DocumentTransitionAction { DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), DocumentTransitionAction::TransferAction(d) => Some(d.base_owned()), + DocumentTransitionAction::PurchaseAction(d) => Some(d.base_owned()), + DocumentTransitionAction::UpdatePriceAction(d) => Some(d.base_owned()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 5ad6d411ba6..e2e5778566c 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -127,6 +127,8 @@ pub struct StateTransitionSerializationVersions { pub document_replace_state_transition: DocumentFeatureVersionBounds, pub document_delete_state_transition: DocumentFeatureVersionBounds, pub document_transfer_state_transition: DocumentFeatureVersionBounds, + pub document_update_price_state_transition: DocumentFeatureVersionBounds, + pub document_purchase_state_transition: DocumentFeatureVersionBounds, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 85f045288eb..bdf90b4b6ab 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -110,10 +110,14 @@ pub struct DriveAbciDocumentsStateTransitionValidationVersions { pub document_delete_transition_structure_validation: FeatureVersion, pub document_replace_transition_structure_validation: FeatureVersion, pub document_transfer_transition_structure_validation: FeatureVersion, + pub document_purchase_transition_structure_validation: FeatureVersion, + pub document_update_price_transition_structure_validation: FeatureVersion, pub document_create_transition_state_validation: FeatureVersion, pub document_delete_transition_state_validation: FeatureVersion, pub document_replace_transition_state_validation: FeatureVersion, pub document_transfer_transition_state_validation: FeatureVersion, + pub document_purchase_transition_state_validation: FeatureVersion, + pub document_update_price_transition_state_validation: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 3b608473941..4446749e4b4 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -301,6 +301,8 @@ pub struct DriveDocumentIndexUniquenessMethodVersions { pub validate_document_create_transition_action_uniqueness: FeatureVersion, pub validate_document_replace_transition_action_uniqueness: FeatureVersion, pub validate_document_transfer_transition_action_uniqueness: FeatureVersion, + pub validate_document_purchase_transition_action_uniqueness: FeatureVersion, + pub validate_document_update_price_transition_action_uniqueness: FeatureVersion, pub validate_uniqueness_of_data: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 0fc8a1d44bc..7a89135c0a0 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -202,6 +202,8 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, validate_document_transfer_transition_action_uniqueness: 0, + validate_document_purchase_transition_action_uniqueness: 0, + validate_document_update_price_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, @@ -695,10 +697,14 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -911,6 +917,20 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_update_price_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_purchase_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 895c831cfd1..7dad5713645 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -210,6 +210,8 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, validate_document_transfer_transition_action_uniqueness: 0, + validate_document_purchase_transition_action_uniqueness: 0, + validate_document_update_price_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, @@ -695,10 +697,14 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -911,6 +917,20 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_update_price_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_purchase_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 28ec40451d3..6770157471c 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -201,6 +201,8 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, validate_document_transfer_transition_action_uniqueness: 0, + validate_document_purchase_transition_action_uniqueness: 0, + validate_document_update_price_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, @@ -694,10 +696,14 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -910,6 +916,20 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_update_price_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_purchase_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, From 7ae9a4f345db2654c8798ab5cfbd99a60731cb3f Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:26:08 +0700 Subject: [PATCH 18/65] Update packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../document_type/class_methods/try_from_schema/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 00b4084ebf1..2571ff0cf68 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -221,7 +221,7 @@ impl DocumentTypeV0 { .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); - // Are documents of this type mutable? (Overrides contract value) + // Are documents of this type transferable? (Overrides contract value) let documents_transferable_u8: u8 = Value::inner_optional_integer_value(schema_map, "transferable") .map_err(consensus_or_protocol_value_error)? From 91aeccdc81c1ce64bc1597486e5cb207054afac3 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:27:34 +0700 Subject: [PATCH 19/65] Update packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../src/data_contract/document_type/v0/random_document.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 078f61ded44..2b108981835 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -158,7 +158,7 @@ impl CreateRandomDocument for DocumentTypeV0 { .collect(); let revision = if self.requires_revision() { - Some(1) + Some(INITIAL_REVISION) } else { None }; From 1ffd47d25316fee6799edc66e533f92539e5b3a3 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:27:49 +0700 Subject: [PATCH 20/65] Update packages/rs-sdk/src/platform/transition/transfer_document.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-sdk/src/platform/transition/transfer_document.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index 6002a82ab62..f7d99f3c352 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -21,7 +21,7 @@ use drive::drive::Drive; use rs_dapi_client::{DapiRequest, RequestSettings}; #[async_trait::async_trait] -/// A trait for putting a document to platform +/// A trait for transferring a document on Platform pub trait TransferDocument { /// Transfers a document on platform /// setting settings to `None` sets default connection behavior From 5989093eb3ad9b3d32a254cde9444a1740bbaecb Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:27:56 +0700 Subject: [PATCH 21/65] Update packages/rs-sdk/src/platform/transition/transfer_document.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-sdk/src/platform/transition/transfer_document.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index f7d99f3c352..9cd1d23694c 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -24,7 +24,7 @@ use rs_dapi_client::{DapiRequest, RequestSettings}; /// A trait for transferring a document on Platform pub trait TransferDocument { /// Transfers a document on platform - /// setting settings to `None` sets default connection behavior + /// Setting settings to `None` sets default connection behavior async fn transfer_document_to_identity( &self, recipient_id: Identifier, From 1782ccf9dbff1b2f5dc1ce577ce3df2225c7ba6a Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:28:03 +0700 Subject: [PATCH 22/65] Update packages/rs-sdk/src/platform/transition/transfer_document.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-sdk/src/platform/transition/transfer_document.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index 9cd1d23694c..140a6e31663 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -43,7 +43,7 @@ pub trait TransferDocument { data_contract: Arc, ) -> Result; - /// Puts an identity on platform and waits for the confirmation proof + /// Transfers a document on platform and waits for the response async fn transfer_document_to_identity_and_wait_for_response( &self, recipient_id: Identifier, From 469a8aad358e4e176810173ac755970e2b606cfa Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:28:14 +0700 Subject: [PATCH 23/65] Update packages/strategy-tests/src/lib.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/strategy-tests/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index e841bda4ea7..4ed118819c6 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -944,7 +944,7 @@ impl Strategy { } } - // Generate state transition for document replace operation + // Generate state transition for document transfer operation OperationType::Document(DocumentOp { action: DocumentAction::DocumentActionTransferRandom, document_type, From 8b22da42c72cae88e517d5a889f845bc92a15df5 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:28:36 +0700 Subject: [PATCH 24/65] Update packages/rs-dpp/src/data_contract/document_type/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/document_type/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 9f99f217a59..7d8c6f990b6 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -54,7 +54,7 @@ pub struct DocumentTypeV0 { pub(in crate::data_contract) documents_keep_history: bool, /// Are documents mutable? pub(in crate::data_contract) documents_mutable: bool, - /// Are documents mutable? + /// Are documents transferable? pub(in crate::data_contract) documents_transferable: Transferable, pub(in crate::data_contract) data_contract_id: Identifier, /// Encryption key storage requirements From 849c4d836aab3237450d40f3837bfd706f0fe5c5 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:28:49 +0700 Subject: [PATCH 25/65] Update packages/rs-dpp/src/document/transfer.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/document/transfer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/document/transfer.rs b/packages/rs-dpp/src/document/transfer.rs index ea0615743cc..d0d561eab10 100644 --- a/packages/rs-dpp/src/document/transfer.rs +++ b/packages/rs-dpp/src/document/transfer.rs @@ -32,7 +32,7 @@ impl TryFrom for Transferable { 1 => Ok(Self::Always), value => Err(ProtocolError::ConsensusError( ConsensusError::BasicError(BasicError::UnknownTransferableTypeError( - UnknownTransferableTypeError::new(vec![0, 1, 3], value.into()), + UnknownTransferableTypeError::new(vec![0, 1], value), )) .into(), )), From 053aa0d874a8edebe31b136d9c435179cd19242d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:29:08 +0700 Subject: [PATCH 26/65] Update packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../document_transfer_transition_action/structure_v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs index 539a7f08485..3910574a615 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs @@ -34,7 +34,7 @@ impl DocumentTransferTransitionActionStructureValidationV0 for DocumentTransferT if !document_type.documents_transferable().is_transferable() { Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} is not mutable and not be updated", + "{} is not a transferable document type", document_type_name )) .into(), From 4b68f304594528559221372de0e75e073738803c Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:29:15 +0700 Subject: [PATCH 27/65] Update packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../document_delete_transition_action/structure_v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs index 74b1a5e9632..d0891ffe9b5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs @@ -29,7 +29,7 @@ impl DocumentDeleteTransitionActionStructureValidationV0 for DocumentDeleteTrans if !document_type.documents_mutable() { Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} is not mutable and not be deleted", + "{} is not mutable and can not be deleted", document_type_name )) .into(), From 5eaf71d5049a661b1d34351a2abbcca85f991d99 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 20:29:32 +0700 Subject: [PATCH 28/65] Update packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../document_replace_transition_action/structure_v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs index 5234e51de76..06555e8d892 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs @@ -35,7 +35,7 @@ impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTra if !document_type.documents_mutable() { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} is not mutable and not be updated", + "{} is not mutable and can not be replaced", document_type_name )) .into(), From 9c893cb67fa8f88e6c08fb14cb6d1c07ae4366e1 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 22 Apr 2024 20:29:43 +0700 Subject: [PATCH 29/65] more work --- .../document/v0/document-meta.json | 6 +- .../rs-dpp/src/data_contract/config/fields.rs | 2 + .../rs-dpp/src/data_contract/config/v0/mod.rs | 12 +- .../mod.rs | 3 + .../class_methods/try_from_schema/v0/mod.rs | 5 + .../create_document_from_data/v0/mod.rs | 3 +- .../document_type/v0/random_document_type.rs | 2 + .../src/data_contract/v0/methods/schema.rs | 1 + .../src/data_contract/v0/serialization/mod.rs | 1 + packages/rs-dpp/src/document/accessors/mod.rs | 8 + .../rs-dpp/src/document/accessors/v0/mod.rs | 2 + packages/rs-dpp/src/document/fields.rs | 1 + packages/rs-dpp/src/document/v0/accessors.rs | 9 + packages/rs-dpp/src/document/v0/serialize.rs | 62 ++- .../documents_batch_transition/methods/mod.rs | 2 + .../methods/v0/mod.rs | 1 + .../v0/v0_methods.rs | 4 +- .../src/execution/check_tx/v0/mod.rs | 2 + .../structure_v0/mod.rs | 2 +- .../state_v0/mod.rs | 1 + .../state_transitions/documents_batch/mod.rs | 432 +++++++++++++++++- .../documents_batch/transformer/v0/mod.rs | 15 +- .../v0/transformer.rs | 2 + .../v0/transformer.rs | 2 + .../v0/transformer.rs | 2 + packages/strategy-tests/src/operations.rs | 1 + 26 files changed, 556 insertions(+), 27 deletions(-) diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index 5768525fabc..2d6258a0570 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -482,15 +482,15 @@ "description": "Public key security level. 0 - Master, 1 - Critical, 2 - High, 3 - Medium. If none specified, High level is used" }, "documentsKeepHistory": { - "type": "bool", + "type": "boolean", "description": "True if the documents keep all their history, default is false" }, "documentsMutable": { - "type": "bool", + "type": "boolean", "description": "True if the documents are mutable, default is true" }, "canBeDeleted": { - "type": "bool", + "type": "boolean", "description": "True if the documents can be deleted, default is true" }, "transferable": { diff --git a/packages/rs-dpp/src/data_contract/config/fields.rs b/packages/rs-dpp/src/data_contract/config/fields.rs index 33ced8f00f7..7db8aac28d3 100644 --- a/packages/rs-dpp/src/data_contract/config/fields.rs +++ b/packages/rs-dpp/src/data_contract/config/fields.rs @@ -3,6 +3,7 @@ pub const DEFAULT_CONTRACT_CAN_BE_DELETED: bool = false; pub const DEFAULT_CONTRACT_MUTABILITY: bool = true; pub const DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY: bool = false; pub const DEFAULT_CONTRACT_DOCUMENT_MUTABILITY: bool = true; +pub const DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED: bool = true; pub mod property { pub const CAN_BE_DELETED: &str = "canBeDeleted"; @@ -10,6 +11,7 @@ pub mod property { pub const KEEPS_HISTORY: &str = "keepsHistory"; pub const DOCUMENTS_KEEP_HISTORY_CONTRACT_DEFAULT: &str = "documentsKeepHistoryContractDefault"; pub const DOCUMENTS_MUTABLE_CONTRACT_DEFAULT: &str = "documentsMutableContractDefault"; + pub const DOCUMENTS_CAN_BE_DELETED_CONTRACT_DEFAULT: &str = "documentsCanBeDeletedContractDefault"; pub const REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY: &str = "requiresIdentityEncryptionBoundedKey"; pub const REQUIRES_IDENTITY_DECRYPTION_BOUNDED_KEY: &str = diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index e8175fff48b..03772fc6c5c 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -1,9 +1,5 @@ use crate::data_contract::config; -use crate::data_contract::config::{ - DataContractConfig, DEFAULT_CONTRACT_CAN_BE_DELETED, DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, - DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, DEFAULT_CONTRACT_KEEPS_HISTORY, - DEFAULT_CONTRACT_MUTABILITY, -}; +use crate::data_contract::config::{DataContractConfig, DEFAULT_CONTRACT_CAN_BE_DELETED, DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, DEFAULT_CONTRACT_KEEPS_HISTORY, DEFAULT_CONTRACT_MUTABILITY, DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -104,6 +100,7 @@ impl std::default::Default for DataContractConfigV0 { keeps_history: DEFAULT_CONTRACT_KEEPS_HISTORY, documents_keep_history_contract_default: DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, documents_mutable_contract_default: DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, + documents_can_be_deleted_contract_default: DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, } @@ -162,6 +159,10 @@ impl DataContractConfigV0 { .get_optional_bool(config::property::DOCUMENTS_MUTABLE_CONTRACT_DEFAULT)? .unwrap_or(DEFAULT_CONTRACT_DOCUMENT_MUTABILITY); + let documents_can_be_deleted_contract_default = contract + .get_optional_bool(config::property::DOCUMENTS_CAN_BE_DELETED_CONTRACT_DEFAULT)? + .unwrap_or(DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED); + let requires_identity_encryption_bounded_key = contract .get_optional_integer::(config::property::REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY)? .map(|int| int.try_into()) @@ -178,6 +179,7 @@ impl DataContractConfigV0 { keeps_history, documents_keep_history_contract_default, documents_mutable_contract_default, + documents_can_be_deleted_contract_default, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, }) diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index a2d6e2fe63c..b767891bfb0 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -39,6 +39,7 @@ impl DocumentType { schema_defs: Option<&BTreeMap>, documents_keep_history_contract_default: bool, documents_mutable_contract_default: bool, + documents_can_be_deleted_contract_default: bool, validate: bool, validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -56,6 +57,7 @@ impl DocumentType { schema_defs, documents_keep_history_contract_default, documents_mutable_contract_default, + documents_can_be_deleted_contract_default, validate, validation_operations, platform_version, @@ -85,6 +87,7 @@ mod test { false, false, false, + false, &mut vec![], crate::version::PlatformVersion::latest(), ); diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 5983a7e4a65..24238a99db4 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -827,6 +827,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -856,6 +857,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -894,6 +896,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -932,6 +935,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -954,6 +958,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index 49b9e58f028..8f6b7eb12ce 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -13,6 +13,7 @@ use crate::ProtocolError; use chrono::Utc; use platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use platform_value::{Identifier, ReplacementType, Value}; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl DocumentTypeV0 { pub(in crate::data_contract::document_type) fn create_document_from_data_v0( @@ -31,7 +32,7 @@ impl DocumentTypeV0 { &document_entropy, ); - let revision = if self.documents_mutable() { + let revision = if self.requires_revision() { Some(INITIAL_REVISION) } else { None diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 43745516f96..adc0ffac409 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -561,6 +561,7 @@ impl DocumentTypeV0 { let documents_keep_history = rng.gen_bool(parameters.keep_history_chance); let documents_mutable = rng.gen_bool(parameters.documents_mutable_chance); + let documents_can_be_deleted = rng.gen_bool(parameters.documents_can_be_deleted_chance); let name = format!("doc_type_{}", rng.gen::()); @@ -592,6 +593,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_can_be_deleted, documents_transferable: Transferable::Never, trade_mode: TradeMode::None, data_contract_id, diff --git a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs index 91a4cfbb6d4..23bbbb106eb 100644 --- a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs +++ b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs @@ -25,6 +25,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { defs.as_ref(), self.config.documents_keep_history_contract_default(), self.config.documents_mutable_contract_default(), + self.config.documents_can_be_deleted_contract_default(), validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs index b1992eba7bb..87aa2680b7f 100644 --- a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs @@ -97,6 +97,7 @@ impl DataContractV0 { schema_defs.as_ref(), config.documents_keep_history_contract_default(), config.documents_mutable_contract_default(), + config.documents_can_be_deleted_contract_default(), validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index ce005efd62d..103137fc619 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -137,6 +137,14 @@ impl DocumentV0Setters for Document { } } + fn bump_revision(&mut self) { + match self { + Document::V0(v0) => { + v0.bump_revision() + }, + } + } + fn set_created_at(&mut self, created_at: Option) { match self { Document::V0(v0) => v0.created_at = created_at, diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index 7717ee02f5e..9c49e0c9725 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -3,6 +3,7 @@ use platform_value::btreemap_extensions::{ }; use platform_value::Value; use std::collections::BTreeMap; +use crate::document::Document; use crate::identity::TimestampMillis; use crate::prelude::Identifier; @@ -142,4 +143,5 @@ pub trait DocumentV0Setters: DocumentV0Getters { ); fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option); fn set_transferred_at(&mut self, transferred_at: Option); + fn bump_revision(&mut self); } diff --git a/packages/rs-dpp/src/document/fields.rs b/packages/rs-dpp/src/document/fields.rs index f4d7afee699..452b7f7c3ef 100644 --- a/packages/rs-dpp/src/document/fields.rs +++ b/packages/rs-dpp/src/document/fields.rs @@ -5,6 +5,7 @@ pub mod property_names { pub const DATA_CONTRACT_ID: &str = "$dataContractId"; pub const REVISION: &str = "$revision"; pub const OWNER_ID: &str = "$ownerId"; + pub const PRICE: &str = "$price"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; pub const TRANSFERRED_AT: &str = "$transferredAt"; diff --git a/packages/rs-dpp/src/document/v0/accessors.rs b/packages/rs-dpp/src/document/v0/accessors.rs index 4a14bea18a5..63d056b2d12 100644 --- a/packages/rs-dpp/src/document/v0/accessors.rs +++ b/packages/rs-dpp/src/document/v0/accessors.rs @@ -188,6 +188,15 @@ impl DocumentV0Setters for DocumentV0 { self.revision = revision; } + /// Bumps the document's revision if it has one. This is applicable if the document's schema indicates + /// the document type as mutable. + /// + fn bump_revision(&mut self) { + if let Some(revision) = self.revision { + self.revision = Some(revision.saturating_add(1)) + } + } + /// Sets the timestamp of when the document was created. This is applicable if the document's /// schema requires a creation timestamp. /// diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 259258fa4d4..22174066c7f 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -1,11 +1,7 @@ -use crate::data_contract::document_type::DocumentTypeRef; +use crate::data_contract::document_type::{DocumentPropertyType, DocumentTypeRef}; use crate::data_contract::errors::DataContractError; -use crate::document::property_names::{ - CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, - TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, - UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, -}; +use crate::document::property_names::{CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, PRICE, TRANSFERRED_AT, TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT}; #[cfg(feature = "validation")] use crate::prelude::ConsensusValidationResult; @@ -193,6 +189,18 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); + // Now we serialize the price which might not be necessary unless called for by the document type + + if document_type.trade_mode().seller_sets_price() { + if let Some(price) = self.properties.get(PRICE) { + buffer.push(1); + let price_as_u64: u64 = price.to_integer().map_err(ProtocolError::ValueError)?; + buffer.append(&mut price_as_u64.to_be_bytes().to_vec()); + } else { + buffer.push(0); + } + } + // User defined properties document_type .properties() @@ -397,6 +405,18 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); + // Now we serialize the price which might not be necessary unless called for by the document type + + if document_type.trade_mode().seller_sets_price() { + if let Some(price) = self.properties.get(PRICE) { + buffer.push(1); + let price_as_u64: u64 = price.to_integer().map_err(ProtocolError::ValueError)?; + buffer.append(&mut price_as_u64.to_be_bytes().to_vec()); + } else { + buffer.push(0); + } + } + // User defined properties document_type .properties() @@ -591,9 +611,33 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; + // Now we serialize the price which might not be necessary unless called for by the document type + + let price = if document_type.trade_mode().seller_sets_price() { + let has_price = buf.read_u8().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading has price bool from serialized document" + .to_string(), + ) + })?; + if has_price > 0 { + let price = buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading price u64 from serialized document" + .to_string(), + ) + })?; + Some(price) + } else { + None + } + } else { + None + }; + let mut finished_buffer = false; - let properties = document_type + let mut properties = document_type .properties() .iter() .filter_map(|(key, property)| { @@ -619,6 +663,10 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { } }) .collect::, DataContractError>>()?; + + if let Some(price) = price { + properties.insert(PRICE.to_string(), price.into()); + } Ok(DocumentV0 { id: Identifier::new(id), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index a47a148baec..52eafe0d4e2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -268,6 +268,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { fn new_document_purchase_transition_from_document( document: Document, document_type: DocumentTypeRef, + new_owner_id: Identifier, price: Credits, identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, @@ -289,6 +290,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { DocumentsBatchTransitionV0::new_document_purchase_transition_from_document( document, document_type, + new_owner_id, price, identity_public_key, identity_contract_nonce, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index f6647ac962e..ca1d67da326 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -102,6 +102,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 fn new_document_purchase_transition_from_document( document: Document, document_type: DocumentTypeRef, + new_owner_id: Identifier, price: Credits, identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 511e90b95bf..29b19cd73e2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -252,6 +252,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { fn new_document_purchase_transition_from_document( document: Document, document_type: DocumentTypeRef, + new_owner_id: Identifier, price: Credits, identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, @@ -262,7 +263,6 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { purchase_feature_version: Option, base_feature_version: Option, ) -> Result { - let owner_id = document.owner_id(); let purchase_transition = DocumentPurchaseTransition::from_document( document, document_type, @@ -273,7 +273,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { base_feature_version, )?; let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { - owner_id, + owner_id: new_owner_id, transitions: vec![purchase_transition.into()], user_fee_increase, signature_public_key_id: 0, diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 1bd5aff5212..ee1a279c0d0 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -549,6 +549,7 @@ mod tests { }, keep_history_chance: 0.0, documents_mutable_chance: 0.0, + documents_can_be_deleted_chance: 0.0, }; let mut rng = StdRng::seed_from_u64(6); @@ -1250,6 +1251,7 @@ mod tests { }, keep_history_chance: 0.0, documents_mutable_chance: 0.0, + documents_can_be_deleted_chance: 0.0, }; let mut rng = StdRng::seed_from_u64(6); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs index 97eb12bfb93..9261e8709bb 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs @@ -39,7 +39,7 @@ impl DocumentPurchaseTransitionActionStructureValidationV0 for DocumentPurchaseT if self.original_owner_id() == self.document().owner_id() { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} trying to purchase a document that is already owned by the purchaser", + "on document type: {} identity trying to purchase a document that is already owned by the purchaser", document_type_name )) .into(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs index 06cded8f0a8..aa44cc09a23 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs @@ -2,6 +2,7 @@ use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::document::DocumentV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 3f90f02d172..ac26b6d3ac7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -452,7 +452,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 5074230); + assert_eq!(processing_result.aggregated_fees().processing_fee, 5074630); } #[test] @@ -1416,7 +1416,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 9350380); + assert_eq!(processing_result.aggregated_fees().processing_fee, 9350780); let query_sender_results = platform .drive @@ -1949,7 +1949,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10277100); + assert_eq!(processing_result.aggregated_fees().processing_fee, 10277500); let query_sender_results = platform .drive @@ -2345,7 +2345,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6811750); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); let query_sender_results = platform .drive @@ -2364,13 +2364,435 @@ mod tests { // The sender document should have the desired price - let price : Credits = query_sender_results.documents().first().unwrap().properties().get_integer("$price").expect("expected to get back price"); + let document = query_sender_results.documents().first().unwrap(); + + let price : Credits = document.properties().get_integer("$price").expect("expected to get back price"); assert_eq!(dash_to_credits!(0.1), price); + + assert_eq!(document.revision(), Some(2)); + } + + #[test] + fn test_document_set_price_and_purchase() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents.clone(), None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents.clone(), None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let mut document = query_sender_results.documents_owned().remove(0); + + let price : Credits = document.properties().get_integer("$price").expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); } #[test] fn test_document_set_price_on_not_owned_document() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (other_identity, other_identity_signer, other_identity_key) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + document.set_owner_id(other_identity.id()); // we do this to trick the system + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &other_identity_key, + 1, + 0, + &other_identity_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + // The sender document should not have the desired price + + let document = query_sender_results.documents().first().unwrap(); + + assert_eq!(document.properties().get_optional_integer::("$price").expect("expected None"), None); } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index c702b590cef..c05b388294f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -519,6 +519,17 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let original_document = validation_result.into_data()?; + let validation_result = Self::check_ownership_of_old_replaced_document_v0( + document_update_price_transition.base().id(), + original_document, + &owner_id, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + if validate_against_state { //there are situations where we don't want to validate this against the state // for example when we already applied the state transition action @@ -562,8 +573,6 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let original_document = validation_result.into_data()?; - let original_owner_id = original_document.owner_id(); - if validate_against_state { //there are situations where we don't want to validate this against the state // for example when we already applied the state transition action @@ -584,7 +593,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition DocumentPurchaseTransitionAction::try_from_borrowed_document_purchase_transition( document_purchase_transition, original_document.clone(), //todo: find a way to not have to use cloning - original_owner_id, + owner_id, block_info, |_identifier| Ok(data_contract_fetch_info.clone()), )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs index 0ffa540d488..0ce00aa369c 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs @@ -32,6 +32,8 @@ impl DocumentPurchaseTransitionActionV0 { let original_owner_id = original_document.owner_id(); let mut modified_document = original_document; + + modified_document.bump_revision(); modified_document.set_owner_id(purchaser_id); diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs index aec0832019b..d9de65bd9fc 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -31,6 +31,8 @@ impl DocumentTransferTransitionActionV0 { let mut modified_document = original_document; modified_document.set_owner_id(*recipient_owner_id); + + modified_document.bump_revision(); if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { modified_document.set_transferred_at(Some(block_info.time_ms)); diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs index 2ad7cadc60e..d68edd50ea9 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -32,6 +32,8 @@ impl DocumentUpdatePriceTransitionActionV0 { modified_document.set_u64("$price", *price); + modified_document.bump_revision(); + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { modified_document.set_updated_at(Some(block_info.time_ms)); } diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 2affeddf50c..2cbf7e8a04a 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -323,6 +323,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Dat None, true, true, + true, validate, &mut vec![], platform_version, From c381b0d0b74cf230c3deeb65a7671690ff1775d8 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 22 Apr 2024 21:09:22 +0700 Subject: [PATCH 30/65] fmt --- .../document_type/methods/create_document_from_data/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index 8f6b7eb12ce..3242e1db19c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -1,4 +1,5 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, @@ -13,7 +14,6 @@ use crate::ProtocolError; use chrono::Utc; use platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use platform_value::{Identifier, ReplacementType, Value}; -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl DocumentTypeV0 { pub(in crate::data_contract::document_type) fn create_document_from_data_v0( From a0dadea085de82d86d1187c77213d8042bae1bcb Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 22 Apr 2024 21:51:20 +0700 Subject: [PATCH 31/65] fmt --- .../rs-dpp/src/data_contract/config/fields.rs | 3 +- .../rs-dpp/src/data_contract/config/v0/mod.rs | 6 +- .../document_type/accessors/mod.rs | 14 +- .../document_type/accessors/v0/mod.rs | 4 +- .../class_methods/try_from_schema/v0/mod.rs | 17 +-- .../create_document_from_data/v0/mod.rs | 2 +- .../document_type/methods/mod.rs | 4 +- .../document_type/v0/accessors.rs | 6 +- .../src/data_contract/document_type/v0/mod.rs | 2 +- .../document_type/v0/random_document_type.rs | 2 +- packages/rs-dpp/src/document/accessors/mod.rs | 4 +- .../rs-dpp/src/document/accessors/v0/mod.rs | 2 +- .../src/document/extended_document/v0/mod.rs | 2 +- packages/rs-dpp/src/document/v0/serialize.rs | 14 +- .../src/errors/consensus/basic/basic_error.rs | 2 +- .../consensus/basic/data_contract/mod.rs | 4 +- packages/rs-dpp/src/lib.rs | 2 +- packages/rs-dpp/src/nft/mod.rs | 10 +- .../from_document.rs | 2 +- .../v0/from_document.rs | 2 +- .../document_purchase_transition/v0/mod.rs | 13 +- .../document_update_price_transition/mod.rs | 2 +- .../v0/mod.rs | 46 +++---- .../document_transition/mod.rs | 2 +- .../documents_batch_transition/methods/mod.rs | 11 +- .../methods/v0/mod.rs | 4 +- .../v0/v0_methods.rs | 16 ++- packages/rs-dpp/src/util/mod.rs | 2 +- packages/rs-dpp/src/util/units.rs | 3 +- .../state_v0/mod.rs | 3 +- .../state_v0/mod.rs | 5 +- .../structure_v0/mod.rs | 3 +- .../state_v0/mod.rs | 3 +- .../state_v0/mod.rs | 13 +- .../state_v0/mod.rs | 3 +- .../structure_v0/mod.rs | 9 +- .../documents_batch/action_validation/mod.rs | 2 +- .../state_transitions/documents_batch/mod.rs | 129 +++++++++++------- .../documents_batch/state/v0/mod.rs | 7 +- .../documents_batch/transformer/v0/mod.rs | 12 +- .../rs-drive-abci/src/test/helpers/setup.rs | 8 +- .../document/document_transition.rs | 1 - .../drive/batch/transitions/document/mod.rs | 4 +- .../drive/document/index_uniqueness/mod.rs | 2 +- .../v0/mod.rs | 23 +++- .../v0/mod.rs | 5 +- .../v0/mod.rs | 4 +- .../document_transition/action_type.rs | 6 +- .../v0/transformer.rs | 14 +- .../v0/transformer.rs | 4 +- .../v0/transformer.rs | 6 +- .../document_transition/mod.rs | 4 +- 52 files changed, 254 insertions(+), 219 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/config/fields.rs b/packages/rs-dpp/src/data_contract/config/fields.rs index 7db8aac28d3..200c0402e07 100644 --- a/packages/rs-dpp/src/data_contract/config/fields.rs +++ b/packages/rs-dpp/src/data_contract/config/fields.rs @@ -11,7 +11,8 @@ pub mod property { pub const KEEPS_HISTORY: &str = "keepsHistory"; pub const DOCUMENTS_KEEP_HISTORY_CONTRACT_DEFAULT: &str = "documentsKeepHistoryContractDefault"; pub const DOCUMENTS_MUTABLE_CONTRACT_DEFAULT: &str = "documentsMutableContractDefault"; - pub const DOCUMENTS_CAN_BE_DELETED_CONTRACT_DEFAULT: &str = "documentsCanBeDeletedContractDefault"; + pub const DOCUMENTS_CAN_BE_DELETED_CONTRACT_DEFAULT: &str = + "documentsCanBeDeletedContractDefault"; pub const REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY: &str = "requiresIdentityEncryptionBoundedKey"; pub const REQUIRES_IDENTITY_DECRYPTION_BOUNDED_KEY: &str = diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 03772fc6c5c..59b574920ae 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -1,5 +1,9 @@ use crate::data_contract::config; -use crate::data_contract::config::{DataContractConfig, DEFAULT_CONTRACT_CAN_BE_DELETED, DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, DEFAULT_CONTRACT_KEEPS_HISTORY, DEFAULT_CONTRACT_MUTABILITY, DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED}; +use crate::data_contract::config::{ + DataContractConfig, DEFAULT_CONTRACT_CAN_BE_DELETED, DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED, + DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, + DEFAULT_CONTRACT_KEEPS_HISTORY, DEFAULT_CONTRACT_MUTABILITY, +}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::ProtocolError; use bincode::{Decode, Encode}; diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index 8f886e6b0fa..a2580e846bc 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -10,10 +10,10 @@ use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use indexmap::IndexMap; use std::collections::BTreeSet; pub use v0::*; -use crate::nft::TradeMode; impl DocumentTypeV0Getters for DocumentType { fn name(&self) -> &String { @@ -87,13 +87,13 @@ impl DocumentTypeV0Getters for DocumentType { DocumentType::V0(v0) => v0.documents_mutable(), } } - + fn trade_mode(&self) -> TradeMode { match self { DocumentType::V0(v0) => v0.trade_mode(), } } - + fn documents_transferable(&self) -> Transferable { match self { DocumentType::V0(v0) => v0.documents_transferable(), @@ -203,13 +203,13 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { DocumentTypeRef::V0(v0) => v0.documents_transferable(), } } - + fn trade_mode(&self) -> TradeMode { match self { DocumentTypeRef::V0(v0) => v0.trade_mode(), } } - + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeRef::V0(v0) => v0.data_contract_id(), @@ -313,13 +313,13 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { DocumentTypeMutRef::V0(v0) => v0.documents_transferable(), } } - + fn trade_mode(&self) -> TradeMode { match self { DocumentTypeMutRef::V0(v0) => v0.trade_mode(), } } - + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeMutRef::V0(v0) => v0.data_contract_id(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index bd97f6fe87a..7e0af32b92c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -4,13 +4,13 @@ use crate::data_contract::document_type::property::DocumentProperty; use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use indexmap::IndexMap; use std::collections::BTreeSet; -use crate::data_contract::document_type::DocumentTypeRef; -use crate::nft::TradeMode; pub trait DocumentTypeV0Getters { /// Returns the name of the document type. diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 1239508ff70..6d0ce5f4bae 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -32,6 +32,9 @@ use crate::consensus::basic::data_contract::InvalidDocumentTypeRequiredSecurityL use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError; #[cfg(feature = "validation")] use crate::consensus::basic::BasicError; +use crate::data_contract::document_type::property_names::{ + CAN_BE_DELETED, DOCUMENTS_KEEP_HISTORY, DOCUMENTS_MUTABLE, TRADE_MODE, TRANSFERABLE, +}; use crate::data_contract::document_type::{property_names, DocumentType}; use crate::data_contract::errors::DataContractError; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; @@ -44,7 +47,6 @@ use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::{Identifier, Value}; -use crate::data_contract::document_type::property_names::{CAN_BE_DELETED, DOCUMENTS_KEEP_HISTORY, DOCUMENTS_MUTABLE, TRADE_MODE, TRANSFERABLE}; const UNIQUE_INDEX_LIMIT_V0: usize = 16; const NOT_ALLOWED_SYSTEM_PROPERTIES: [&str; 1] = ["$id"]; @@ -209,7 +211,7 @@ impl DocumentTypeV0 { format!("document schema must be an object: {err}"), )) })?; - + // Do documents of this type keep history? (Overrides contract value) let documents_keep_history: bool = Value::inner_optional_bool_value(schema_map, DOCUMENTS_KEEP_HISTORY) @@ -221,14 +223,13 @@ impl DocumentTypeV0 { Value::inner_optional_bool_value(schema_map, DOCUMENTS_MUTABLE) .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); - + // Can documents of this type be deleted? (Overrides contract value) let documents_can_be_deleted: bool = Value::inner_optional_bool_value(schema_map, CAN_BE_DELETED) .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_can_be_deleted); - // Are documents of this type transferable? let documents_transferable_u8: u8 = Value::inner_optional_integer_value(schema_map, TRANSFERABLE) @@ -245,14 +246,6 @@ impl DocumentTypeV0 { let trade_mode = documents_trade_mode_u8.try_into()?; - // Are documents of this type transferable? (Overrides contract value) - let documents_transferable_u8: u8 = - Value::inner_optional_integer_value(schema_map, "transferable") - .map_err(consensus_or_protocol_value_error)? - .unwrap_or_default(); - - let documents_transferable = documents_transferable_u8.try_into()?; - // Extract the properties let property_values = Value::inner_optional_index_map::( schema_map, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index 032f4ce756d..47fdc1867a2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, @@ -14,7 +15,6 @@ use crate::ProtocolError; use chrono::Utc; use platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use platform_value::{Identifier, ReplacementType, Value}; -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; impl DocumentTypeV0 { pub(in crate::data_contract::document_type) fn create_document_from_data_v0( diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 3ec1d080a75..32b0e54cf47 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -216,7 +216,9 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn requires_revision(&self) -> bool { - self.documents_mutable || self.documents_transferable.is_transferable() || self.trade_mode.seller_sets_price() + self.documents_mutable + || self.documents_transferable.is_transferable() + || self.trade_mode.seller_sets_price() } fn top_level_indices(&self) -> Vec<&IndexProperty> { diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index 3f047b2bfc4..906f7471818 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -9,9 +9,9 @@ use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use indexmap::IndexMap; use std::collections::BTreeSet; -use crate::nft::TradeMode; impl DocumentTypeV0Getters for DocumentTypeV0 { fn name(&self) -> &String { @@ -65,11 +65,11 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { fn documents_transferable(&self) -> Transferable { self.documents_transferable } - + fn trade_mode(&self) -> TradeMode { self.trade_mode } - + fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 04447a36f43..245e4cbbe78 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -11,8 +11,8 @@ pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; -use platform_value::{Identifier, Value}; use crate::nft::TradeMode; +use platform_value::{Identifier, Value}; mod accessors; #[cfg(feature = "random-documents")] diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index adc0ffac409..0ed76147902 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -107,6 +107,7 @@ use crate::data_contract::document_type::{ }; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use crate::version::PlatformVersion; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -119,7 +120,6 @@ use rand::Rng; use serde_json::json; use std::collections::BTreeSet; use std::ops::Range; -use crate::nft::TradeMode; impl DocumentTypeV0 { pub fn random_document_type( diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index 103137fc619..2ba6d883103 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -139,9 +139,7 @@ impl DocumentV0Setters for Document { fn bump_revision(&mut self) { match self { - Document::V0(v0) => { - v0.bump_revision() - }, + Document::V0(v0) => v0.bump_revision(), } } diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index 9c49e0c9725..c9ca1119e96 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -1,9 +1,9 @@ +use crate::document::Document; use platform_value::btreemap_extensions::{ BTreeValueMapInsertionPathHelper, BTreeValueMapPathHelper, }; use platform_value::Value; use std::collections::BTreeMap; -use crate::document::Document; use crate::identity::TimestampMillis; use crate::prelude::Identifier; diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index b08f2a60199..a5cf0ec4765 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -32,6 +32,7 @@ use std::collections::BTreeMap; use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; #[cfg(feature = "validation")] use crate::data_contract::validation::DataContractValidationMethodsV0; #[cfg(feature = "document-json-conversion")] @@ -46,7 +47,6 @@ use platform_value::converter::serde_json::BTreeValueJsonConverter; use platform_version::version::PlatformVersion; #[cfg(feature = "document-json-conversion")] use serde_json::Value as JsonValue; -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; /// The `ExtendedDocumentV0` struct represents the data provided by the platform in response to a query. #[derive(Debug, Clone)] diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 22174066c7f..defdbd16e08 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -1,7 +1,11 @@ use crate::data_contract::document_type::{DocumentPropertyType, DocumentTypeRef}; use crate::data_contract::errors::DataContractError; -use crate::document::property_names::{CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, PRICE, TRANSFERRED_AT, TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT}; +use crate::document::property_names::{ + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, PRICE, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, +}; #[cfg(feature = "validation")] use crate::prelude::ConsensusValidationResult; @@ -616,15 +620,13 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { let price = if document_type.trade_mode().seller_sets_price() { let has_price = buf.read_u8().map_err(|_| { DataContractError::CorruptedSerialization( - "error reading has price bool from serialized document" - .to_string(), + "error reading has price bool from serialized document".to_string(), ) })?; if has_price > 0 { let price = buf.read_u64::().map_err(|_| { DataContractError::CorruptedSerialization( - "error reading price u64 from serialized document" - .to_string(), + "error reading price u64 from serialized document".to_string(), ) })?; Some(price) @@ -663,7 +665,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { } }) .collect::, DataContractError>>()?; - + if let Some(price) = price { properties.insert(PRICE.to_string(), price.into()); } diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index d580b8e74fb..11361044caf 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -15,7 +15,7 @@ use crate::consensus::basic::data_contract::{ InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, - UnknownStorageKeyRequirementsError, UnknownTransferableTypeError, UnknownTradeModeError, + UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 8924d285b70..f3372edcb3a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -22,8 +22,8 @@ mod undefined_index_property_error; mod unique_indices_limit_reached_error; mod unknown_security_level_error; mod unknown_storage_key_requirements_error; -mod unknown_transferable_type_error; mod unknown_trade_mode_error; +mod unknown_transferable_type_error; pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; @@ -50,5 +50,5 @@ pub use unique_indices_limit_reached_error::*; pub use invalid_document_type_name_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; -pub use unknown_transferable_type_error::*; pub use unknown_trade_mode_error::*; +pub use unknown_transferable_type_error::*; diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 30a65a87c18..c9eb000abb4 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -39,6 +39,7 @@ pub mod asset_lock; pub mod balances; pub mod block; pub mod fee; +pub mod nft; pub mod serialization; #[cfg(any( feature = "message-signing", @@ -48,7 +49,6 @@ pub mod signing; #[cfg(feature = "system_contracts")] pub mod system_data_contracts; pub mod withdrawal; -pub mod nft; pub use async_trait; diff --git a/packages/rs-dpp/src/nft/mod.rs b/packages/rs-dpp/src/nft/mod.rs index 9796c66ba0d..9b4ed424ac6 100644 --- a/packages/rs-dpp/src/nft/mod.rs +++ b/packages/rs-dpp/src/nft/mod.rs @@ -1,9 +1,9 @@ -use std::fmt; -use std::fmt::{Display, Formatter}; -use crate::consensus::basic::BasicError; use crate::consensus::basic::data_contract::UnknownTradeModeError; +use crate::consensus::basic::BasicError; use crate::consensus::ConsensusError; use crate::ProtocolError; +use std::fmt; +use std::fmt::{Display, Formatter}; #[derive(Debug, PartialEq, Clone, Copy)] pub enum TradeMode { @@ -18,7 +18,7 @@ impl TradeMode { match self { TradeMode::None => false, TradeMode::DirectPurchase => true, - TradeMode::PublicOffer => true, //min price + TradeMode::PublicOffer => true, //min price TradeMode::PrivateOffer => true, //min price } } @@ -48,7 +48,7 @@ impl TryFrom for TradeMode { ConsensusError::BasicError(BasicError::UnknownTradeModeError( UnknownTradeModeError::new(vec![0, 1, 2, 3], value.into()), )) - .into(), + .into(), )), } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs index dca2eb33aa3..d4b913405f0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs @@ -1,9 +1,9 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; +use crate::fee::Credits; use crate::prelude::IdentityNonce; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::fee::Credits; use crate::state_transition::documents_batch_transition::document_transition::{DocumentPurchaseTransition}; use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs index 90ff16ad7ed..80bfc2115c5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs @@ -24,7 +24,7 @@ impl DocumentPurchaseTransitionV0 { }, ))); }; - + Ok(DocumentPurchaseTransitionV0 { base: DocumentBaseTransition::from_document( &document, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs index e69e415ad5c..255310c394c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs @@ -6,10 +6,10 @@ use crate::state_transition::documents_batch_transition::document_base_transitio use bincode::{Decode, Encode}; use derive_more::Display; -#[cfg(feature = "state-transition-serde-conversion")] -use serde::{Deserialize, Serialize}; use crate::fee::Credits; use crate::prelude::Revision; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; @@ -24,13 +24,10 @@ pub struct DocumentPurchaseTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "$revision") + feature = "state-transition-serde-conversion", + serde(rename = "$revision") )] pub revision: Revision, - #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "price") - )] + #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "price"))] pub price: Credits, } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs index d90afc3db3c..0020a4c806e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs @@ -23,4 +23,4 @@ pub use v0::*; pub enum DocumentUpdatePriceTransition { #[display(fmt = "V0({})", "_0")] V0(DocumentUpdatePriceTransitionV0), -} \ No newline at end of file +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs index 0ede0698e91..90a57bdaef1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs @@ -13,10 +13,10 @@ use crate::block::block_info::BlockInfo; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0}; +use crate::fee::Credits; use crate::{document, ProtocolError}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; -use crate::fee::Credits; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; @@ -42,12 +42,12 @@ pub struct DocumentUpdatePriceTransitionV0 { )] pub revision: Revision, #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "$price") + feature = "state-transition-serde-conversion", + serde(rename = "$price") )] pub price: Credits, } -// +// // /// document from update_price transition v0 // pub trait DocumentFromUpdatePriceTransitionV0 { // /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionV0` reference. This operation is typically used to update_price or update an existing document with new information. @@ -121,7 +121,7 @@ pub struct DocumentUpdatePriceTransitionV0 { // where // Self: Sized; // } -// +// // impl DocumentFromUpdatePriceTransitionV0 for Document { // fn try_from_update_price_transition_v0( // value: &DocumentUpdatePriceTransitionV0, @@ -141,41 +141,41 @@ pub struct DocumentUpdatePriceTransitionV0 { // revision, // price, // } = value; -// +// // let id = base.id(); -// +// // let requires_updated_at = document_type // .required_fields() // .contains(document::property_names::UPDATED_AT); -// +// // let requires_updated_at_block_height = document_type // .required_fields() // .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); -// +// // let requires_updated_at_core_block_height = document_type // .required_fields() // .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); -// +// // let updated_at = if requires_updated_at { // Some(block_info.time_ms) // } else { // None // }; -// +// // let updated_at_block_height = if requires_updated_at_block_height { // Some(block_info.height) // } else { // None // }; -// +// // let updated_at_core_block_height = if requires_updated_at_core_block_height { // Some(block_info.core_height) // } else { // None // }; -// -// data -// +// +// data +// // match platform_version // .dpp // .document_versions @@ -204,7 +204,7 @@ pub struct DocumentUpdatePriceTransitionV0 { // }), // } // } -// +// // fn try_from_owned_update_price_transition_v0( // value: DocumentUpdatePriceTransitionV0, // owner_id: Identifier, @@ -223,33 +223,33 @@ pub struct DocumentUpdatePriceTransitionV0 { // revision, // price, // } = value; -// +// // let id = base.id(); -// +// // let requires_updated_at = document_type // .required_fields() // .contains(document::property_names::UPDATED_AT); -// +// // let requires_updated_at_block_height = document_type // .required_fields() // .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); -// +// // let requires_updated_at_core_block_height = document_type // .required_fields() // .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); -// +// // let updated_at = if requires_updated_at { // Some(block_info.time_ms) // } else { // None // }; -// +// // let updated_at_block_height = if requires_updated_at_block_height { // Some(block_info.height) // } else { // None // }; -// +// // let updated_at_core_block_height = if requires_updated_at_core_block_height { // Some(block_info.core_height) // } else { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 45f11dc619f..00e566b2a80 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -12,9 +12,9 @@ pub mod action_type; pub mod document_base_transition; pub mod document_create_transition; pub mod document_delete_transition; +pub mod document_purchase_transition; pub mod document_replace_transition; pub mod document_transfer_transition; -pub mod document_purchase_transition; pub mod document_update_price_transition; use crate::prelude::Revision; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 52eafe0d4e2..c9a483a3dd9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] use crate::document::Document; +use crate::fee::Credits; #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] @@ -22,7 +23,6 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::fee::Credits; pub mod v0; @@ -217,7 +217,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { }), } } - + #[cfg(feature = "state-transition-signing")] fn new_document_update_price_transition_from_document( document: Document, @@ -256,8 +256,8 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { ), version => Err(ProtocolError::UnknownVersionMismatch { method: - "DocumentsBatchTransition::new_document_update_price_transition_from_document" - .to_string(), + "DocumentsBatchTransition::new_document_update_price_transition_from_document" + .to_string(), known_versions: vec![0], received: version, }), @@ -303,8 +303,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { )?, ), version => Err(ProtocolError::UnknownVersionMismatch { - method: - "DocumentsBatchTransition::new_document_purchase_transition_from_document" + method: "DocumentsBatchTransition::new_document_purchase_transition_from_document" .to_string(), known_versions: vec![0], received: version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index e6bec7ef00d..54008ddc40d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] use crate::document::Document; +use crate::fee::Credits; #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] @@ -22,7 +23,6 @@ use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; use std::convert::TryFrom; -use crate::fee::Credits; pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 { #[cfg(feature = "state-transition-signing")] @@ -113,7 +113,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 purchase_feature_version: Option, base_feature_version: Option, ) -> Result; - + fn contract_based_security_level_requirement( &self, get_data_contract_security_level_requirement: impl Fn( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 29317d680f0..686760a7b87 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] use crate::document::{Document, DocumentV0Getters}; +use crate::fee::Credits; #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] @@ -14,11 +15,14 @@ use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; +use crate::state_transition::documents_batch_transition::document_transition::{ + DocumentPurchaseTransition, DocumentTransition, DocumentTransitionV0Methods, + DocumentUpdatePriceTransition, +}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::{ DocumentReplaceTransition, DocumentTransferTransition, }; -use crate::state_transition::documents_batch_transition::document_transition::{DocumentPurchaseTransition, DocumentTransition, DocumentTransitionV0Methods, DocumentUpdatePriceTransition}; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; #[cfg(feature = "state-transition-signing")] @@ -33,7 +37,6 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::fee::Credits; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { fn transitions(&self) -> &Vec { @@ -205,7 +208,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { )?; Ok(state_transition) } - + #[cfg(feature = "state-transition-signing")] fn new_document_update_price_transition_from_document( document: Document, @@ -237,7 +240,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signature_public_key_id: 0, signature: Default::default(), } - .into(); + .into(); let mut state_transition: StateTransition = documents_batch_transition.into(); state_transition.sign_external( identity_public_key, @@ -247,7 +250,6 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } - #[cfg(feature = "state-transition-signing")] fn new_document_purchase_transition_from_document( document: Document, @@ -279,7 +281,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signature_public_key_id: 0, signature: Default::default(), } - .into(); + .into(); let mut state_transition: StateTransition = documents_batch_transition.into(); state_transition.sign_external( identity_public_key, @@ -288,7 +290,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { )?; Ok(state_transition) } - + fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } diff --git a/packages/rs-dpp/src/util/mod.rs b/packages/rs-dpp/src/util/mod.rs index 7e93e63350e..2dee13be293 100644 --- a/packages/rs-dpp/src/util/mod.rs +++ b/packages/rs-dpp/src/util/mod.rs @@ -13,5 +13,5 @@ pub mod json_value; pub mod protocol_data; pub mod strings; -pub mod vec; pub mod units; +pub mod vec; diff --git a/packages/rs-dpp/src/util/units.rs b/packages/rs-dpp/src/util/units.rs index 7ee0fc88382..ca00561cf05 100644 --- a/packages/rs-dpp/src/util/units.rs +++ b/packages/rs-dpp/src/util/units.rs @@ -4,7 +4,6 @@ macro_rules! dash_to_credits { ($dash:expr) => {{ let dash_str = stringify!($dash); - // Parsing the input string to separate the whole and fractional parts. let parts: Vec<&str> = dash_str.split('.').collect(); let mut credits: u128 = 0; @@ -27,4 +26,4 @@ macro_rules! dash_to_credits { credits as u64 }}; -} \ No newline at end of file +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs index 1405076809f..aff96c03378 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs @@ -72,8 +72,7 @@ impl DocumentCreateTransitionActionStateValidationV0 for DocumentCreateTransitio // we also need to validate that the new document wouldn't conflict with any other document // this means for example having overlapping unique indexes - if document_type - .indices().iter().any(|index| index.unique) { + if document_type.indices().iter().any(|index| index.unique) { platform .drive .validate_document_create_transition_action_uniqueness( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs index 0c4ce65f76f..e4a59552eb6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs @@ -50,9 +50,8 @@ impl DocumentPurchaseTransitionActionStateValidationV0 for DocumentPurchaseTrans // transforming into an action // We need to verify that the resultant document doesn't violate any unique properties - - if document_type - .indices().iter().any(|index| index.unique) { + + if document_type.indices().iter().any(|index| index.unique) { platform .drive .validate_document_purchase_transition_action_uniqueness( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs index 9261e8709bb..afbe3ae28b2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs @@ -32,7 +32,7 @@ impl DocumentPurchaseTransitionActionStructureValidationV0 for DocumentPurchaseT .into(), )); }; - + // We can not purchase from ourselves // The document owner id is already our owner id, as the action we want to take is to // insert this document into the state (with our owner id) @@ -45,7 +45,6 @@ impl DocumentPurchaseTransitionActionStructureValidationV0 for DocumentPurchaseT .into(), )); } - if document_type.trade_mode() != TradeMode::DirectPurchase { Ok(SimpleConsensusValidationResult::new_with_error( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs index 640b68390e2..ea9e1529e8e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs @@ -49,8 +49,7 @@ impl DocumentReplaceTransitionActionStateValidationV0 for DocumentReplaceTransit // There is no need to verify that the document already existed, since this is done when // transforming into an action - if document_type - .indices().iter().any(|index| index.unique) { + if document_type.indices().iter().any(|index| index.unique) { platform .drive .validate_document_replace_transition_action_uniqueness( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs index 2a1b99722d4..7e1e64bab40 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -40,17 +40,16 @@ impl DocumentTransferTransitionActionStateValidationV0 for DocumentTransferTrans let document_type_name = self.base().document_type_name(); let Some(document_type) = contract.document_type_optional_for_name(document_type_name) - else { - return Ok(SimpleConsensusValidationResult::new_with_error( - InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), - )); - }; + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; // There is no need to verify that the document already existed, since this is done when // transforming into an action - if document_type - .indices().iter().any(|index| index.unique) { + if document_type.indices().iter().any(|index| index.unique) { platform .drive .validate_document_transfer_transition_action_uniqueness( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs index aa44cc09a23..1e60ee68b14 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs @@ -50,8 +50,7 @@ impl DocumentUpdatePriceTransitionActionStateValidationV0 for DocumentUpdatePric // There is no need to verify that the document already existed, since this is done when // transforming into an action - if document_type - .indices().iter().any(|index| index.unique) { + if document_type.indices().iter().any(|index| index.unique) { platform .drive .validate_document_update_price_transition_action_uniqueness( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs index 730f725be9e..f8b66fe3746 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs @@ -13,7 +13,9 @@ pub(super) trait DocumentUpdatePriceTransitionActionStructureValidationV0 { platform_version: &PlatformVersion, ) -> Result; } -impl DocumentUpdatePriceTransitionActionStructureValidationV0 for DocumentUpdatePriceTransitionAction { +impl DocumentUpdatePriceTransitionActionStructureValidationV0 + for DocumentUpdatePriceTransitionAction +{ fn validate_structure_v0( &self, _platform_version: &PlatformVersion, @@ -34,8 +36,9 @@ impl DocumentUpdatePriceTransitionActionStructureValidationV0 for DocumentUpdate if !document_type.trade_mode().seller_sets_price() { Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} is in trade mode {} that does not support the seller setting the price", - document_type_name, document_type.trade_mode(), + "{} is in trade mode {} that does not support the seller setting the price", + document_type_name, + document_type.trade_mode(), )) .into(), )) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs index 96e1d0847ce..32c28c43faa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs @@ -1,6 +1,6 @@ pub(crate) mod document_create_transition_action; pub(crate) mod document_delete_transition_action; +pub(crate) mod document_purchase_transition_action; pub(crate) mod document_replace_transition_action; pub(crate) mod document_transfer_transition_action; pub(crate) mod document_update_price_transition_action; -pub(crate) mod document_purchase_transition_action; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 31a7760c7fc..afc2c733074 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -234,9 +234,11 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { #[cfg(test)] mod tests { + use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; use dpp::block::block_info::BlockInfo; + use dpp::dash_to_credits; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::random_document::{ @@ -245,8 +247,11 @@ mod tests { use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::transfer::Transferable; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; + use dpp::fee::Credits; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; + use dpp::nft::TradeMode; + use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::{Bytes32, Value}; use dpp::prelude::Identifier; use dpp::serialization::PlatformSerializable; @@ -259,11 +264,6 @@ mod tests { use rand::SeedableRng; use simple_signer::signer::SimpleSigner; use std::collections::BTreeMap; - use dpp::dash_to_credits; - use dpp::fee::Credits; - use dpp::nft::TradeMode; - use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; - use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; fn setup_identity( platform: &mut TempPlatform, @@ -451,7 +451,7 @@ mod tests { assert_eq!(processing_result.invalid_unpaid_count(), 0); assert_eq!(processing_result.valid_count(), 1); - + assert_eq!(processing_result.aggregated_fees().processing_fee, 5074630); } @@ -1415,7 +1415,7 @@ mod tests { assert_eq!(processing_result.invalid_unpaid_count(), 0); assert_eq!(processing_result.valid_count(), 1); - + assert_eq!(processing_result.aggregated_fees().processing_fee, 9350780); let query_sender_results = platform @@ -1948,7 +1948,7 @@ mod tests { assert_eq!(processing_result.invalid_unpaid_count(), 0); assert_eq!(processing_result.valid_count(), 1); - + assert_eq!(processing_result.aggregated_fees().processing_fee, 10277500); let query_sender_results = platform @@ -2031,7 +2031,7 @@ mod tests { let platform_state = platform.state.load(); let (identity, signer, key) = setup_identity(&mut platform, 958); - + let card_document_type = contract .document_type_for_name("card") .expect("expected a profile document type"); @@ -2068,7 +2068,7 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition"); let documents_batch_create_serialized_transition = documents_batch_create_transition .serialize_to_bytes() @@ -2104,7 +2104,7 @@ mod tests { &contract, Some(&platform.config.drive), ) - .expect("expected document query"); + .expect("expected document query"); let query_sender_results = platform .drive @@ -2136,11 +2136,12 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition for the update price"); + .expect("expect to create documents batch transition for the update price"); - let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); let transaction = platform.drive.grove.start_transaction(); @@ -2161,9 +2162,9 @@ mod tests { .commit_transaction(transaction) .unwrap() .expect("expected to commit transaction"); - + let result = processing_result.into_execution_results().remove(0); - + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result else { panic!("expected a paid consensus error"); }; @@ -2222,7 +2223,7 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition"); let documents_batch_create_serialized_transition = documents_batch_create_transition .serialize_to_bytes() @@ -2258,7 +2259,7 @@ mod tests { &contract, Some(&platform.config.drive), ) - .expect("expected document query"); + .expect("expected document query"); let receiver_documents_sql_string = format!("select * from card where $ownerId == '{}'", receiver.id()); @@ -2268,7 +2269,7 @@ mod tests { &contract, Some(&platform.config.drive), ) - .expect("expected document query"); + .expect("expected document query"); let query_sender_results = platform .drive @@ -2313,11 +2314,12 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition for the update price"); + .expect("expect to create documents batch transition for the update price"); - let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); let transaction = platform.drive.grove.start_transaction(); @@ -2363,11 +2365,14 @@ mod tests { assert_eq!(query_receiver_results.documents().len(), 0); // The sender document should have the desired price - + let document = query_sender_results.documents().first().unwrap(); - - let price : Credits = document.properties().get_integer("$price").expect("expected to get back price"); - + + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); + assert_eq!(dash_to_credits!(0.1), price); assert_eq!(document.revision(), Some(2)); @@ -2425,7 +2430,7 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition"); let documents_batch_create_serialized_transition = documents_batch_create_transition .serialize_to_bytes() @@ -2461,7 +2466,7 @@ mod tests { &contract, Some(&platform.config.drive), ) - .expect("expected document query"); + .expect("expected document query"); let receiver_documents_sql_string = format!("select * from card where $ownerId == '{}'", receiver.id()); @@ -2471,7 +2476,7 @@ mod tests { &contract, Some(&platform.config.drive), ) - .expect("expected document query"); + .expect("expected document query"); let query_sender_results = platform .drive @@ -2516,11 +2521,12 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition for the update price"); + .expect("expect to create documents batch transition for the update price"); - let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); let transaction = platform.drive.grove.start_transaction(); @@ -2552,12 +2558,24 @@ mod tests { let query_sender_results = platform .drive - .query_documents(query_sender_identity_documents.clone(), None, false, None, None) + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) .expect("expected query result"); let query_receiver_results = platform .drive - .query_documents(query_receiver_identity_documents.clone(), None, false, None, None) + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) .expect("expected query result"); // We expect the sender to still have their document, and the receiver to have none @@ -2569,12 +2587,15 @@ mod tests { let mut document = query_sender_results.documents_owned().remove(0); - let price : Credits = document.properties().get_integer("$price").expect("expected to get back price"); + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); assert_eq!(dash_to_credits!(0.1), price); - + // At this point we want to have the receiver purchase the document - + document.set_revision(Some(3)); let documents_batch_purchase_transition = @@ -2592,7 +2613,7 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition for the purchase"); + .expect("expect to create documents batch transition for the purchase"); let documents_batch_purchase_serialized_transition = documents_batch_purchase_transition .serialize_to_bytes() @@ -2656,7 +2677,8 @@ mod tests { let (identity, signer, key) = setup_identity(&mut platform, 958); - let (other_identity, other_identity_signer, other_identity_key) = setup_identity(&mut platform, 450); + let (other_identity, other_identity_signer, other_identity_key) = + setup_identity(&mut platform, 450); let card_document_type = contract .document_type_for_name("card") @@ -2694,7 +2716,7 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition"); let documents_batch_create_serialized_transition = documents_batch_create_transition .serialize_to_bytes() @@ -2723,7 +2745,7 @@ mod tests { .expect("expected to commit transaction"); document.set_revision(Some(2)); - + document.set_owner_id(other_identity.id()); // we do this to trick the system let documents_batch_update_price_transition = @@ -2740,11 +2762,12 @@ mod tests { None, None, ) - .expect("expect to create documents batch transition for the update price"); + .expect("expect to create documents batch transition for the update price"); - let documents_batch_transfer_serialized_transition = documents_batch_update_price_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); let transaction = platform.drive.grove.start_transaction(); @@ -2782,7 +2805,7 @@ mod tests { &contract, Some(&platform.config.drive), ) - .expect("expected document query"); + .expect("expected document query"); let query_sender_results = platform .drive @@ -2793,6 +2816,12 @@ mod tests { let document = query_sender_results.documents().first().unwrap(); - assert_eq!(document.properties().get_optional_integer::("$price").expect("expected None"), None); + assert_eq!( + document + .properties() + .get_optional_integer::("$price") + .expect("expected None"), + None + ); } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index 6d2cd8e95e2..ad7ed837616 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -113,15 +113,16 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition transaction, platform_version, )?, - DocumentTransitionAction::UpdatePriceAction(update_price_action) => update_price_action - .validate_state( + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + update_price_action.validate_state( platform, owner_id, epoch, execution_context, transaction, platform_version, - )?, + )? + } DocumentTransitionAction::PurchaseAction(purchase_action) => purchase_action .validate_state( platform, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index bf54b937158..8184fc3f556 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -277,7 +277,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .filter(|transition| { matches!( transition, - DocumentTransition::Replace(_) | DocumentTransition::Transfer(_) | DocumentTransition::Purchase(_) | DocumentTransition::UpdatePrice(_) + DocumentTransition::Replace(_) + | DocumentTransition::Transfer(_) + | DocumentTransition::Purchase(_) + | DocumentTransition::UpdatePrice(_) ) }) .copied() @@ -555,7 +558,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )?; if result.is_valid() { - Ok(DocumentTransitionAction::UpdatePriceAction(document_update_price_action).into()) + Ok( + DocumentTransitionAction::UpdatePriceAction(document_update_price_action) + .into(), + ) } else { Ok(result) } @@ -572,7 +578,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition } let original_document = validation_result.into_data()?; - + if validate_against_state { //there are situations where we don't want to validate this against the state // for example when we already applied the state transition action diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index ab467e59fb1..45ab6a0e36b 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -41,12 +41,12 @@ use crate::test::fixture::abci::static_system_identity_public_keys_v0; use crate::{config::PlatformConfig, rpc::core::DefaultCoreRPC}; use dpp::block::block_info::BlockInfo; use dpp::document::transfer::Transferable; +use dpp::nft::TradeMode; use dpp::prelude::DataContract; use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; use drive::drive::flags::StorageFlags; use tempfile::TempDir; -use dpp::nft::TradeMode; /// A test platform builder. pub struct TestPlatformBuilder { @@ -126,7 +126,10 @@ impl TempPlatform { } /// A function which adds the crypto card game to the state and returns it. - pub fn with_crypto_card_game_transfer_only(self, transferable: Transferable) -> (Self, DataContract) { + pub fn with_crypto_card_game_transfer_only( + self, + transferable: Transferable, + ) -> (Self, DataContract) { let card_game_path = match transferable { Transferable::Never => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json", Transferable::Always => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json", @@ -187,7 +190,6 @@ impl TempPlatform { (self, card_game_contract) } - /// Sets Platform to genesis state. pub fn set_genesis_state(self) -> Self { self.platform diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs index 18a9d29aec6..e902db925f2 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs @@ -61,7 +61,6 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { bump_identity_contract_nonce_action, ) => bump_identity_contract_nonce_action .into_high_level_drive_operations(epoch, platform_version), - } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs index 79f0e95d4d2..46ec23550ea 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs @@ -6,12 +6,12 @@ use dpp::version::PlatformVersion; mod document_create_transition; mod document_delete_transition; +mod document_purchase_transition; mod document_replace_transition; mod document_transfer_transition; mod document_transition; -mod documents_batch_transition; -mod document_purchase_transition; mod document_update_price_transition; +mod documents_batch_transition; /// A converter that will get High Level Drive Operations from State transitions pub trait DriveHighLevelDocumentOperationConverter { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs index ab2e5908bad..e5dac3fa3ea 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs @@ -39,7 +39,7 @@ mod validate_document_create_transition_action_uniqueness; mod validate_document_replace_transition_action_uniqueness; +mod validate_document_purchase_transition_action_uniqueness; mod validate_document_transfer_transition_action_uniqueness; mod validate_document_uniqueness; -mod validate_document_purchase_transition_action_uniqueness; mod validate_document_update_price_transition_action_uniqueness; diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs index 0166fc9243e..21b3d94564d 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs @@ -11,8 +11,8 @@ use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use grovedb::TransactionArg; use dpp::document::DocumentV0Getters; +use grovedb::TransactionArg; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; @@ -39,15 +39,24 @@ impl Drive { created_at: document_update_price_transition.document().created_at(), updated_at: document_update_price_transition.document().updated_at(), transferred_at: document_update_price_transition.document().transferred_at(), - created_at_block_height: document_update_price_transition.document().created_at_block_height(), - updated_at_block_height: document_update_price_transition.document().updated_at_block_height(), - transferred_at_block_height: document_update_price_transition.document().transferred_at_block_height(), + created_at_block_height: document_update_price_transition + .document() + .created_at_block_height(), + updated_at_block_height: document_update_price_transition + .document() + .updated_at_block_height(), + transferred_at_block_height: document_update_price_transition + .document() + .transferred_at_block_height(), created_at_core_block_height: document_update_price_transition - .document().created_at_core_block_height(), + .document() + .created_at_core_block_height(), updated_at_core_block_height: document_update_price_transition - .document().updated_at_core_block_height(), + .document() + .updated_at_core_block_height(), transferred_at_core_block_height: document_update_price_transition - .document().transferred_at_core_block_height(), + .document() + .transferred_at_core_block_height(), data: document_update_price_transition.document().properties(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index 519829d55a2..a47f7d2a973 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -28,6 +28,7 @@ use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::{Document, DocumentV0Getters}; +use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::version::PlatformVersion; use grovedb::batch::key_info::KeyInfo; use grovedb::batch::key_info::KeyInfo::KnownKey; @@ -35,7 +36,6 @@ use grovedb::batch::KeyInfoPath; use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; use std::borrow::Cow; use std::collections::{HashMap, HashSet}; -use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; impl Drive { /// Gathers operations for updating a document. @@ -52,7 +52,8 @@ impl Drive { ) -> Result, Error> { let drive_version = &platform_version.drive; let mut batch_operations: Vec = vec![]; - if !document_and_contract_info.document_type.requires_revision() // if it requires revision then there are reasons for us to be able to update in drive + if !document_and_contract_info.document_type.requires_revision() + // if it requires revision then there are reasons for us to be able to update in drive { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "documents for this contract are not mutable", diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 2490a80f9e1..47d78e718d6 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -97,7 +97,7 @@ impl Drive { "no transition in a document batch transition".to_string(), ))); }; - + let owner_id = documents_batch_transition.owner_id(); let data_contract_id = transition.data_contract_id(); @@ -217,7 +217,7 @@ impl Drive { } DocumentTransition::Purchase(purchase_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (purchase)", purchase_transition.base().id()))))?; - + if document.owner_id() != owner_id { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", purchase_transition.base().id())))); } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs index 3333131c68b..de03698b223 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs @@ -9,9 +9,11 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::CreateAction(_) => DocumentTransitionActionType::Create, DocumentTransitionAction::DeleteAction(_) => DocumentTransitionActionType::Delete, DocumentTransitionAction::ReplaceAction(_) => DocumentTransitionActionType::Replace, - DocumentTransitionAction::TransferAction(_) => DocumentTransitionActionType::Transfer, HEAD + DocumentTransitionAction::TransferAction(_) => DocumentTransitionActionType::Transfer, DocumentTransitionAction::PurchaseAction(_) => DocumentTransitionActionType::Purchase, - DocumentTransitionAction::UpdatePriceAction(_) => DocumentTransitionActionType::UpdatePrice, + DocumentTransitionAction::UpdatePriceAction(_) => { + DocumentTransitionActionType::UpdatePrice + } DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { DocumentTransitionActionType::IgnoreWhileBumpingRevision } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs index 0ce00aa369c..357af15ccd4 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs @@ -1,5 +1,5 @@ use dpp::block::block_info::BlockInfo; -use dpp::document::{property_names, Document, DocumentV0Setters, DocumentV0Getters}; +use dpp::document::{property_names, Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -18,21 +18,17 @@ impl DocumentPurchaseTransitionActionV0 { block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { - let DocumentPurchaseTransitionV0 { - base, - price, - .. - } = document_purchase_transition; + let DocumentPurchaseTransitionV0 { base, price, .. } = document_purchase_transition; let base = DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?; - + let original_owner_id = original_document.owner_id(); - + let mut modified_document = original_document; - + modified_document.bump_revision(); modified_document.set_owner_id(purchaser_id); diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs index 9a880681e9e..7159cde585a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -31,9 +31,9 @@ impl DocumentTransferTransitionActionV0 { let mut modified_document = original_document; modified_document.set_owner_id(*recipient_owner_id); - + modified_document.bump_revision(); - + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { modified_document.set_transferred_at(Some(block_info.time_ms)); } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs index d68edd50ea9..4aef558eec0 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -17,11 +17,7 @@ impl DocumentUpdatePriceTransitionActionV0 { block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { - let DocumentUpdatePriceTransitionV0 { - base, - price, - .. - } = document_update_price_transition; + let DocumentUpdatePriceTransitionV0 { base, price, .. } = document_update_price_transition; let base = DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( base, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index d88da773899..51c7f19d2d0 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -5,12 +5,12 @@ pub mod document_base_transition_action; pub mod document_create_transition_action; /// document_delete_transition_action pub mod document_delete_transition_action; +/// document_purchase_transition_action +pub mod document_purchase_transition_action; /// document_replace_transition_action pub mod document_replace_transition_action; /// document_transfer_transition_action pub mod document_transfer_transition_action; -/// document_purchase_transition_action -pub mod document_purchase_transition_action; /// document_update_price_transition_action pub mod document_update_price_transition_action; From 7289ce35d7a52c1ae0cfeb7d34a9e91e9fc9161c Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 22 Apr 2024 22:04:13 +0700 Subject: [PATCH 32/65] fmt --- .../data_contract/document_type/accessors/v0/mod.rs | 1 - .../methods/create_document_from_data/v0/mod.rs | 1 - .../src/data_contract/document_type/methods/mod.rs | 1 - packages/rs-dpp/src/document/accessors/v0/mod.rs | 1 - packages/rs-dpp/src/document/v0/serialize.rs | 2 +- .../document_update_price_transition/mod.rs | 7 ------- .../document_update_price_transition/v0/mod.rs | 11 +---------- .../state_v0/mod.rs | 1 - .../document/document_update_price_transition.rs | 3 +-- .../v0/mod.rs | 2 +- .../wasm-dpp/src/errors/consensus/consensus_error.rs | 5 ++++- 11 files changed, 8 insertions(+), 27 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index 7e0af32b92c..72bfee2cbe3 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -4,7 +4,6 @@ use crate::data_contract::document_type::property::DocumentProperty; use platform_value::{Identifier, Value}; -use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index 47fdc1867a2..3242e1db19c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -1,6 +1,5 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; -use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 32b0e54cf47..47df2fd0f4d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -18,7 +18,6 @@ use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::version::PlatformVersion; use crate::ProtocolError; -use crate::document::transfer::Transferable; use platform_value::{Identifier, Value}; // TODO: Some of those methods are only for tests. Hide under feature diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index c9ca1119e96..e8274af2219 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -1,4 +1,3 @@ -use crate::document::Document; use platform_value::btreemap_extensions::{ BTreeValueMapInsertionPathHelper, BTreeValueMapPathHelper, }; diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index defdbd16e08..72e8fbd5989 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -1,4 +1,4 @@ -use crate::data_contract::document_type::{DocumentPropertyType, DocumentTypeRef}; +use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::errors::DataContractError; use crate::document::property_names::{ diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs index 0020a4c806e..25a16a09ae3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs @@ -2,15 +2,8 @@ mod from_document; pub mod v0; pub mod v0_methods; -use crate::block::block_info::BlockInfo; -use crate::data_contract::document_type::DocumentTypeRef; -use crate::document::Document; -use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; -use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; -use platform_value::Identifier; -use platform_version::version::PlatformVersion; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub use v0::*; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs index 90a57bdaef1..fe1e11cae18 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs @@ -1,25 +1,16 @@ mod from_document; pub mod v0_methods; -use crate::prelude::{BlockHeight, CoreBlockHeight, Revision, TimestampMillis}; +use crate::prelude::Revision; use bincode::{Decode, Encode}; use derive_more::Display; -use platform_value::{Identifier, Value}; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; -use crate::block::block_info::BlockInfo; -use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::data_contract::document_type::DocumentTypeRef; -use crate::document::{Document, DocumentV0}; use crate::fee::Credits; -use crate::{document, ProtocolError}; -use platform_version::version::PlatformVersion; -use std::collections::BTreeMap; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; mod property_names { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs index 1e60ee68b14..4f622331b52 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs @@ -2,7 +2,6 @@ use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::document::DocumentV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs index 1401c3a1d4b..835af6aa21f 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs @@ -7,11 +7,10 @@ use crate::drive::object_size_info::OwnedDocumentInfo; use crate::error::Error; use dpp::block::epoch::Epoch; -use dpp::document::Document; use dpp::prelude::Identifier; use std::borrow::Cow; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentFromUpdatePriceTransitionAction, DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl DriveHighLevelDocumentOperationConverter for DocumentUpdatePriceTransitionAction { diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 47d78e718d6..72976210f8a 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -206,7 +206,7 @@ impl Drive { } DocumentTransition::UpdatePrice(update_price_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; - let new_document_price : Credits = document.properties().get_integer("$price").map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; + let new_document_price : Credits = document.properties().get_integer("$price").map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; if new_document_price == update_price_transition.price() { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); } diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index c124b9f0ace..101063d2ad7 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -61,7 +61,7 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; -use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTransferableTypeError}; +use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; use dpp::consensus::basic::document::{MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; @@ -460,6 +460,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::UnknownTransferableTypeError(e) => { generic_consensus_error!(UnknownTransferableTypeError, e).into() } + BasicError::UnknownTradeModeError(e) => { + generic_consensus_error!(UnknownTradeModeError, e).into() + } } } From df6d1ba1c74e367853e004bac0375508ac8bbb3f Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Tue, 23 Apr 2024 02:05:30 +0700 Subject: [PATCH 33/65] more work --- packages/rs-dpp/src/fee/fee_result/mod.rs | 2 +- .../v0/v0_methods.rs | 6 + .../v0_methods.rs | 7 + .../documents_batch_transition/methods/mod.rs | 6 + .../methods/v0/mod.rs | 2 + .../v0/v0_methods.rs | 19 + .../execution/types/execution_event/mod.rs | 19 + .../v0/mod.rs | 2 +- .../state_transition/processor/v0/mod.rs | 4 +- .../documents_batch/balance/mod.rs | 33 + .../documents_batch/balance/v0/mod.rs | 54 ++ .../state_transitions/documents_batch/mod.rs | 594 +++++++++++++++++- ...ame-all-transferable-no-owner-indexes.json | 113 ++++ .../document/documents_batch/mod.rs | 9 + .../document/documents_batch/v0/mod.rs | 21 + .../src/version/drive_abci_versions.rs | 1 + .../fee/state_transition_min_fees/mod.rs | 2 +- .../fee/state_transition_min_fees/v1.rs | 2 +- .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + 21 files changed, 865 insertions(+), 34 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json diff --git a/packages/rs-dpp/src/fee/fee_result/mod.rs b/packages/rs-dpp/src/fee/fee_result/mod.rs index c58e7b97c25..749cc834267 100644 --- a/packages/rs-dpp/src/fee/fee_result/mod.rs +++ b/packages/rs-dpp/src/fee/fee_result/mod.rs @@ -90,7 +90,7 @@ impl TryFrom>> for FeeResult { } /// The balance change for an identity -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum BalanceChange { /// Add Balance AddToBalance(Credits), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs index 941c9266320..95333296e41 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs @@ -1,3 +1,4 @@ +use crate::fee::Credits; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; @@ -19,6 +20,7 @@ pub trait DocumentPurchaseTransitionV0Methods { /// Sets the value of the `revision` field in the `DocumentReplaceTransitionV0`. fn set_revision(&mut self, revision: Revision); + fn price(&self) -> Credits; } impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { @@ -41,4 +43,8 @@ impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { fn set_revision(&mut self, revision: Revision) { self.revision = revision; } + + fn price(&self) -> Credits { + self.price + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs index 68cb48bb5e6..86c2fe8f193 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs @@ -1,3 +1,4 @@ +use crate::fee::Credits; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; @@ -33,4 +34,10 @@ impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransition { DocumentPurchaseTransition::V0(v0) => v0.revision = revision, } } + + fn price(&self) -> Credits { + match self { + DocumentPurchaseTransition::V0(v0) => v0.price, + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index c9a483a3dd9..6d2b9a451a8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -27,6 +27,12 @@ use platform_version::version::{FeatureVersion, PlatformVersion}; pub mod v0; impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { + fn all_purchases_amount(&self) -> Option { + match self { + DocumentsBatchTransition::V0(v0) => v0.all_purchases_amount(), + } + } + fn set_transitions(&mut self, transitions: Vec) { match self { DocumentsBatchTransition::V0(v0) => v0.set_transitions(transitions), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index 54008ddc40d..a21448ea48c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -155,4 +155,6 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 fn set_transitions(&mut self, transitions: Vec); fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce); + + fn all_purchases_amount(&self) -> Option; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 686760a7b87..abd5f88d30a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -37,6 +37,7 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { fn transitions(&self) -> &Vec { @@ -300,4 +301,22 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { .iter_mut() .for_each(|transition| transition.set_identity_contract_nonce(identity_contract_nonce)); } + + fn all_purchases_amount(&self) -> Option { + let (total, any_purchases) = self + .transitions + .iter() + .filter_map(|transition| { + transition + .as_transition_purchase() + .map(|purchase| purchase.price()) + }) + .fold((0, false), |(acc, _), price| (acc + price, true)); + + if any_purchases { + Some(total) // Return the sum as Some(Credits) if there were any purchases + } else { + None // Return None if no purchases were found + } + } } diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 4caa4413db8..a5b011522ba 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -155,6 +155,25 @@ impl<'a> ExecutionEvent<'a> { ))) } } + StateTransitionAction::DocumentsBatchAction(document_batch_action) => { + let user_fee_increase = action.user_fee_increase(); + let removed_balance = document_batch_action.all_purchases_amount(); + let operations = + action.into_high_level_drive_operations(epoch, platform_version)?; + if let Some(identity) = identity { + Ok(ExecutionEvent::Paid { + identity, + removed_balance, + operations, + execution_operations: execution_context.operations_consume(), + user_fee_increase, + }) + } else { + Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "partial identity should be present for other state transitions", + ))) + } + } _ => { let user_fee_increase = action.user_fee_increase(); let operations = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs index 99ad4d4795e..07c2895c251 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs @@ -37,7 +37,7 @@ impl ValidateSimplePreCheckBalanceV0 for StateTransition { platform_version .fee_version .state_transition_min_fees - .document_batch_transition + .document_batch_sub_transition } StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) => 0, StateTransition::IdentityCreditWithdrawal(_) => { 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 3a6acb90d02..2b98dd8b1ce 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 @@ -549,9 +549,11 @@ impl StateTransitionBalanceValidationV0 for StateTransition { StateTransition::IdentityCreditWithdrawal(st) => { st.validate_minimum_balance_pre_check(identity, platform_version) } + StateTransition::DocumentsBatch(st) => { + st.validate_minimum_balance_pre_check(identity, platform_version) + } StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) - | StateTransition::DocumentsBatch(_) | StateTransition::IdentityUpdate(_) => { self.validate_simple_pre_check_minimum_balance(identity, platform_version) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs new file mode 100644 index 00000000000..4ca24ddc1cb --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs @@ -0,0 +1,33 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::documents_batch::balance::v0::DocumentsBatchTransitionBalanceValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBalanceValidationV0; +use dpp::identity::PartialIdentity; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; + +pub(crate) mod v0; +impl StateTransitionBalanceValidationV0 for DocumentsBatchTransition { + fn validate_minimum_balance_pre_check( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .balance_pre_check + { + 0 => self.validate_advanced_minimum_balance_pre_check_v0(identity, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "documents batch transition: validate_minimum_balance_pre_check" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs new file mode 100644 index 00000000000..a46b1aad9b0 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs @@ -0,0 +1,54 @@ +use crate::error::Error; +use dpp::consensus::state::identity::IdentityInsufficientBalanceError; +use dpp::identity::PartialIdentity; +use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::error::execution::ExecutionError; +use dpp::version::PlatformVersion; + +pub(in crate::execution::validation::state_transition::state_transitions) trait DocumentsBatchTransitionBalanceValidationV0 +{ + fn validate_advanced_minimum_balance_pre_check_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentsBatchTransitionBalanceValidationV0 for DocumentsBatchTransition { + fn validate_advanced_minimum_balance_pre_check_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + let balance = + identity + .balance + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expected to have a balance on identity for documents batch transition", + )))?; + + let purchases_amount = self.all_purchases_amount().unwrap_or_default(); + + let base_fees = platform_version.fee_version.state_transition_min_fees.document_batch_sub_transition.checked_mul(self.transitions().len() as u64).ok_or(Error::Execution(ExecutionError::Overflow("overflow when multiplying base fee and amount of sub transitions in documents batch transition")))?; + + // This is just the needed balance to pass this validation step, most likely the actual fees are smaller + let needed_balance = purchases_amount + .checked_add(base_fees) + .ok_or(Error::Execution(ExecutionError::Overflow( + "overflow when adding all purchases amount and base fees in documents batch transition", + )))?; + + if balance < needed_balance { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityInsufficientBalanceError::new(identity.id, balance, needed_balance).into(), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index afc2c733074..55d9e79903b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1,5 +1,6 @@ mod action_validation; mod advanced_structure; +mod balance; mod data_triggers; mod identity_contract_nonce; mod state; @@ -247,6 +248,7 @@ mod tests { use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::transfer::Transferable; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; + use dpp::fee::fee_result::BalanceChange; use dpp::fee::Credits; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; @@ -257,7 +259,9 @@ mod tests { use dpp::serialization::PlatformSerializable; use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use dpp::tests::json_document::json_document_to_contract; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; + use drive::drive::flags::StorageFlags; use drive::query::DriveQuery; use platform_version::version::PlatformVersion; use rand::prelude::StdRng; @@ -268,6 +272,7 @@ mod tests { fn setup_identity( platform: &mut TempPlatform, seed: u64, + credits: Credits, ) -> (Identity, SimpleSigner, IdentityPublicKey) { let platform_version = PlatformVersion::latest(); let mut signer = SimpleSigner::default(); @@ -300,7 +305,7 @@ mod tests { (0, master_key.clone()), (1, critical_public_key.clone()), ]), - balance: 10000000000, + balance: credits, revision: 0, } .into(); @@ -333,7 +338,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -466,9 +471,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (other_identity, ..) = setup_identity(&mut platform, 495); + let (other_identity, ..) = setup_identity(&mut platform, 495, dash_to_credits!(0.1)); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -608,9 +613,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, _, _) = setup_identity(&mut platform, 452); + let (receiver, _, _) = setup_identity(&mut platform, 452, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -800,7 +805,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -889,7 +894,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -1022,9 +1027,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (other_identity, ..) = setup_identity(&mut platform, 495); + let (other_identity, ..) = setup_identity(&mut platform, 495, dash_to_credits!(0.1)); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -1163,7 +1168,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); let dashpay_contract = dashpay.clone(); @@ -1241,6 +1246,161 @@ mod tests { assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); } + #[test] + fn test_document_transfer_on_document_type_that_is_transferable_that_has_no_owner_indices() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json"; + + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + platform + .drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, _, _) = setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().storage_fee, 0); // There is no storage fee, as there are no indexes that will change + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5603530); + } + #[test] fn test_document_transfer_on_document_type_that_is_transferable() { let platform_version = PlatformVersion::latest(); @@ -1253,9 +1413,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, _, _) = setup_identity(&mut platform, 450); + let (receiver, _, _) = setup_identity(&mut platform, 450, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -1416,6 +1576,18 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); + assert_eq!(processing_result.aggregated_fees().storage_fee, 37341000); // 1383 bytes added + + // todo: we should expect these numbers to be closer + + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + Some(14992395) + ); + assert_eq!(processing_result.aggregated_fees().processing_fee, 9350780); let query_sender_results = platform @@ -1446,9 +1618,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, _, _) = setup_identity(&mut platform, 452); + let (receiver, _, _) = setup_identity(&mut platform, 452, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -1637,9 +1809,9 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, _, _) = setup_identity(&mut platform, 452); + let (receiver, _, _) = setup_identity(&mut platform, 452, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -1786,9 +1958,10 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -2030,7 +2203,7 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -2183,9 +2356,10 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -2390,9 +2564,18 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (purchaser, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(1.0)); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + assert_eq!(seller_balance, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -2451,6 +2634,20 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); + assert_eq!( + processing_result + .aggregated_fees() + .clone() + .into_balance_change(identity.id()) + .change(), + &BalanceChange::RemoveFromBalance { + required_removed_balance: 123579000, + desired_removed_balance: 128666820, + } + ); + + let original_creation_cost = 128666820; + platform .drive .grove @@ -2458,6 +2655,18 @@ mod tests { .unwrap() .expect("expected to commit transaction"); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - original_creation_cost + ); + let sender_documents_sql_string = format!("select * from card where $ownerId == '{}'", identity.id()); @@ -2469,7 +2678,7 @@ mod tests { .expect("expected document query"); let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); + format!("select * from card where $ownerId == '{}'", purchaser.id()); let query_receiver_identity_documents = DriveQuery::from_sql_expr( receiver_documents_sql_string.as_str(), @@ -2554,8 +2763,30 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); + assert_eq!(processing_result.aggregated_fees().storage_fee, 756000); // we added 28 bytes, // todo: investigate why + + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + None + ); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - 6816550 - 756000 - original_creation_cost + ); + let query_sender_results = platform .drive .query_documents( @@ -2602,7 +2833,7 @@ mod tests { DocumentsBatchTransition::new_document_purchase_transition_from_document( document.clone(), card_document_type, - receiver.id(), + purchaser.id(), dash_to_credits!(0.1), //same price as requested &recipient_key, 1, // 1 because he's never done anything @@ -2645,7 +2876,17 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); + assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10891300); + + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + Some(22488973) + ); let query_sender_results = platform .drive @@ -2661,6 +2902,301 @@ mod tests { assert_eq!(query_sender_results.documents().len(), 0); assert_eq!(query_receiver_results.documents().len(), 1); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.2) - 6816550 - 756000 - original_creation_cost + 22488973 + ); + + let buyers_balance = platform + .drive + .fetch_identity_balance(purchaser.id().to_buffer(), None, platform_version) + .expect("expected to get purchaser balance") + .expect("expected that purchaser exists"); + + // the buyer payed 0.1, but also storage and processing fees + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10891300 - 64611000); + } + + #[test] + fn test_document_set_price_and_purchase_with_enough_credits_to_buy_but_not_enough_to_pay_for_processing( + ) { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let mut document = query_sender_results.documents_owned().remove(0); + + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // nothing can go through because the purchaser doesn't have enough balance + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 1); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); } #[test] @@ -2675,10 +3211,10 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); let (other_identity, other_identity_signer, other_identity_key) = - setup_identity(&mut platform, 450); + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json new file mode 100644 index 00000000000..19bf751a6e7 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json @@ -0,0 +1,113 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "transferable": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs index d6581cd9d1e..fec04b7701c 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs @@ -3,10 +3,12 @@ use crate::state_transition_action::document::documents_batch::v0::DocumentsBatc use derive_more::From; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::fee::Credits; use dpp::identity::SecurityLevel; use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; /// document transition @@ -73,6 +75,13 @@ impl DocumentsBatchTransitionAction { } impl DocumentsBatchTransitionAction { + /// The sum of all purchases amounts for all purchase transitions in the batch + pub fn all_purchases_amount(&self) -> Option { + match self { + DocumentsBatchTransitionAction::V0(v0) => v0.all_purchases_amount(), + } + } + /// Determines the security level requirements for the batch transition action. /// /// This method performs the following steps: diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs index 6fef9bd8537..4d1ccce401d 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs @@ -1,6 +1,8 @@ +use dpp::fee::Credits; use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::identifier::Identifier; use dpp::prelude::UserFeeIncrease; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; /// action v0 #[derive(Default, Debug, Clone)] @@ -12,3 +14,22 @@ pub struct DocumentsBatchTransitionActionV0 { /// fee multiplier pub user_fee_increase: UserFeeIncrease, } + +impl DocumentsBatchTransitionActionV0 { + pub(super) fn all_purchases_amount(&self) -> Option { + let (total, any_purchases) = self + .transitions + .iter() + .filter_map(|transition| match transition { + DocumentTransitionAction::PurchaseAction(purchase) => Some(purchase.price()), + _ => None, + }) + .fold((0, false), |(acc, _), price| (acc + price, true)); + + if any_purchases { + Some(total) // Return the sum as Some(Credits) if there were any purchases + } else { + None // Return None if no purchases were found + } + } +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index bdf90b4b6ab..4a86d99475f 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -100,6 +100,7 @@ pub struct DriveAbciPlatformStateStorageMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciDocumentsStateTransitionValidationVersions { + pub balance_pre_check: FeatureVersion, pub basic_structure: FeatureVersion, pub advanced_structure: FeatureVersion, pub revision: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs index dea98a5a2ba..692634e7477 100644 --- a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs +++ b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs @@ -4,7 +4,7 @@ pub struct StateTransitionMinFees { pub credit_transfer: u64, pub credit_withdrawal: u64, pub identity_update: u64, - pub document_batch_transition: u64, + pub document_batch_sub_transition: u64, pub contract_create: u64, pub contract_update: u64, } diff --git a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs index c01f6f11303..9c1a8f27fff 100644 --- a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs +++ b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs @@ -4,7 +4,7 @@ pub const STATE_TRANSITION_MIN_FEES_VERSION1: StateTransitionMinFees = StateTran credit_transfer: 100000, credit_withdrawal: 100000, identity_update: 100000, - document_batch_transition: 100000, + document_batch_sub_transition: 100000, contract_create: 100000, contract_update: 100000, }; diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 7a89135c0a0..172c19190a2 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -676,6 +676,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, state: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 7dad5713645..32731a00f2c 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -676,6 +676,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, state: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 6770157471c..21552c8b14c 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -675,6 +675,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, state: 0, From e072dad0494b57d4c8e0ac43c6ea657f006125bc Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Tue, 23 Apr 2024 02:58:39 +0700 Subject: [PATCH 34/65] more fixes --- .../data_contract/extra/drive_api_tests.rs | 2 + packages/rs-dpp/src/util/json_schema.rs | 1 + .../state_transitions/documents_batch/mod.rs | 4 +- .../tests/strategy_tests/main.rs | 1 + .../verify_state_transitions.rs | 41 ++++ .../v0/mod.rs | 3 +- packages/rs-drive/src/query/test_index.rs | 1 + .../v0/transformer.rs | 4 + .../v0/transformer.rs | 6 +- .../v0/transformer.rs | 3 +- .../document/documents_batch/mod.rs | 1 - packages/rs-sdk/src/platform/transition.rs | 2 + .../platform/transition/purchase_document.rs | 181 ++++++++++++++++++ .../transition/update_price_of_document.rs | 168 ++++++++++++++++ packages/rs-sdk/tests/fetch/common.rs | 1 + 15 files changed, 412 insertions(+), 7 deletions(-) create mode 100644 packages/rs-sdk/src/platform/transition/purchase_document.rs create mode 100644 packages/rs-sdk/src/platform/transition/update_price_of_document.rs diff --git a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs index cdf5f9b2266..96f64606a9a 100644 --- a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs +++ b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs @@ -235,6 +235,7 @@ mod test { keeps_history: true, documents_mutable_contract_default: false, documents_keep_history_contract_default: true, + documents_can_be_deleted_contract_default: false, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, }) @@ -285,6 +286,7 @@ mod test { documents_keep_history_contract_default: true, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, + documents_can_be_deleted_contract_default: false, }) ); } diff --git a/packages/rs-dpp/src/util/json_schema.rs b/packages/rs-dpp/src/util/json_schema.rs index 24ba0b584b3..0e6459083dd 100644 --- a/packages/rs-dpp/src/util/json_schema.rs +++ b/packages/rs-dpp/src/util/json_schema.rs @@ -213,6 +213,7 @@ mod test { false, false, false, + false, &mut vec![], LATEST_PLATFORM_VERSION, ) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 55d9e79903b..fc3d3db2e64 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1248,7 +1248,6 @@ mod tests { #[test] fn test_document_transfer_on_document_type_that_is_transferable_that_has_no_owner_indices() { - let platform_version = PlatformVersion::latest(); let mut platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); @@ -2358,8 +2357,7 @@ mod tests { let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, recipient_signer, recipient_key) = - setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + let (receiver, _, _) = setup_identity(&mut platform, 450, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 1f0d30beb48..db89ed714c1 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1217,6 +1217,7 @@ mod tests { }, keep_history_chance: 1.0, documents_mutable_chance: 1.0, + documents_can_be_deleted_chance: 1.0, }, 30..31, ), diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 13910492ef1..0a097575679 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -7,6 +7,7 @@ use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; +use dpp::document::property_names::PRICE; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; @@ -22,8 +23,10 @@ use tenderdash_abci::proto::abci::ExecTxResult; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionActionAccessorsV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use drive_abci::execution::validation::state_transition::ValidationMode; @@ -404,6 +407,44 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( } } } + DocumentTransitionAction::PurchaseAction(purchase_action) => { + if *was_executed { + if let Some(document) = document { + assert_eq!( + document.owner_id(), + purchase_action.document().owner_id() + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.owner_id(), + purchase_action.document().owner_id() + ); + } + } + } + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + if *was_executed { + if let Some(document) = document { + assert_eq!( + document.get(PRICE), + update_price_action.document().get(PRICE) + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.get(PRICE), + update_price_action.document().get(PRICE) + ); + } + } + } } } } diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 72976210f8a..4286143d5e9 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -6,6 +6,7 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; use dpp::document::{Document, DocumentV0Getters}; use dpp::document::document_methods::DocumentMethodsV0; +use dpp::document::property_names::PRICE; use dpp::fee::Credits; use dpp::identity::PartialIdentity; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; @@ -206,7 +207,7 @@ impl Drive { } DocumentTransition::UpdatePrice(update_price_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; - let new_document_price : Credits = document.properties().get_integer("$price").map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; + let new_document_price : Credits = document.properties().get_integer(PRICE).map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; if new_document_price == update_price_transition.price() { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); } diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index f486f0128f8..d0b4b12cb6b 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -84,6 +84,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs index 357af15ccd4..e888f20d33e 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs @@ -1,4 +1,5 @@ use dpp::block::block_info::BlockInfo; +use dpp::document::property_names::PRICE; use dpp::document::{property_names, Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -31,6 +32,9 @@ impl DocumentPurchaseTransitionActionV0 { modified_document.bump_revision(); + // We must remove the price if there is one + modified_document.properties_mut().remove(PRICE); + modified_document.set_owner_id(purchaser_id); if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs index 7159cde585a..88f6d0776ab 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -1,5 +1,6 @@ use dpp::block::block_info::BlockInfo; -use dpp::document::{property_names, Document, DocumentV0Setters}; +use dpp::document::property_names::PRICE; +use dpp::document::{property_names, Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -32,6 +33,9 @@ impl DocumentTransferTransitionActionV0 { modified_document.set_owner_id(*recipient_owner_id); + // We must remove the price + modified_document.properties_mut().remove(PRICE); + modified_document.bump_revision(); if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs index 4aef558eec0..f39550affd2 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -1,4 +1,5 @@ use dpp::block::block_info::BlockInfo; +use dpp::document::property_names::PRICE; use dpp::document::{property_names, Document, DocumentV0Setters}; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -26,7 +27,7 @@ impl DocumentUpdatePriceTransitionActionV0 { let mut modified_document = original_document; - modified_document.set_u64("$price", *price); + modified_document.set_u64(PRICE, *price); modified_document.bump_revision(); diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs index fec04b7701c..fc5de09a359 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs @@ -8,7 +8,6 @@ use dpp::identity::SecurityLevel; use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; /// document transition diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 8fc11eba4e2..d8abdb5eb04 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -3,6 +3,7 @@ pub mod broadcast; pub(crate) mod broadcast_identity; pub mod broadcast_request; pub(crate) mod context; +mod purchase_document; mod put_contract; pub mod put_document; pub mod put_identity; @@ -10,6 +11,7 @@ pub mod put_settings; pub mod top_up_identity; mod transfer_document; mod txid; +mod update_price_of_document; pub mod withdraw_from_identity; pub use context::*; diff --git a/packages/rs-sdk/src/platform/transition/purchase_document.rs b/packages/rs-sdk/src/platform/transition/purchase_document.rs new file mode 100644 index 00000000000..aa58b63b324 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/purchase_document.rs @@ -0,0 +1,181 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::sync::Arc; + +use crate::{Error, Sdk}; + +use crate::platform::block_info_from_metadata::block_info_from_metadata; +use crate::platform::transition::put_settings::PutSettings; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::DocumentType; +use dpp::data_contract::DataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::fee::Credits; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::Identifier; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for purchasing a document on Platform +pub trait PurchaseDocument { + /// Tries to purchase a document on platform + /// Setting settings to `None` sets default connection behavior + async fn purchase_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Tries to purchase a document on platform and waits for the response + async fn purchase_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl PurchaseDocument for Document { + async fn purchase_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + purchaser_id, + document_type.data_contract_id(), + true, + settings, + ) + .await?; + + let settings = settings.unwrap_or_default(); + + let transition = DocumentsBatchTransition::new_document_purchase_transition_from_document( + self.clone(), + document_type.as_ref(), + purchaser_id, + price, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let block_info = block_info_from_metadata(response.metadata()?)?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &block_info, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn purchase_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .purchase_document( + price, + sdk, + document_type, + purchaser_id, + identity_public_key, + signer, + None, + ) + .await?; + + let document = >::wait_for_response( + self, + sdk, + state_transition, + data_contract, + ) + .await?; + + Ok(document) + } +} diff --git a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs new file mode 100644 index 00000000000..93da9aaf2b7 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs @@ -0,0 +1,168 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::sync::Arc; + +use crate::{Error, Sdk}; + +use crate::platform::block_info_from_metadata::block_info_from_metadata; +use crate::platform::transition::put_settings::PutSettings; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::DocumentType; +use dpp::data_contract::DataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::fee::Credits; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for updating the price of a document on Platform +pub trait UpdatePriceOfDocument { + /// Updates the price of a document on platform + /// Setting settings to `None` sets default connection behavior + async fn update_price_of_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Updates the price of a document on platform and waits for the response + async fn update_price_of_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl UpdatePriceOfDocument for Document { + async fn update_price_of_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.owner_id(), + document_type.data_contract_id(), + true, + settings, + ) + .await?; + + let settings = settings.unwrap_or_default(); + + let transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + self.clone(), + document_type.as_ref(), + price, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let block_info = block_info_from_metadata(response.metadata()?)?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &block_info, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn update_price_of_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .update_price_of_document(price, sdk, document_type, identity_public_key, signer, None) + .await?; + + let document = >::wait_for_response( + self, + sdk, + state_transition, + data_contract, + ) + .await?; + + Ok(document) + } +} diff --git a/packages/rs-sdk/tests/fetch/common.rs b/packages/rs-sdk/tests/fetch/common.rs index 2ad8df272ff..e286593bb61 100644 --- a/packages/rs-sdk/tests/fetch/common.rs +++ b/packages/rs-sdk/tests/fetch/common.rs @@ -29,6 +29,7 @@ pub fn mock_document_type() -> dpp::data_contract::document_type::DocumentType { None, false, false, + false, true, &mut vec![], platform_version, From e734abdff18bdeaa17087ca1327f966e6b55a6a1 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 03:08:44 +0700 Subject: [PATCH 35/65] fixes --- Cargo.lock | 20 ++-- .../document/v0/document-meta.json | 11 ++- .../document_type/accessors/mod.rs | 19 ++++ .../document_type/accessors/v0/mod.rs | 4 + .../class_methods/try_from_schema/v0/mod.rs | 12 ++- .../src/data_contract/document_type/mod.rs | 3 + .../document_type/restricted_creation/mod.rs | 47 ++++++++++ .../document_type/v0/accessors.rs | 5 + .../src/data_contract/document_type/v0/mod.rs | 5 +- .../document_type/v0/random_document_type.rs | 3 + .../src/errors/consensus/basic/basic_error.rs | 24 +++-- .../consensus/basic/data_contract/mod.rs | 2 + ...ocument_creation_restriction_mode_error.rs | 47 ++++++++++ .../document_creation_not_allowed_error.rs | 58 ++++++++++++ .../errors/consensus/basic/document/mod.rs | 2 + packages/rs-dpp/src/errors/consensus/codes.rs | 2 + packages/rs-dpp/src/nft/mod.rs | 18 ++-- .../document_create_transition_action/mod.rs | 4 +- .../structure_v0/mod.rs | 39 +++++++- .../advanced_structure/v0/mod.rs | 2 +- .../state_transitions/documents_batch/mod.rs | 14 ++- .../documents_batch/transformer/v0/mod.rs | 7 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 10 +- packages/rs-drive/src/drive/flags.rs | 92 +++++++++++++++---- .../v0/mod.rs | 30 +++--- .../v0/mod.rs | 26 +++--- packages/rs-platform-version/Cargo.toml | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- .../src/errors/consensus/consensus_error.rs | 10 +- 30 files changed, 427 insertions(+), 95 deletions(-) create mode 100644 packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs diff --git a/Cargo.lock b/Cargo.lock index 60afac71eab..bdef2883fd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1876,7 +1876,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" dependencies = [ "bincode", "grovedb-costs", @@ -1897,7 +1897,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" dependencies = [ "integer-encoding", "intmap", @@ -1907,7 +1907,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" dependencies = [ "blake3", "byteorder", @@ -1930,12 +1930,12 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" dependencies = [ "blake3", "grovedb-costs", @@ -1954,7 +1954,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" dependencies = [ "hex", "itertools 0.12.1", @@ -4403,18 +4403,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index 2d6258a0570..b256f4fcf39 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -509,7 +509,16 @@ 2, 3 ], - "description": "Built in marketplace system. 0 - None, 1 - Public Offer, a user will make an offer that needs to be accepted, 2 - Private Offer, a user will make an offer that needs to be accepted, 3 - Direct purchase (The user can buy the item without the need for an approval)" + "description": "Built in marketplace system. 0 - None, 1 - Direct purchase (The user can buy the item without the need for an approval)" + }, + "creationRestrictionMode": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "description": "Restrictions of document creation. 0 - No restrictions, 1 - Owner only, 2 - No creation (System Only)" }, "requiresIdentityEncryptionBoundedKey": { "type": "integer", diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index a2580e846bc..582db2f196a 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -7,6 +7,7 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeMutRef, Docu use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; @@ -94,6 +95,12 @@ impl DocumentTypeV0Getters for DocumentType { } } + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + match self { + DocumentType::V0(v0) => v0.creation_restriction_mode(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentType::V0(v0) => v0.documents_transferable(), @@ -210,6 +217,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { } } + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + match self { + DocumentTypeRef::V0(v0) => v0.creation_restriction_mode(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeRef::V0(v0) => v0.data_contract_id(), @@ -320,6 +333,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { } } + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + match self { + DocumentTypeMutRef::V0(v0) => v0.creation_restriction_mode(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeMutRef::V0(v0) => v0.data_contract_id(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index 72bfee2cbe3..57e19c90144 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -4,6 +4,7 @@ use crate::data_contract::document_type::property::DocumentProperty; use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; @@ -52,6 +53,9 @@ pub trait DocumentTypeV0Getters { /// Returns the documents trade mode flag of the document type. fn trade_mode(&self) -> TradeMode; + /// Returns the creation restriction mode. + fn creation_restriction_mode(&self) -> CreationRestrictionMode; + /// Returns the data contract id of the document type. fn data_contract_id(&self) -> Identifier; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 6d0ce5f4bae..67f5746dea1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -33,7 +33,8 @@ use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesE #[cfg(feature = "validation")] use crate::consensus::basic::BasicError; use crate::data_contract::document_type::property_names::{ - CAN_BE_DELETED, DOCUMENTS_KEEP_HISTORY, DOCUMENTS_MUTABLE, TRADE_MODE, TRANSFERABLE, + CAN_BE_DELETED, CREATION_RESTRICTION_MODE, DOCUMENTS_KEEP_HISTORY, DOCUMENTS_MUTABLE, + TRADE_MODE, TRANSFERABLE, }; use crate::data_contract::document_type::{property_names, DocumentType}; use crate::data_contract::errors::DataContractError; @@ -246,6 +247,14 @@ impl DocumentTypeV0 { let trade_mode = documents_trade_mode_u8.try_into()?; + // Are documents of this type transferable? + let documents_creation_restriction_mode_u8: u8 = + Value::inner_optional_integer_value(schema_map, CREATION_RESTRICTION_MODE) + .map_err(consensus_or_protocol_value_error)? + .unwrap_or_default(); + + let creation_restriction_mode = documents_creation_restriction_mode_u8.try_into()?; + // Extract the properties let property_values = Value::inner_optional_index_map::( schema_map, @@ -531,6 +540,7 @@ impl DocumentTypeV0 { documents_can_be_deleted, documents_transferable, trade_mode, + creation_restriction_mode, data_contract_id, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index c799fd9532f..c37c7fc252b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -10,6 +10,7 @@ pub use index_level::IndexLevel; #[cfg(feature = "random-documents")] pub mod random_document; +pub mod restricted_creation; pub mod schema; pub mod v0; @@ -30,6 +31,8 @@ mod property_names { pub const CAN_BE_DELETED: &str = "canBeDeleted"; pub const TRANSFERABLE: &str = "transferable"; pub const TRADE_MODE: &str = "tradeMode"; + + pub const CREATION_RESTRICTION_MODE: &str = "creationRestrictionMode"; pub const SECURITY_LEVEL_REQUIREMENT: &str = "signatureSecurityLevelRequirement"; pub const REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY: &str = "requiresIdentityEncryptionBoundedKey"; diff --git a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs new file mode 100644 index 00000000000..41e5286fe31 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::data_contract::UnknownDocumentCreationRestrictionModeError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; +use crate::ProtocolError; +use std::fmt; +use std::fmt::{Display, Formatter}; + +#[derive(Debug, PartialEq, Clone, Copy, Eq, Encode, Decode)] +pub enum CreationRestrictionMode { + NoRestrictions, + OwnerOnly, + NoCreationAllowed, +} + +impl Display for CreationRestrictionMode { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + CreationRestrictionMode::NoRestrictions => write!(f, "No Restrictions"), + CreationRestrictionMode::OwnerOnly => write!(f, "Owner Only"), + CreationRestrictionMode::NoCreationAllowed => write!(f, "No Creation Allowed"), + } + } +} + +impl TryFrom for CreationRestrictionMode { + type Error = ProtocolError; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::NoRestrictions), + 1 => Ok(Self::OwnerOnly), + 2 => Ok(Self::NoCreationAllowed), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError( + BasicError::UnknownDocumentCreationRestrictionModeError( + UnknownDocumentCreationRestrictionModeError::new( + vec![0, 1, 2], + value.into(), + ), + ), + ) + .into(), + )), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index 906f7471818..b1d57ced324 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -6,6 +6,7 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; @@ -70,6 +71,10 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.trade_mode } + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + self.creation_restriction_mode + } + fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 245e4cbbe78..147614713ca 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -9,6 +9,7 @@ use crate::data_contract::storage_requirements::keys_for_document_type::StorageK #[cfg(feature = "validation")] pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use crate::nft::TradeMode; @@ -61,7 +62,9 @@ pub struct DocumentTypeV0 { pub(in crate::data_contract) documents_transferable: Transferable, /// How are these documents traded? pub(in crate::data_contract) trade_mode: TradeMode, - + /// Is document creation restricted? + pub(in crate::data_contract) creation_restriction_mode: CreationRestrictionMode, + /// The data contract id pub(in crate::data_contract) data_contract_id: Identifier, /// Encryption key storage requirements pub(in crate::data_contract) requires_identity_encryption_bounded_key: diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 0ed76147902..3e46c291ea1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -100,6 +100,7 @@ impl RandomDocumentTypeParameters { use crate::data_contract::document_type::array::ArrayItemType; use crate::data_contract::document_type::index_level::IndexLevel; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; #[cfg(feature = "validation")] use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; use crate::data_contract::document_type::{ @@ -429,6 +430,7 @@ impl DocumentTypeV0 { documents_can_be_deleted, documents_transferable: Transferable::Never, trade_mode: TradeMode::None, + creation_restriction_mode: CreationRestrictionMode::NoRestrictions, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, @@ -596,6 +598,7 @@ impl DocumentTypeV0 { documents_can_be_deleted, documents_transferable: Transferable::Never, trade_mode: TradeMode::None, + creation_restriction_mode: CreationRestrictionMode::NoRestrictions, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 11361044caf..f78903696a6 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -14,20 +14,22 @@ use crate::consensus::basic::data_contract::{ InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, - UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, + UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, + UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, }; use crate::consensus::basic::document::{ - DataContractNotPresentError, DocumentTransitionsAreAbsentError, - DuplicateDocumentTransitionsWithIdsError, DuplicateDocumentTransitionsWithIndicesError, - InconsistentCompoundIndexDataError, InvalidDocumentTransitionActionError, - InvalidDocumentTransitionIdError, InvalidDocumentTypeError, - MaxDocumentsTransitionsExceededError, MissingDataContractIdBasicError, - MissingDocumentTransitionActionError, MissingDocumentTransitionTypeError, - MissingDocumentTypeError, MissingPositionsInDocumentTypePropertiesError, NonceOutOfBoundsError, + DataContractNotPresentError, DocumentCreationNotAllowedError, + DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, + DuplicateDocumentTransitionsWithIndicesError, InconsistentCompoundIndexDataError, + InvalidDocumentTransitionActionError, InvalidDocumentTransitionIdError, + InvalidDocumentTypeError, MaxDocumentsTransitionsExceededError, + MissingDataContractIdBasicError, MissingDocumentTransitionActionError, + MissingDocumentTransitionTypeError, MissingDocumentTypeError, + MissingPositionsInDocumentTypePropertiesError, NonceOutOfBoundsError, }; use crate::consensus::basic::identity::{ DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, @@ -96,6 +98,9 @@ pub enum BasicError { #[error(transparent)] UnknownTradeModeError(UnknownTradeModeError), + #[error(transparent)] + UnknownDocumentCreationRestrictionModeError(UnknownDocumentCreationRestrictionModeError), + #[error(transparent)] SerializedObjectParsingError(SerializedObjectParsingError), @@ -186,6 +191,9 @@ pub enum BasicError { #[error(transparent)] DataContractNotPresentError(DataContractNotPresentError), + #[error(transparent)] + DocumentCreationNotAllowedError(DocumentCreationNotAllowedError), + #[error(transparent)] DataContractBoundsNotPresentError(DataContractBoundsNotPresentError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index f3372edcb3a..4e79e023acd 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -20,6 +20,7 @@ mod invalid_json_schema_ref_error; mod system_property_index_already_present_error; mod undefined_index_property_error; mod unique_indices_limit_reached_error; +mod unknown_document_creation_restriction_mode_error; mod unknown_security_level_error; mod unknown_storage_key_requirements_error; mod unknown_trade_mode_error; @@ -48,6 +49,7 @@ pub use undefined_index_property_error::*; pub use unique_indices_limit_reached_error::*; pub use invalid_document_type_name_error::*; +pub use unknown_document_creation_restriction_mode_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; pub use unknown_trade_mode_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs new file mode 100644 index 00000000000..2d55df7e397 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized document creation restriction mode: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownDocumentCreationRestrictionModeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownDocumentCreationRestrictionModeError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownDocumentCreationRestrictionModeError) -> Self { + Self::BasicError(BasicError::UnknownDocumentCreationRestrictionModeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs new file mode 100644 index 00000000000..5ad1732dddc --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs @@ -0,0 +1,58 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Document Creation on {data_contract_id}:{document_type_name} is not allowed because of the document type's creation restriction mode {creation_restriction_mode}")] +#[platform_serialize(unversioned)] +pub struct DocumentCreationNotAllowedError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + data_contract_id: Identifier, + + document_type_name: String, + + creation_restriction_mode: CreationRestrictionMode, +} + +impl DocumentCreationNotAllowedError { + pub fn new( + data_contract_id: Identifier, + document_type_name: String, + creation_restriction_mode: CreationRestrictionMode, + ) -> Self { + Self { + data_contract_id, + document_type_name, + creation_restriction_mode, + } + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + pub fn document_type_name(&self) -> &str { + self.document_type_name.as_str() + } + + pub fn creation_restriction_mode(&self) -> CreationRestrictionMode { + self.creation_restriction_mode + } +} + +impl From for ConsensusError { + fn from(err: DocumentCreationNotAllowedError) -> Self { + Self::BasicError(BasicError::DocumentCreationNotAllowedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs index 7cc323f4fa3..9c011e12b59 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs @@ -1,4 +1,5 @@ mod data_contract_not_present_error; +mod document_creation_not_allowed_error; mod document_transitions_are_absent_error; mod duplicate_document_transitions_with_ids_error; mod duplicate_document_transitions_with_indices_error; @@ -15,6 +16,7 @@ mod missing_document_type_error; mod missing_positions_in_document_type_properties_error; pub use data_contract_not_present_error::*; +pub use document_creation_not_allowed_error::*; pub use document_transitions_are_absent_error::*; pub use duplicate_document_transitions_with_ids_error::*; pub use duplicate_document_transitions_with_indices_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 383a27dffcc..dc5962bb5cd 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -92,6 +92,7 @@ impl ErrorWithCode for BasicError { Self::ContractError(DataContractError::KeyValueMustExist(_)) => 10242, Self::UnknownTransferableTypeError { .. } => 10243, Self::UnknownTradeModeError { .. } => 10244, + Self::UnknownDocumentCreationRestrictionModeError { .. } => 10245, // Document Errors: 10400-10499 Self::DataContractNotPresentError { .. } => 10400, @@ -110,6 +111,7 @@ impl ErrorWithCode for BasicError { Self::DocumentTransitionsAreAbsentError { .. } => 10413, Self::NonceOutOfBoundsError(_) => 10414, Self::InvalidDocumentTypeNameError(_) => 10415, + Self::DocumentCreationNotAllowedError(_) => 10416, // Identity Errors: 10500-10599 Self::DuplicatedIdentityPublicKeyBasicError(_) => 10500, diff --git a/packages/rs-dpp/src/nft/mod.rs b/packages/rs-dpp/src/nft/mod.rs index 9b4ed424ac6..386585dc713 100644 --- a/packages/rs-dpp/src/nft/mod.rs +++ b/packages/rs-dpp/src/nft/mod.rs @@ -9,8 +9,8 @@ use std::fmt::{Display, Formatter}; pub enum TradeMode { None = 0, DirectPurchase = 1, - PublicOffer = 2, - PrivateOffer = 3, + // PublicOffer = 2, + // PrivateOffer = 3, } impl TradeMode { @@ -18,8 +18,8 @@ impl TradeMode { match self { TradeMode::None => false, TradeMode::DirectPurchase => true, - TradeMode::PublicOffer => true, //min price - TradeMode::PrivateOffer => true, //min price + // TradeMode::PublicOffer => true, //min price + // TradeMode::PrivateOffer => true, //min price } } } @@ -29,8 +29,8 @@ impl Display for TradeMode { match self { TradeMode::None => write!(f, "No Trading"), TradeMode::DirectPurchase => write!(f, "Direct Purchase"), - TradeMode::PublicOffer => write!(f, "Public Offer"), - TradeMode::PrivateOffer => write!(f, "Private Offer"), + // TradeMode::PublicOffer => write!(f, "Public Offer"), + // TradeMode::PrivateOffer => write!(f, "Private Offer"), } } } @@ -42,11 +42,11 @@ impl TryFrom for TradeMode { match value { 0 => Ok(Self::None), 1 => Ok(Self::DirectPurchase), - 2 => Ok(Self::PublicOffer), - 3 => Ok(Self::PrivateOffer), + // 2 => Ok(Self::PublicOffer), + // 3 => Ok(Self::PrivateOffer), value => Err(ProtocolError::ConsensusError( ConsensusError::BasicError(BasicError::UnknownTradeModeError( - UnknownTradeModeError::new(vec![0, 1, 2, 3], value.into()), + UnknownTradeModeError::new(vec![0, 1], value.into()), )) .into(), )), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs index 713d82c1292..2d5e116aa85 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs @@ -17,6 +17,7 @@ mod structure_v0; pub trait DocumentCreateTransitionActionValidation { fn validate_structure( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result; @@ -34,6 +35,7 @@ pub trait DocumentCreateTransitionActionValidation { impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction { fn validate_structure( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -43,7 +45,7 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .documents_batch_state_transition .document_create_transition_structure_validation { - 0 => self.validate_structure_v0(platform_version), + 0 => self.validate_structure_v0(owner_id, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentCreateTransitionAction::validate_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs index bda10d4b2c0..3ddc152f088 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs @@ -1,6 +1,9 @@ -use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::consensus::basic::document::{DocumentCreationNotAllowedError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::restricted_creation::CreationRestrictionMode; use dpp::data_contract::validation::DataContractValidationMethodsV0; +use dpp::identifier::Identifier; use dpp::validation::{SimpleConsensusValidationResult}; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; @@ -10,12 +13,14 @@ use crate::error::Error; pub(super) trait DocumentCreateTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result; } impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTransitionAction { fn validate_structure_v0( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { let contract_fetch_info = self.base().data_contract_fetch_info(); @@ -23,16 +28,40 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans // Make sure that the document type is defined in the contract let document_type_name = self.base().document_type_name(); - if data_contract - .document_type_optional_for_name(document_type_name) - .is_none() - { + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), )); }; + match document_type.creation_restriction_mode() { + CreationRestrictionMode::NoRestrictions => {} + CreationRestrictionMode::OwnerOnly => { + if owner_id != data_contract.owner_id() { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentCreationNotAllowedError::new( + self.base().data_contract_id(), + document_type_name.clone(), + document_type.creation_restriction_mode(), + ) + .into(), + )); + } + } + CreationRestrictionMode::NoCreationAllowed => { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentCreationNotAllowedError::new( + self.base().data_contract_id(), + document_type_name.clone(), + document_type.creation_restriction_mode(), + ) + .into(), + )); + } + } + // Validate user defined properties data_contract diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 4e3f8b0a48d..6c9f7b93b42 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -119,7 +119,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi for transition in action.transitions() { match transition { DocumentTransitionAction::CreateAction(create_action) => { - let result = create_action.validate_structure(platform_version)?; + let result = create_action.validate_structure(identity.id, platform_version)?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index fc3d3db2e64..883dd4f599f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -2883,7 +2883,7 @@ mod tests { .aggregated_fees() .fee_refunds .calculate_refunds_amount_for_identity(identity.id()), - Some(22488973) + Some(22704503) ); let query_sender_results = platform @@ -2910,7 +2910,7 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.2) - 6816550 - 756000 - original_creation_cost + 22488973 + dash_to_credits!(0.2) - 6816550 - 756000 - original_creation_cost + 22704503 ); let buyers_balance = platform @@ -2923,6 +2923,16 @@ mod tests { assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10891300 - 64611000); } + #[test] + fn test_document_set_price_and_purchase_from_ones_self() { + // In this test we try to buy a document from ourselves + } + + #[test] + fn test_document_set_price_and_purchase_then_try_buy_back() { + // In this test we try to buy back a document after it has been sold + } + #[test] fn test_document_set_price_and_purchase_with_enough_credits_to_buy_but_not_enough_to_pay_for_processing( ) { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 8184fc3f556..e6e62116742 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -352,9 +352,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition DocumentTransition::Create(document_create_transition) => { let result = ConsensusValidationResult::::new(); - let document_create_action = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, block_info, |_identifier| { - Ok(data_contract_fetch_info.clone()) - })?; + let document_create_action = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup( + document_create_transition, block_info, |_identifier| { + Ok(data_contract_fetch_info.clone()) + })?; if result.is_valid() { Ok(DocumentTransitionAction::CreateAction(document_create_action).into()) diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 28d9a19f72f..b1afb8ade4c 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -13,7 +13,7 @@ json = ["dep:serde_json"] [dependencies] -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } dapi-grpc = { path = "../dapi-grpc" } drive = { path = "../rs-drive", default-features = false, features = [ "verify", diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index a29d414f177..dc9a4db779e 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -26,7 +26,7 @@ sqlparser = { version = "0.38.0" } # used for int maps and needed in the verifier nohash-hasher = { version = "0.2.0" } dpp = { path = "../rs-dpp", features = ["state-transitions"], default-features = false, optional = true } -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } tracing = { version = "0.1.37", default-features = false, features = [] } derive_more = { version = "0.99.17", optional = true} @@ -45,10 +45,10 @@ enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true, default-features = false } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements", optional = true } [dev-dependencies] criterion = "0.3.5" diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index dcae6e3a7ed..e9ada6f0a79 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -97,6 +97,19 @@ pub enum StorageFlags { MultiEpochOwned(BaseEpoch, BTreeMap, OwnerId), } +#[cfg(any(feature = "server", feature = "verify"))] +/// MergingOwnersStrategy decides which owner to keep during a merge +#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] +pub enum MergingOwnersStrategy { + #[default] + /// Raise an issue that owners of nodes are different + RaiseIssue, + /// Use the original owner id + UseOurs, + /// Use the new owner id + UseTheirs, +} + #[cfg(feature = "server")] impl StorageFlags { /// Create new single epoch storage flags @@ -107,18 +120,31 @@ impl StorageFlags { } } - fn combine_owner_id<'a>(&'a self, rhs: &'a Self) -> Result, Error> { + fn combine_owner_id<'a>( + &'a self, + rhs: &'a Self, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result, Error> { if let Some(our_owner_id) = self.owner_id() { if let Some(other_owner_id) = rhs.owner_id() { if our_owner_id != other_owner_id { - return Err(Error::StorageFlags( - StorageFlagsError::MergingStorageFlagsFromDifferentOwners( - "can not merge from different owners", - ), - )); + match merging_owners_strategy { + MergingOwnersStrategy::RaiseIssue => { + return Err(Error::StorageFlags( + StorageFlagsError::MergingStorageFlagsFromDifferentOwners( + "can not merge from different owners", + ), + )); + } + MergingOwnersStrategy::UseOurs => Ok(Some(our_owner_id)), + MergingOwnersStrategy::UseTheirs => Ok(Some(other_owner_id)), + } + } else { + Ok(Some(our_owner_id)) } + } else { + Ok(Some(our_owner_id)) } - Ok(Some(our_owner_id)) } else if let Some(other_owner_id) = rhs.owner_id() { Ok(Some(other_owner_id)) } else { @@ -152,9 +178,13 @@ impl StorageFlags { } } - fn combine_same_base_epoch(&self, rhs: Self) -> Result { + fn combine_same_base_epoch( + &self, + rhs: Self, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result { let base_epoch = *self.base_epoch(); - let owner_id = self.combine_owner_id(&rhs)?; + let owner_id = self.combine_owner_id(&rhs, merging_owners_strategy)?; let other_epoch_bytes = self.combine_non_base_epoch_bytes(&rhs); match (owner_id, other_epoch_bytes) { @@ -167,10 +197,15 @@ impl StorageFlags { } } - fn combine_with_higher_base_epoch(&self, rhs: Self, added_bytes: u32) -> Result { + fn combine_with_higher_base_epoch( + &self, + rhs: Self, + added_bytes: u32, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result { let base_epoch = *self.base_epoch(); let epoch_with_adding_bytes = rhs.base_epoch(); - let owner_id = self.combine_owner_id(&rhs)?; + let owner_id = self.combine_owner_id(&rhs, merging_owners_strategy)?; let mut other_epoch_bytes = self.combine_non_base_epoch_bytes(&rhs).unwrap_or_default(); let original_value = other_epoch_bytes.remove(epoch_with_adding_bytes); match original_value { @@ -190,12 +225,13 @@ impl StorageFlags { self, rhs: Self, removed_bytes: &StorageRemovedBytes, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { if matches!(&self, &SingleEpoch(_) | &SingleEpochOwned(..)) { return Ok(self); } let base_epoch = *self.base_epoch(); - let owner_id = self.combine_owner_id(&rhs)?; + let owner_id = self.combine_owner_id(&rhs, merging_owners_strategy)?; let mut other_epoch_bytes = self.combine_non_base_epoch_bytes(&rhs).unwrap_or_default(); if let SectionedStorageRemoval(sectioned_bytes_by_identifier) = removed_bytes { if sectioned_bytes_by_identifier.len() > 1 { @@ -246,10 +282,13 @@ impl StorageFlags { ours: Option, theirs: Self, added_bytes: u32, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { match ours { None => Ok(theirs), - Some(ours) => Ok(ours.combine_added_bytes(theirs, added_bytes)?), + Some(ours) => { + Ok(ours.combine_added_bytes(theirs, added_bytes, merging_owners_strategy)?) + } } } @@ -258,18 +297,28 @@ impl StorageFlags { ours: Option, theirs: Self, removed_bytes: &StorageRemovedBytes, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { match ours { None => Ok(theirs), - Some(ours) => Ok(ours.combine_removed_bytes(theirs, removed_bytes)?), + Some(ours) => { + Ok(ours.combine_removed_bytes(theirs, removed_bytes, merging_owners_strategy)?) + } } } /// Combine added bytes - pub fn combine_added_bytes(self, rhs: Self, added_bytes: u32) -> Result { + pub fn combine_added_bytes( + self, + rhs: Self, + added_bytes: u32, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result { match self.base_epoch().cmp(rhs.base_epoch()) { - Ordering::Equal => self.combine_same_base_epoch(rhs), - Ordering::Less => self.combine_with_higher_base_epoch(rhs, added_bytes), + Ordering::Equal => self.combine_same_base_epoch(rhs, merging_owners_strategy), + Ordering::Less => { + self.combine_with_higher_base_epoch(rhs, added_bytes, merging_owners_strategy) + } Ordering::Greater => Err(Error::StorageFlags( StorageFlagsError::MergingStorageFlagsWithDifferentBaseEpoch( "can not merge with new item in older base epoch", @@ -283,10 +332,15 @@ impl StorageFlags { self, rhs: Self, removed_bytes: &StorageRemovedBytes, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { match self.base_epoch().cmp(rhs.base_epoch()) { - Ordering::Equal => self.combine_same_base_epoch(rhs), - Ordering::Less => self.combine_with_higher_base_epoch_remove_bytes(rhs, removed_bytes), + Ordering::Equal => self.combine_same_base_epoch(rhs, merging_owners_strategy), + Ordering::Less => self.combine_with_higher_base_epoch_remove_bytes( + rhs, + removed_bytes, + merging_owners_strategy, + ), Ordering::Greater => Err(Error::StorageFlags( StorageFlagsError::MergingStorageFlagsWithDifferentBaseEpoch( "can not merge with new item in older base epoch", diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs index 1ada7f8918a..b6d86527ffe 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs @@ -1,6 +1,6 @@ use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::drive::batch::GroveDbOpBatch; -use crate::drive::flags::StorageFlags; +use crate::drive::flags::{MergingOwnersStrategy, StorageFlags}; use crate::drive::grove_operations::push_drive_operation_result; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -76,30 +76,33 @@ impl Drive { // This could be none only because the old element didn't exist // If they were empty we get an error let maybe_old_storage_flags = StorageFlags::map_some_element_flags_ref(&old_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand flags of old item being updated", + format!("drive did not understand flags of old item being updated: {}", e) ) })?; let new_storage_flags = StorageFlags::from_element_flags_ref(new_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand updated item flag information", + format!("drive did not understand updated item flag information: {}",e) ) })? .ok_or(GroveError::JustInTimeElementFlagsClientError( - "removing flags from an item with flags is not allowed", + "removing flags from an item with flags is not allowed".to_string() ))?; match &cost.transition_type() { OperationStorageTransitionType::OperationUpdateBiggerSize => { + // In the case that the owners do not match up this means that there has been a transfer + // of ownership of the underlying document, the value held is transferred to the new owner let combined_storage_flags = StorageFlags::optional_combine_added_bytes( maybe_old_storage_flags, new_storage_flags, cost.added_bytes, + MergingOwnersStrategy::UseTheirs, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were bigger)", + format!("drive could not combine storage flags (new flags were bigger): {}",e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -113,14 +116,17 @@ impl Drive { } } OperationStorageTransitionType::OperationUpdateSmallerSize => { + // In the case that the owners do not match up this means that there has been a transfer + // of ownership of the underlying document, the value held is transferred to the new owner let combined_storage_flags = StorageFlags::optional_combine_removed_bytes( maybe_old_storage_flags, new_storage_flags, &cost.removed_bytes, + MergingOwnersStrategy::UseTheirs, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were smaller)", + format!("drive could not combine storage flags (new flags were smaller): {}", e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -138,9 +144,9 @@ impl Drive { }, |flags, removed_key_bytes, removed_value_bytes| { let maybe_storage_flags = - StorageFlags::from_element_flags_ref(flags).map_err(|_| { + StorageFlags::from_element_flags_ref(flags).map_err(|e| { GroveError::SplitRemovalBytesClientError( - "drive did not understand flags of item being updated", + format!("drive did not understand flags of item being updated: {}",e) ) })?; // if there were no flags before then the new flags are used diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs index c26e17fe483..55e400c2402 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs @@ -1,6 +1,6 @@ use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::drive::batch::GroveDbOpBatch; -use crate::drive::flags::StorageFlags; +use crate::drive::flags::{MergingOwnersStrategy, StorageFlags}; use crate::drive::grove_operations::push_drive_operation_result; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -59,19 +59,19 @@ impl Drive { // This could be none only because the old element didn't exist // If they were empty we get an error let maybe_old_storage_flags = StorageFlags::map_some_element_flags_ref(&old_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand flags of old item being updated", + format!("drive did not understand flags of old item being updated {}",e) ) })?; let new_storage_flags = StorageFlags::from_element_flags_ref(new_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand updated item flag information", + format!("drive did not understand updated item flag information {}", e) ) })? .ok_or(GroveError::JustInTimeElementFlagsClientError( - "removing flags from an item with flags is not allowed", + "removing flags from an item with flags is not allowed".to_string() ))?; match &cost.transition_type() { OperationStorageTransitionType::OperationUpdateBiggerSize => { @@ -79,10 +79,11 @@ impl Drive { maybe_old_storage_flags, new_storage_flags, cost.added_bytes, + MergingOwnersStrategy::RaiseIssue, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were bigger)", + format!("drive could not combine storage flags (new flags were bigger): {}", e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -100,10 +101,11 @@ impl Drive { maybe_old_storage_flags, new_storage_flags, &cost.removed_bytes, + MergingOwnersStrategy::RaiseIssue, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were smaller)", + format!("drive could not combine storage flags (new flags were smaller): {}",e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -121,9 +123,9 @@ impl Drive { }, |flags, removed_key_bytes, removed_value_bytes| { let maybe_storage_flags = - StorageFlags::from_element_flags_ref(flags).map_err(|_| { + StorageFlags::from_element_flags_ref(flags).map_err(|e| { GroveError::SplitRemovalBytesClientError( - "drive did not understand flags of item being updated", + format!("drive did not understand flags of item being updated: {}",e) ) })?; // if there were no flags before then the new flags are used diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 6f51c343aa5..bdfe3477815 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -8,7 +8,7 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } [features] mock-versions = [] diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 5bec0550a4f..dd1eff352df 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -18,7 +18,7 @@ serde_json = { version = "1.0", features = ["preserve_order"] } wasm-bindgen = { version = "=0.2.86" } js-sys = "0.3.53" web-sys = { version = "0.3.6", features = ["console"] } -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } serde-wasm-bindgen = { git = "https://github.com/QuantumExplorer/serde-wasm-bindgen", branch = "feat/not_human_readable" } dpp = { path = "../rs-dpp", default-features = false, features = [ "state-transition-serde-conversion", diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 101063d2ad7..a1d4acf447f 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -61,8 +61,8 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; -use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; -use dpp::consensus::basic::document::{MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; +use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; +use dpp::consensus::basic::document::{DocumentCreationNotAllowedError, MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; @@ -463,6 +463,12 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::UnknownTradeModeError(e) => { generic_consensus_error!(UnknownTradeModeError, e).into() } + BasicError::UnknownDocumentCreationRestrictionModeError(e) => { + generic_consensus_error!(UnknownDocumentCreationRestrictionModeError, e).into() + } + BasicError::DocumentCreationNotAllowedError(e) => { + generic_consensus_error!(DocumentCreationNotAllowedError, e).into() + } } } From ae77e5f9c1f7d56a80be033b54e4b283eb308b99 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 06:42:13 +0700 Subject: [PATCH 36/65] added more tests and some extra validation and errors --- .../schema/v1/dashpay.schema.json | 1 + .../document_type/accessors/mod.rs | 18 + .../document_type/accessors/v0/mod.rs | 3 + .../document_type/v0/accessors.rs | 4 + packages/rs-dpp/src/errors/consensus/codes.rs | 2 + ...document_incorrect_purchase_price_error.rs | 58 + .../document/document_not_for_sale_error.rs | 37 + .../errors/consensus/state/document/mod.rs | 2 + .../src/errors/consensus/state/state_error.rs | 8 + .../structure_v0/mod.rs | 4 +- .../data_triggers/bindings/list/v0/mod.rs | 12 - .../state_transitions/documents_batch/mod.rs | 6292 ++++++++++------- .../documents_batch/transformer/v0/mod.rs | 26 + ...ame-all-transferable-no-owner-indexes.json | 1 + .../crypto-card-game-all-transferable.json | 1 + ...purchase-creation-restricted-to-owner.json | 135 + .../crypto-card-game-direct-purchase.json | 1 + ...equest-mutable-and-can-not-be-deleted.json | 234 + ...equest-not-mutable-and-can-be-deleted.json | 234 + .../v0/mod.rs | 2 +- 20 files changed, 4566 insertions(+), 2509 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json diff --git a/packages/dashpay-contract/schema/v1/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json index d4281468ed9..016d40db73c 100644 --- a/packages/dashpay-contract/schema/v1/dashpay.schema.json +++ b/packages/dashpay-contract/schema/v1/dashpay.schema.json @@ -132,6 +132,7 @@ }, "contactRequest": { "documentsMutable": false, + "canBeDeleted": false, "requiresIdentityEncryptionBoundedKey": 2, "requiresIdentityDecryptionBoundedKey": 2, "type": "object", diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index 582db2f196a..3dea66c6915 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -89,6 +89,12 @@ impl DocumentTypeV0Getters for DocumentType { } } + fn documents_can_be_deleted(&self) -> bool { + match self { + DocumentType::V0(v0) => v0.documents_can_be_deleted(), + } + } + fn trade_mode(&self) -> TradeMode { match self { DocumentType::V0(v0) => v0.trade_mode(), @@ -205,6 +211,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { } } + fn documents_can_be_deleted(&self) -> bool { + match self { + DocumentTypeRef::V0(v0) => v0.documents_can_be_deleted(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentTypeRef::V0(v0) => v0.documents_transferable(), @@ -321,6 +333,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { } } + fn documents_can_be_deleted(&self) -> bool { + match self { + DocumentTypeMutRef::V0(v0) => v0.documents_can_be_deleted(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentTypeMutRef::V0(v0) => v0.documents_transferable(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index 57e19c90144..c5770296685 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -47,6 +47,9 @@ pub trait DocumentTypeV0Getters { /// Returns the documents mutable flag of the document type. fn documents_mutable(&self) -> bool; + /// Returns the documents can be deleted flag of the document type. + fn documents_can_be_deleted(&self) -> bool; + /// Returns the documents transferable flag of the document type. fn documents_transferable(&self) -> Transferable; diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index b1d57ced324..ad0cb272b3e 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -63,6 +63,10 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.documents_mutable } + fn documents_can_be_deleted(&self) -> bool { + self.documents_can_be_deleted + } + fn documents_transferable(&self) -> Transferable { self.documents_transferable } diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index dc5962bb5cd..93544fc1d3f 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -199,6 +199,8 @@ impl ErrorWithCode for StateError { Self::DuplicateUniqueIndexError { .. } => 40105, Self::InvalidDocumentRevisionError { .. } => 40106, Self::DocumentTimestampsAreEqualError(_) => 40107, + Self::DocumentNotForSaleError(_) => 40108, + Self::DocumentIncorrectPurchasePriceError(_) => 40109, // Identity Errors: 40200-40299 Self::IdentityAlreadyExistsError(_) => 40200, diff --git a/packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs b/packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs new file mode 100644 index 00000000000..5e726c5cbef --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs @@ -0,0 +1,58 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::fee::Credits; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("{document_id} document can not be purchased for {trying_to_purchase_at_price}, it's sale price is {actual_price} (in credits)")] +#[platform_serialize(unversioned)] +pub struct DocumentIncorrectPurchasePriceError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + document_id: Identifier, + + trying_to_purchase_at_price: Credits, + + actual_price: Credits, +} + +impl DocumentIncorrectPurchasePriceError { + pub fn new( + document_id: Identifier, + trying_to_purchase_at_price: Credits, + actual_price: Credits, + ) -> Self { + Self { + document_id, + trying_to_purchase_at_price, + actual_price, + } + } + + pub fn document_id(&self) -> &Identifier { + &self.document_id + } + + pub fn trying_to_purchase_at_price(&self) -> Credits { + self.trying_to_purchase_at_price + } + + pub fn actual_price(&self) -> Credits { + self.actual_price + } +} + +impl From for ConsensusError { + fn from(err: DocumentIncorrectPurchasePriceError) -> Self { + Self::StateError(StateError::DocumentIncorrectPurchasePriceError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs b/packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs new file mode 100644 index 00000000000..1304477355f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs @@ -0,0 +1,37 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("{document_id} document not for sale")] +#[platform_serialize(unversioned)] +pub struct DocumentNotForSaleError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + document_id: Identifier, +} + +impl DocumentNotForSaleError { + pub fn new(document_id: Identifier) -> Self { + Self { document_id } + } + + pub fn document_id(&self) -> &Identifier { + &self.document_id + } +} + +impl From for ConsensusError { + fn from(err: DocumentNotForSaleError) -> Self { + Self::StateError(StateError::DocumentNotForSaleError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/document/mod.rs b/packages/rs-dpp/src/errors/consensus/state/document/mod.rs index 2469345323f..36621070ab8 100644 --- a/packages/rs-dpp/src/errors/consensus/state/document/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/document/mod.rs @@ -1,4 +1,6 @@ pub mod document_already_present_error; +pub mod document_incorrect_purchase_price_error; +pub mod document_not_for_sale_error; pub mod document_not_found_error; pub mod document_owner_id_mismatch_error; pub mod document_timestamp_window_violation_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index a8379044b93..a71511e45ba 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -28,6 +28,8 @@ use crate::consensus::state::identity::{ }; use crate::consensus::ConsensusError; use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use crate::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; +use crate::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; @@ -55,6 +57,12 @@ pub enum StateError { #[error(transparent)] DocumentNotFoundError(DocumentNotFoundError), + #[error(transparent)] + DocumentNotForSaleError(DocumentNotForSaleError), + + #[error(transparent)] + DocumentIncorrectPurchasePriceError(DocumentIncorrectPurchasePriceError), + #[error(transparent)] DocumentOwnerIdMismatchError(DocumentOwnerIdMismatchError), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs index d0891ffe9b5..3813405201c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs @@ -26,10 +26,10 @@ impl DocumentDeleteTransitionActionStructureValidationV0 for DocumentDeleteTrans )); }; - if !document_type.documents_mutable() { + if !document_type.documents_can_be_deleted() { Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} is not mutable and can not be deleted", + "documents of type {} can not be deleted", document_type_name )) .into(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index c96ec40cdf0..05ede54a775 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -62,18 +62,6 @@ pub(super) fn data_trigger_bindings_list_v0() -> Result = document + .properties() + .get_optional_integer("$price") + .expect("expected to get back price"); - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + assert_eq!(price, None); - // We expect the sender to have 1 document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + assert_eq!(document.owner_id(), purchaser.id()); - assert_eq!(query_receiver_results.documents().len(), 0); + // At this point we want to have the sender to try to buy back the document - document.set_revision(Some(2)); + document.set_revision(Some(4)); - let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( - document.clone(), - card_document_type, - dash_to_credits!(0.1), - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for the update price"); + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + identity.id(), + dash_to_credits!(0.1), //same price as old requested + &key, + 4, // 1 because he's never done anything + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!( + consensus_error.to_string(), + "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document not for sale" + ); + } - let documents_batch_transfer_serialized_transition = - documents_batch_update_price_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + #[test] + fn test_document_set_price_and_purchase_with_enough_credits_to_buy_but_not_enough_to_pay_for_processing( + ) { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let transaction = platform.drive.grove.start_transaction(); + let mut rng = StdRng::seed_from_u64(433); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default_with_time(50000000), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let platform_state = platform.state.load(); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - assert_eq!(processing_result.invalid_paid_count(), 0); + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - assert_eq!(processing_result.valid_count(), 1); + assert!(!card_document_type.documents_mutable()); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6816550); + let entropy = Bytes32::random_with_rng(&mut rng); - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), ) - .expect("expected query result"); + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); - // We expect the sender to still have their document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - assert_eq!(query_receiver_results.documents().len(), 0); + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - // The sender document should have the desired price + assert_eq!(query_receiver_results.documents().len(), 0); - let mut document = query_sender_results.documents_owned().remove(0); + document.set_revision(Some(2)); - let price: Credits = document - .properties() - .get_integer("$price") - .expect("expected to get back price"); + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - assert_eq!(dash_to_credits!(0.1), price); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - // At this point we want to have the receiver purchase the document + assert_eq!(processing_result.invalid_paid_count(), 0); - document.set_revision(Some(3)); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( - document.clone(), - card_document_type, - receiver.id(), - dash_to_credits!(0.1), //same price as requested - &recipient_key, - 1, // 1 because he's never done anything - 0, - &recipient_signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for the purchase"); + assert_eq!(processing_result.valid_count(), 1); - let documents_batch_purchase_serialized_transition = documents_batch_purchase_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6822950); - let transaction = platform.drive.grove.start_transaction(); + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_purchase_serialized_transition], - &platform_state, - &BlockInfo::default_with_time(50000000), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + assert_eq!(query_receiver_results.documents().len(), 0); - // nothing can go through because the purchaser doesn't have enough balance + // The sender document should have the desired price - assert_eq!(processing_result.invalid_paid_count(), 0); + let mut document = query_sender_results.documents_owned().remove(0); - assert_eq!(processing_result.invalid_unpaid_count(), 1); + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); - assert_eq!(processing_result.valid_count(), 0); + assert_eq!(dash_to_credits!(0.1), price); - assert_eq!(processing_result.aggregated_fees().processing_fee, 0); - } + // At this point we want to have the receiver purchase the document - #[test] - fn test_document_set_price_on_not_owned_document() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game_nft(TradeMode::DirectPurchase); + document.set_revision(Some(3)); - let mut rng = StdRng::seed_from_u64(433); + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let platform_state = platform.state.load(); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + // nothing can go through because the purchaser doesn't have enough balance - let (other_identity, other_identity_signer, other_identity_key) = - setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + assert_eq!(processing_result.invalid_paid_count(), 0); - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); + assert_eq!(processing_result.invalid_unpaid_count(), 1); - assert!(!card_document_type.documents_mutable()); + assert_eq!(processing_result.valid_count(), 0); - let entropy = Bytes32::random_with_rng(&mut rng); + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + } - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set("attack", 4.into()); - document.set("defense", 7.into()); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + #[test] + fn test_document_set_price_on_not_owned_document() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let mut rng = StdRng::seed_from_u64(433); - let transaction = platform.drive.grove.start_transaction(); + let platform_state = platform.state.load(); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - assert_eq!(processing_result.valid_count(), 1); + let (other_identity, other_identity_signer, other_identity_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - document.set_revision(Some(2)); + assert!(!card_document_type.documents_mutable()); - document.set_owner_id(other_identity.id()); // we do this to trick the system + let entropy = Bytes32::random_with_rng(&mut rng); - let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( - document.clone(), - card_document_type, - dash_to_credits!(0.1), - &other_identity_key, - 1, - 0, - &other_identity_signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for the update price"); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let documents_batch_transfer_serialized_transition = - documents_batch_update_price_transition + let documents_batch_create_serialized_transition = documents_batch_create_transition .serialize_to_bytes() .expect("expected documents batch serialized state transition"); - let transaction = platform.drive.grove.start_transaction(); + let transaction = platform.drive.grove.start_transaction(); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default_with_time(50000000), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + document.set_owner_id(other_identity.id()); // we do this to trick the system + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &other_identity_key, + 1, + 0, + &other_identity_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - assert_eq!(processing_result.invalid_paid_count(), 1); + assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - assert_eq!(processing_result.valid_count(), 0); + assert_eq!(processing_result.valid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); - let query_sender_identity_documents = DriveQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); - let query_sender_results = platform - .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); - // The sender document should not have the desired price + // The sender document should not have the desired price - let document = query_sender_results.documents().first().unwrap(); + let document = query_sender_results.documents().first().unwrap(); - assert_eq!( - document - .properties() - .get_optional_integer::("$price") - .expect("expected None"), - None - ); + assert_eq!( + document + .properties() + .get_optional_integer::("$price") + .expect("expected None"), + None + ); + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index e6e62116742..96fa641efac 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -15,7 +15,12 @@ use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; +use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; +use dpp::document::property_names::PRICE; use dpp::document::{Document, DocumentV0Getters}; +use dpp::fee::Credits; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::prelude::Revision; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; @@ -580,6 +585,27 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let original_document = validation_result.into_data()?; + let Some(listed_price) = original_document + .properties() + .get_optional_integer::(PRICE)? + else { + result.add_error(StateError::DocumentNotForSaleError( + DocumentNotForSaleError::new(original_document.id()), + )); + return Ok(result); + }; + + if listed_price != document_purchase_transition.price() { + result.add_error(StateError::DocumentIncorrectPurchasePriceError( + DocumentIncorrectPurchasePriceError::new( + original_document.id(), + document_purchase_transition.price(), + listed_price, + ), + )); + return Ok(result); + } + if validate_against_state { //there are situations where we don't want to validate this against the state // for example when we already applied the state transition action diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json index 19bf751a6e7..aa852c13bbe 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json @@ -7,6 +7,7 @@ "card": { "type": "object", "documentsMutable": false, + "canBeDeleted": false, "transferable": 1, "properties": { "name": { diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json index b14e8fe5adc..88a6c22aa98 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json @@ -7,6 +7,7 @@ "card": { "type": "object", "documentsMutable": false, + "canBeDeleted": false, "transferable": 1, "properties": { "name": { diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json new file mode 100644 index 00000000000..3a1c2daeccd --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json @@ -0,0 +1,135 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": true, + "transferable": 1, + "tradeMode": 1, + "creationRestrictionMode": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json index 7e406bc8c7c..0dbc7641d5a 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json @@ -7,6 +7,7 @@ "card": { "type": "object", "documentsMutable": false, + "canBeDeleted": true, "transferable": 1, "tradeMode": 1, "properties": { diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json new file mode 100644 index 00000000000..1011c390f05 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json @@ -0,0 +1,234 @@ +{ + "$format_version": "0", + "id": "8MjTnX7JUbGfYYswyuCtHU7ZqcYU9s1fUaNiqD9s5tEw", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "profile": { + "type": "object", + "indices": [ + { + "name": "ownerId", + "properties": [ + { + "$ownerId": "asc" + } + ], + "unique": true + }, + { + "name": "ownerIdUpdatedAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "avatarUrl": { + "type": "string", + "format": "uri", + "maxLength": 2048, + "position": 0 + }, + "publicMessage": { + "type": "string", + "maxLength": 140, + "position": 1 + }, + "displayName": { + "type": "string", + "maxLength": 25, + "position": 2 + } + }, + "required": [ + "$createdAt", + "$updatedAt" + ], + "additionalProperties": false + }, + "contactInfo": { + "type": "object", + "indices": [ + { + "name": "ownerIdKeyIndexes", + "properties": [ + { + "$ownerId": "asc" + }, + { + "rootEncryptionKeyIndex": "asc" + }, + { + "derivationEncryptionKeyIndex": "asc" + } + ], + "unique": true + }, + { + "name": "owner_updated", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "encToUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "rootEncryptionKeyIndex": { + "type": "integer", + "position": 1 + }, + "derivationEncryptionKeyIndex": { + "type": "integer", + "position": 2 + }, + "privateData": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 2048, + "position": 3, + "description": "This is the encrypted values of aliasName + note + displayHidden encoded as an array in cbor" + } + }, + "required": [ + "$createdAt", + "$updatedAt", + "encToUserId", + "privateData", + "rootEncryptionKeyIndex", + "derivationEncryptionKeyIndex" + ], + "additionalProperties": false + }, + "contactRequest": { + "documentsMutable": true, + "canBeDeleted": false, + "requiresIdentityEncryptionBoundedKey": 2, + "requiresIdentityDecryptionBoundedKey": 2, + "type": "object", + "indices": [ + { + "name": "owner_user_ref", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + }, + { + "accountReference": "asc" + } + ], + "unique": true + }, + { + "name": "ownerId_toUserId", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + } + ] + }, + { + "name": "toUserId_$createdAt", + "properties": [ + { + "toUserId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "$ownerId_$createdAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "toUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "encryptedPublicKey": { + "type": "array", + "byteArray": true, + "minItems": 96, + "maxItems": 96, + "position": 1 + }, + "senderKeyIndex": { + "type": "integer", + "position": 2 + }, + "recipientKeyIndex": { + "type": "integer", + "position": 3 + }, + "accountReference": { + "type": "integer", + "position": 4 + }, + "encryptedAccountLabel": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 80, + "position": 5 + }, + "autoAcceptProof": { + "type": "array", + "byteArray": true, + "minItems": 38, + "maxItems": 102, + "position": 6 + }, + "coreHeightCreatedAt": { + "type": "integer", + "minimum": 1, + "position": 7 + } + }, + "required": [ + "$createdAt", + "toUserId", + "encryptedPublicKey", + "senderKeyIndex", + "recipientKeyIndex", + "accountReference" + ], + "additionalProperties": false + } + } +} diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json new file mode 100644 index 00000000000..bda8b4f7293 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json @@ -0,0 +1,234 @@ +{ + "$format_version": "0", + "id": "8MjTnX7JUbGfYYswyuCtHU7ZqcYU9s1fUaNiqD9s5tEw", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "profile": { + "type": "object", + "indices": [ + { + "name": "ownerId", + "properties": [ + { + "$ownerId": "asc" + } + ], + "unique": true + }, + { + "name": "ownerIdUpdatedAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "avatarUrl": { + "type": "string", + "format": "uri", + "maxLength": 2048, + "position": 0 + }, + "publicMessage": { + "type": "string", + "maxLength": 140, + "position": 1 + }, + "displayName": { + "type": "string", + "maxLength": 25, + "position": 2 + } + }, + "required": [ + "$createdAt", + "$updatedAt" + ], + "additionalProperties": false + }, + "contactInfo": { + "type": "object", + "indices": [ + { + "name": "ownerIdKeyIndexes", + "properties": [ + { + "$ownerId": "asc" + }, + { + "rootEncryptionKeyIndex": "asc" + }, + { + "derivationEncryptionKeyIndex": "asc" + } + ], + "unique": true + }, + { + "name": "owner_updated", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "encToUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "rootEncryptionKeyIndex": { + "type": "integer", + "position": 1 + }, + "derivationEncryptionKeyIndex": { + "type": "integer", + "position": 2 + }, + "privateData": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 2048, + "position": 3, + "description": "This is the encrypted values of aliasName + note + displayHidden encoded as an array in cbor" + } + }, + "required": [ + "$createdAt", + "$updatedAt", + "encToUserId", + "privateData", + "rootEncryptionKeyIndex", + "derivationEncryptionKeyIndex" + ], + "additionalProperties": false + }, + "contactRequest": { + "documentsMutable": false, + "canBeDeleted": true, + "requiresIdentityEncryptionBoundedKey": 2, + "requiresIdentityDecryptionBoundedKey": 2, + "type": "object", + "indices": [ + { + "name": "owner_user_ref", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + }, + { + "accountReference": "asc" + } + ], + "unique": true + }, + { + "name": "ownerId_toUserId", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + } + ] + }, + { + "name": "toUserId_$createdAt", + "properties": [ + { + "toUserId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "$ownerId_$createdAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "toUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "encryptedPublicKey": { + "type": "array", + "byteArray": true, + "minItems": 96, + "maxItems": 96, + "position": 1 + }, + "senderKeyIndex": { + "type": "integer", + "position": 2 + }, + "recipientKeyIndex": { + "type": "integer", + "position": 3 + }, + "accountReference": { + "type": "integer", + "position": 4 + }, + "encryptedAccountLabel": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 80, + "position": 5 + }, + "autoAcceptProof": { + "type": "array", + "byteArray": true, + "minItems": 38, + "maxItems": 102, + "position": 6 + }, + "coreHeightCreatedAt": { + "type": "integer", + "minimum": 1, + "position": 7 + } + }, + "required": [ + "$createdAt", + "toUserId", + "encryptedPublicKey", + "senderKeyIndex", + "recipientKeyIndex", + "accountReference" + ], + "additionalProperties": false + } + } +} diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs index 7eb61ca5fb4..1adaab41ae1 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs @@ -49,7 +49,7 @@ impl Drive { ) -> Result, Error> { let mut batch_operations: Vec = vec![]; - if !document_type.documents_mutable() { + if !document_type.documents_can_be_deleted() { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "this document type is not mutable and can not be deleted", ))); From a7aad9a55aeb5aa25fc861216e748e2945aed4b8 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 07:04:18 +0700 Subject: [PATCH 37/65] another fix --- packages/wasm-dpp/src/errors/consensus/consensus_error.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index a1d4acf447f..4f39880387c 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -65,6 +65,8 @@ use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLe use dpp::consensus::basic::document::{DocumentCreationNotAllowedError, MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use dpp::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; +use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use dpp::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; @@ -229,6 +231,12 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::DocumentTypeUpdateError(e) => { generic_consensus_error!(DocumentTypeUpdateError, e).into() } + StateError::DocumentNotForSaleError(e) => { + generic_consensus_error!(DocumentNotForSaleError, e).into() + } + StateError::DocumentIncorrectPurchasePriceError(e) => { + generic_consensus_error!(DocumentIncorrectPurchasePriceError, e).into() + } } } From be32222c092f2bd2f9deb541dbb348c678a03230 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 07:56:32 +0700 Subject: [PATCH 38/65] more fixes --- .../rs-dpp/src/data_contract/config/mod.rs | 6 ++++ .../rs-dpp/src/data_contract/config/v0/mod.rs | 3 ++ .../data_contract/extra/drive_api_tests.rs | 6 ++++ .../rs-drive/tests/deterministic_root_hash.rs | 2 +- packages/rs-drive/tests/query_tests.rs | 33 ++++++------------ ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74128 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24209 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74128 -> 0 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 24209 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74128 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24209 -> 0 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 24335 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 8837 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74128 -> 0 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 22299 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74128 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 8837 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 75594 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 8690 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19700 -> 0 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 1466620 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19700 -> 0 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 21205 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19700 -> 0 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 2668626 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19700 -> 0 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 2437729 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19700 -> 0 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 2425355 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 10644 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 18554 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 13407 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 14334 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 22156 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 22156 -> 0 bytes ...cdc46e3cf0d7d4ce093bba24086e17410ed7d.json | Bin 28889 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 8229 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...106e5eda740be44679cc960ea35f2134af628.json | Bin 10897 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 10645 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 11313 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 11003 -> 0 bytes ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - 66 files changed, 27 insertions(+), 48 deletions(-) delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.791831000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.791314000Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.792844000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-20T17:32:57.733023000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.792219000Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-20T17:32:57.732964000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-20T17:32:57.729112000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.792584000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-20T17:32:57.825471000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-20T17:32:57.819765000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-20T17:32:57.844598000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-20T17:32:57.853232000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-20T17:32:57.858773000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json diff --git a/packages/rs-dpp/src/data_contract/config/mod.rs b/packages/rs-dpp/src/data_contract/config/mod.rs index 56febc24857..aa4a4ef036b 100644 --- a/packages/rs-dpp/src/data_contract/config/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/mod.rs @@ -163,6 +163,12 @@ impl DataContractConfigSettersV0 for DataContractConfig { } } + fn set_documents_can_be_deleted_contract_default(&mut self, value: bool) { + match self { + DataContractConfig::V0(v0) => v0.documents_can_be_deleted_contract_default = value, + } + } + fn set_documents_mutable_contract_default(&mut self, value: bool) { match self { DataContractConfig::V0(v0) => v0.documents_mutable_contract_default = value, diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 59b574920ae..0bc5c68f6ce 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -83,6 +83,9 @@ pub trait DataContractConfigSettersV0 { /// Sets whether documents in the contract are mutable by default. fn set_documents_mutable_contract_default(&mut self, value: bool); + /// Sets whether documents in the contract can be deleted by default. + fn set_documents_can_be_deleted_contract_default(&mut self, value: bool); + /// Sets Encryption key storage requirements. fn set_requires_identity_encryption_bounded_key( &mut self, diff --git a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs index 96f64606a9a..e1cd6308ce0 100644 --- a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs +++ b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs @@ -217,6 +217,9 @@ mod test { contract .config .set_documents_mutable_contract_default(false); + contract + .config + .set_documents_can_be_deleted_contract_default(false); contract .config .set_documents_keep_history_contract_default(true); @@ -265,6 +268,9 @@ mod test { contract_v0 .config .set_documents_mutable_contract_default(false); + contract_v0 + .config + .set_documents_can_be_deleted_contract_default(false); contract_v0 .config .set_documents_keep_history_contract_default(true); diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index e0385745739..fa6ecc90918 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -446,7 +446,7 @@ fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { .unwrap() .expect("should return app hash"); - let expected_app_hash = "8880c628746348b09621b00589ccf856f75634388436a105473eb4506bb7e85e"; + let expected_app_hash = "fa23fefadd8b0254b9e4c594f09026c070148f5de9c39ff9ea227a327761e062"; assert_eq!(hex::encode(app_hash), expected_app_hash); } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index a696c6df347..868f9e4b9cf 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,8 +993,7 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, - 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2452,8 +2451,7 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, - 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3017,8 +3015,7 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, - 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3166,8 +3163,7 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3718,8 +3714,7 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3812,8 +3807,7 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3906,8 +3900,7 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4000,8 +3993,7 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4192,8 +4184,7 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, - 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4393,8 +4384,7 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, - 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95 ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4598,8 +4588,7 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, - 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95 ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74128 zcmeI*-Ethqk%r+t)>SZYya%Ypzi-9iV9+AhWLOft6y=Bw2k(6`04X+}x2*yUkOHXj zfy|ld%F3TFzs#)e8T{+JXU`7)`Rd)zZ{GfN@TX`0x_r5NzeD@$T(EUtI?3{kvaYU48iB^1mOx`|#a=eYcD1EXY5;djI0( zi}x>9fxlez`qi7iy?%fB-oeq)!KbY*-~ayYyI0S@fBoXkPtSjN`~BZvy?p-bmE+`O z<*$QR|9JcT>q`MEM<2X@^W&@MKmNQEJI=<@>Cy4g*;oz_*E?LA^ZxDkZ-03H8Jw#i z9$fEzh0KGOFMfXg%%?>VkEaU%j!;^y@2DsNcPDBjc~$SZDq2jdkW< zU4Voe3~+V9ngw=mj5QPN-dJbb^#!ZEym~|5t}^fH^EEr{-dHol?zPvinPT_3>(`92 z`+UtByVp0Ew3G>Xe5%+d7^_p0Gvae z7gZc=Fb=(fEtIIy()c)Zg*#k;_Ytj80cg#=IFcYbK02u6Fd_7$`G8;fSfVjK#6gjx z)1oj=bH`!iv&B%UY@wEk+!;z_k9C86oe{v#tRLCa*q(tm_bfo!avY*{T$jWr*dwkp zOXB_JU1eZcao+&JnSvI*)7wBN_(jfdY-)Be1&)nYgJJ59XdO2Qk#ho=P2>BB3=AbL z%hQ*r4);$lp$$#dF#t;5Oe}sIL6Yi|LC}{cnfpe<$Vwi=DjGy5(VQzrWF$?3OuDCb)F?8zP#2nO^o^f2#?E#$cK>|oO5lmK0`10&)v9N8MMj_;z=^?GXZl3Rf zTM{_uswXoHOyI%C;mPz90>(^F&a{3+1g!Tpc=8KiXwQnf0<=5-Vmx>{xdT}Wen=us zBA?4TcR!<$%q=)G+&r^^MpawWB3U zd6s@bG`!oQk~z#z@bQ}qF33A?gLwT3ZuG9mqgPmiG$1$e;t@jRJsIzJjrFqzJF0v1 zF4865#xlLrtmO?rn8w~Sl#S^Soc1nNIK(Ljo~EzAt5Ig+4@%wH@V-YTlBMi<0EXPzs*4C`1>~O7J+?lyPMlC|F_W=(nw^qvAz23YM3tJ zo9S(bv&lEo+}e6}w3s1e*b=qJNYDa6B?3nwnbC5g5>HM?@S<530f*`xuU7S+&&|%iQ_nu^9nB`<)&8DZI|*0aPB${& z#X?QtR{F=z|A0c`$|SE9qlSSA)t*1uHtsvAYg)T++dJ!|%qq)4IL@>2CNizVMzA%? zO}@rS&i%jN;!OZMAgEopX!O|Mm)b%8@=P?Iu@sb0tZBm7;}h>o*^7;ZaJk^gJ#+Ku z6;6me;_=52Y{#wV`{$_WxjH&ddqeN$--66LeM*eB$<%(U13Wr2Dg|l(9Mwl&ZM4(1 z<9i~*OG&o#D&jWK!|d1@7#`j@_g1Tx4>rkU&?yGlhh)e>me`}3Y{rnKT=({N4p16!#W%e#Ce7C zY_7}9TWHU;NSh`WZ!u;~4Fg6SX$_C)oBJ!3sxvUDSl3DCxpkk6c+x?d25doiERk&^qD2d>HsFZ=Yz4K$JK>S&1s<(W1!}ee z6;Ll=QjSxU;0`@co8)YmWdkr0gW=W;d7vVNgJ$iY_uEyddPQ2Yl4M2eThdCIf;eY_ zhI@YJvTA|Kq+$!RrbewGxq1f3sG**fptGbcS2Ptk+nSM9a>oVngBNI&=d0luZP=)n z`py1@g278i!#Jt2c7x)2S_lo5W6t;r&j2Qx8#i`@SkHB0s^I|VcYk!rX68{md01Rh zEk%00?M=}Q_uri#9ZZvv)eFVv^cUO1(rS@SlT@>>@6>(CIw#4N0*~UWmUvfBSClP) zfAo&?LIvVId&1g&Uc0p-rzR0$R~0jE@dYdY3&f{;k%(aSnsZl3lc5#gjKJi?q_ zpv2%w_UI9ac`}_8x(AL>sTS~jSD@jza~ns5^;8U3%bFzMVbGeFF`|*Ct$u_y zbW}5veKHR(Zs0FhL@1si67Y%{lG<)NQ7mZ1Es9=@K*@)&Tg#kr?$4+Jb#4~vnmSMS zM&>kov!dB+%q6jkNIYgDHkynq0ho1$R2jYWR(37+oaw?`IwMV8!3bNqg=WOiYMCUS zI!|a>-c<^nl^@Wgl!ngYIJU5Hm0CJ1yTTpnH&>uSMt~TRSgB%%Fc ze&0M_!7D>5$(}MuV0gK2p0AU(bvra%vWGT_1fQDr0>1SsbzX^zNbfLjPx4DDrrpNz z!-P%F;f{?#8BbMjQ0gD>4jr{rXA4B;-lG2R9@9cSMaZ#@mZdl+PByXCifE)XPerzA z(VG>KO@(G))b48P&U{}nDcN1bo>4ca^lzbP?;}py(M3)D`4D6yo%on>&NyyisX;8i z824OZUAG*mmfwK$`nt*_b46MWLE?gqM?W=F5h2CO6x~y`>6kWP1$IjX?y1^yE$@B@ zsn|9JlMYVRHAE3JRHe>EqSq+t4#`SF>K zF~WBz3iIhvJa@GL5z|M#^+bUwTeaxf$xIV$j_s(W7JbwpU4^EWMuC6s1Y0LVB{l@< zxH75ccAH5&-Q$r^$yAN~(Z}UqKD+rAA%)lw#&F`b(QwVa>RxQ?eOtr?T;xWpthh5! z3rsgH7kx7a9fmODm8TLRu=6A>+_Et!81_OdGMEn1bqBw*d*W7mpgCrq3Anv&_l-J6 zKRwQ2(>j6H#wx*VcPPx87*mMKE6Js*f!S@@^G3VT zQ+Jw@(=bO3&u=o;#XX7;IaBn`1Z+$xz@}RyK&)`j;Qx{G-wBysJG8uA6O5HXN13x} ztKJueWm&?}ycfAAoLs5oFgv1EXx1j{-i}CWY?wv-@^z@#m6BD4!=ih&8;ldH*3i^;}=2UQ`P!XGDa+3{XdD2QwN!0Ja{a9E0EJ`8YZe8OO&Xnr4Yu-iYNw z>+V&pYET3IAde)?o9Ou$e>bvFzBUU(gwB8#Hlic@OvBkEp0eWOtc~e3OgKFieoHL! zOlYfXGVtC3Hic2!4XwQfyyPc>l%U^)RHmC0u#McI{;OqC80PX8P+LvQq zct2puhaKH!N~fAlNjgfDebBpEtZx&J`{V9QJnSLw?i<84xsVQFoAz2Q=hjY&lDHvX zc=6L@I}cf6dIv3 zOQh-O9cO82N|+*x{Amm`RAf^--RSKe4RU;?sg-%xsJ9}`P!Q)$L#&oc@biu1%9&E_ zjD%GSX}s$af3HzJZ}A8XnXZJ#VrlhCVhgN#k1j7VGmqGqWW@ty$VO68q`Ir7n%Z4~ z>9=WcsfE=u#+zqRW7?D{vUkK1cAS+JD%Gc+1WH7xcG+0k+sNgaJ9U;E)NV-2ToL9x zq^(XdobkyY_*lU39Mfs|xqsd_uB9<`{Y?Io3593LqVzUYM2;sFzQ!?x0ZPx7dlE^n z=pC8z-$vH}_bZ~K@~pz=Y|v^_sI|>zlLS>YWT;b<>r0pPbk&Fp z5^%TJI0B91up)oOcYVo*?X%xn3vRDl27D@=3vZsDNqcg}JN&Y01jJ- z&@PD`l@Sm_L33WaBVfRjfJrR$WL%vJ5)pBO;rtqn-NQqM)Qe-{Iol~9C=}XUiO~`i zI(4Q_EL7^|y|BPT75XedYK4f)lIZkB(gey-D}oUaCz`1iN{EQq`84yu5+rW%L-64B zA+R|>*aFUMCPoL|$cpI1j$}=mldPYDA-`_YB)GHEXgPsACU)8@-M|LDQ*NxA0_td< zk+vCe(3+PqqLF_5HY6X~d5{6=LpLTDmsBX8ArgF=N+H@LyLo4m<~b=*M55$F*sW#f zKz81}Sjj^d>7mS%z}_^Op8tARZhG7c+f;)D7~gkA*nm9(2}KkUD&aWdisb*4m^1a= zLd2bOOG9(Ym?J7zsFk1R@Rj`a`e5|#B~6jJtD(+ub&gXu{6aQ%Q-YCAlYBx#k&z(i zqV`OJpVtv(=j0BKh?cQ4>}hA0e4HAV3+4f6%Vo3TncqF z&?VtVQ#7P(m$Y$iG-c4a_hcXS3=e2nOjknZ9=Rq1VNEsas+G>Dg_WT0?_qu-m(=n! z3=QcN|5N`z#1yDrqGF!wN|>+6y_6c#6rpxDwQUNVH4_p7z?iqB^ErYR#{zFIK1sPm z2M)3qze-}g9*dhEc|faLi+hwN(K}yf&J!#*PtUCn!#|}+tj^i*0?!YBMKj@%q7xU{#$K^YoLhPnn#xeXjd07qdlV=81lR8d>s9(qRP*}(oAV^$JRMT7>HZ2w_m9+P+X9%Yt9X{I|ei)e{2slP93*E`$ zXdA{!qKKKrKg7Ar{?z(%Y`W^Y;S+Yt)Oiy+Quif^u&I4P zW)BH@u|pqc8j@JpYmi;1Qk&&6C@m-^Y5QzEOwOBt5wGx7X0e;A zaj<1}oZ`^o-=$7V8ocHJYcXpr4~uVDuv!7}QTh`zK*kfS!zsg>Hzd&j$GO@0VA?9c z+9Sx5?ZyR#+AoDHwkv5L(<=<&48BCa4eDa7{G!R?7p%mf{Argh!hNj)!{1=f8A?`Y zl;|;(ZP8>hNqwA?iFrWPLS>FfjcpT%Tss+Oca`p#McSp8xk)ziyFcEcn>%*g;)Db% zhknbkGhK)k!mN|L%7_RI7|haPn%W1YX)#b9R;c6Rf;@pzFholeH)@Z}bY@!1@pqpN zo1Z=V%Ni^P|NG0^cfb7j{Pl~UUmyJG*`HU}J$u%Z)d+THfs+m>-6@^L$eBa#@&~@2 zF$l#)t?aTF$DTCi=}wm(GQ%v(LPz7EJj~1C96VfNlB7E34>e`xNZ)G+v*~3uTfyQc ze13lOx1V0T|K;7Qg2ywo=q~*)rdK*}xj2pMIkjA7bykW1Gdj1%>;=SHj_It+%MpmT z=^A$Y9=he;LK^(QIo)K>OVG+BOBTkJ+F>+DqL))1bg?$ch5X?B9bn}{747k zxj`u1E+x38nzxCzg*959+9YL%ztR&WC8xzR0L@INK7?Ix8O$)`ZKH$97#Z=VUr4q&DtiLR;{}xXl ed)@c{_m5q>G7e9Fz4F7ye_j9o?!O2YZzevIGdr5C@UWNM}F!TK0Na>o7TP&!Uij!jmu(s zBLm-gKd;}<>qS}V;J6$uXTDg}AKF!`i{4!=|B=7UmeZhx?vpn6JY6obi>cS^7uB*Y z*vn;J`TEJ&o|7+b-YZ7c&3s{Md{{1vu^)fvgIvXOI&Cecd(R`k_nv5kpH{Zm+Q+TV zl&=b3J&7hddhhbV*$372^`I!;eLQ}4d2*SJhi9ilm*<~-`qlB5qvi3xzWCrMf94;r zO;nF2ewLXg>W+xLwGN)e@i5pR#SAenXIUN~vOZ(y7B_QmXL{wux888IUZ;)Z#W)}N zFu~VxB>`?p>(+48E3#RfI0;R!+9tRD4RQiVHKnhqbEzgs75WZW}TXXY1MorHON%OZcd3_=7f zwXWYR&yyEbYNG&+1=uRdK>MT~ym9 zo6jvP_BwiQTdFsW$Zb1FH2K;|>P3|oSF*rtvG7$4z5o6?JNV(j!B_o*vlrWs2QPl? zzkTd}+Mapw7AKkI#YeulT1*UB1K?toeZLty=HR@n^ANJ^zCP|7`+8L6F`xyXX*?*2 zYdlQ+;niVs|6zG?|FG>z9Tc~maP2Q`b(u4~k!B{}9(*@DDCP%0tn|}4(b7`q{0?2c zrao4YwuuHN>@E68EaO>-w)B-O%4Ax;^3^D-ePY=)2_FvfqV`45^tDf#2vGRCPOdFP zS!Oo%9EWD~#27ZW?z-;6r@WKWyftXJ8>CzEnk zURBwAk{F`0(RXVjUGy*R6EAO#%2`N{!LU!4^&+|OiGR7wreVg##5ZP6@?yJ~y%Nq= z_une%EhuS%eF4hW1KUbBERB*osJG9ur>+i$)qCxNUK5xG5tBw<9 zMdH6Va%&l54HOF|el}m+1Rot4EjFLe?DIUC`fER3UG)pyH2J$x?HB<<#Sr3JtQe9= zH!YSG>nHQM^=%$rd1D&BdX`1jy$7dRRb@9+)y2)iKZpYjV}gHK-g~m}vp_Qk^gZ+0 zy<@GkcZ4Z{vmkS_tStarFbt7#zFLgwyD2gD=f4%hGU4_tS!i?Q3wsGh9Nk0Lx=-lv zj$Mk47u>Ggc*!jaZpQa3IgYm!jX)5G1HLQ`J@w-}`)pN9Wb^qnAH}Trm+vDxJsi*H zhj}csE^}W2BXJ^FZB6=;Cy#=+Sayph+&WHU$$XYoH!%Q5)2{E@^?*Aw<{A!-tF%E8 z1ndx_Mq&%~N>G3QW&|yYYx&L0X#6RwqXFv}?}J(YmsZ>q1UqcnGhg|nU8X`)Jqt*; zj<$C0LI)6NW?{zVYUXlfg%@0NuX9agn38v1AwL~3c0S{z$f)QM5kW#!EU zvPBYFE%uL38h^8F(?qc(uNxmaNLJY@OTO6^i@r%LPp!s)?{C^((ea30y}W4X(5K63 ztns^!u&ES&PQ=Wn#>k(oAJFb;G%AZ~TbCjiWjXa(u`2{1#(Xw0m6WkQO2+;&H%6bl znpkSyCdtjJ>Lz<72d4fT)9zoJ){`AaeFxaC*kDYwyPn>*>o!Tpw#F(un>cZ)O%<|Y z2wM@NgA}D@v2uRUrVOmPqdr<->~~Oav8;34v7_Oyb>lHm3>u9TqmKLmIxpV4Od!VfosgU;! z3fb>mw`L@fUUf#+1f+9vqrS$~Hp_Xjz3Md;*@-nz3UhoTdBJ3rzcT7-pR=_&Z^~s- z_zp6&4V5}fK5G*zyK^4GO}M_f!&Z20G$EN~#X(*in7bUz^6_|T1UQzu^iceTT{c_)lqJ>}_ z7q;2NI1ffYk7_V*HVHPuzW2(?ZGS$RW>yx&J&L%dUJPL87dJXG&8^R7juGwHs~1@n zj>6u~y`S#=>0SU^Z@Wp;V6S)GZ~1U<<`-Egs$1vmrist5Cb17U7_?lnXT5n7aAMr; zd|Hma^W*c)m2Nm})w(@DFGr#8+k#kckY#0`!IM}rfW_SbuRO@^<^ML8;` ztE1ZZ-h}&$DepA4JKf=V_`@%OYB{r?&OG&?zr3JIl2NUsdI`A77lW2fyCn zDoE9mARM;V8Anggwn-|U=pLeH#Fjwnz^l_EKH%)6J0lzBCoL^U0gfS23K>lO-5H(3 z6lb_#2oc;dgp_5t)6?!V1~_(jgzG~FcLc8H29Sd5972`Hcx2kAVp4QkQpa_PHTsn5 zhzsE@DdpmE+Q-7Ei6IOq<2ZpsG0q|Lju+i5jPz^N6=VNaN02SNE9yOm9pv;W4}!YjCGfLn?uePdLUB z7}$=WXo=@mLUh;UP7vrI6DGtVS41N)V>u={*T)n%lw|PcGrrM+QYHd1l6VJ081oFPN>vl-T(}U`-wxRN0{>%$e;{qNvn zbSlCzg*yf?!4Xu)aY7=cg;UZD@?0`5D4Nh0zU5ei5rhI5@-6M$z%(Z?wgXe*FqKN3 zI8I0e52-Zz6%rhEdPaPc{5fh}SgUYOYKf&T4K1A{N32NrU@(vfbPB_;Czq!5GHRNN zVBt!?c1JXYv=aM3tYfPRo(=FgiX=XH%0-cQI|9-HFOV>mI_m^C3~@};Ni<{fIOZx@ zz_Yl}J_o#tG6M=!QaXUvQu+j)B&8Nlxds~6QO`t^x*3y~WL?&N#Gk^C0HqgE^C@!~ zGZD}tc!pXC6?QtDazltLoeL5mY1Y8DL?1j33u63N_n}MED7qwKNBJ*fG|eJ+h*mg* zv`>T;lEz5Cew-5DH( zS)OfJ%{9PrN?lV#M@lGl0q-EPkKxUvGOQYeNpq1>t25Ow<5EI)(Af*41SvbcP@+&^ z0wHBQOplOjQdVq^j>hztaurT_Eg>ug05MHXsrA`T@ZyWDgY@aY8Lsi=C^)`D_L#;jE|($ah>8LvxWP$8Uj9YlZN35Rfg z*<%OVx`&X=@$S0`&d(tuCC5|&7GFwQ@W!cNJ zgP~2}&IzCe-85su=0h<{{@@~(!^G7nKDc2<7m$8xc z5{pehntAp1oOSCcX4Y-6?%fp3F@4cfB>ysRC;`S48pOLIIlczU;Fywj2y>Cw=k%Q{ zVJdWahF~W}kKjl;hI2&0AWt4 zp@jQ7nSz*+yw4yZ(UiO(Wf)>W-tpoe7sBe0FK$zL+zpluKSz`*D8U>U+hqTqGO-9G zM-$pd;(=5Moe-~xSFEEDJ1`m3ti1Op8!19bH8OD9K{^vm5As$W6Ba9cN&edVLf~M; zBUl})4CXw?AS%FN*N64Nom2sgNXi<=XeT@HY#PZXm-+*pRK6Ple35RlCzR4wYzU@& zS%Mg3{3OdJ!g(zID4Y6BGjazPMfA{=O40Z&76x^BhgW(>OjL9lhDOI&$ONrShP69| z)-sEsiIDB4Lhcx_8%Q;4*}-PLyvm@PUeudxFM%tvpklly<uZtrHMf_`vRcm0C*hm6{EE45Q_94A zGJzuuNZ2V7hV~qo)}%I<9s{8$uhnpKO7}*%za{KcUY?MBVR?Uzg|dEmhIO#i)^rld zj*gI(nuFoW(S-6)%VvAwQ|DLqwO{*H4h0W;Xd*kq|Bg2RQ86WO>EviLPBNkXzMD)6U&2!mkXK=M0Tir^aATuC%3EUm?^jkv7i-jfK){S5okb(chN znZnc^>q^0;U9h;6slZ8L^tapm7-33nyq%hCAl#B z0<31`Rdg09l1H6ncOffm4+=Mt`cC%ANJfY0-sDn+->2^WVt_H0i|{)G=ehmRz)sG> zkWZe87$ZbhFqg9QQav%%IWkK|GAFpC`-x_ygru`b|B~+oIo8&)Q^pcemQJ#oN>`OJ uS~i)Op~2!Ag@g?=Y2bcKuY2*d;<~G!Sh05P=F0UCBsKrXU+B2^(|-YgjGhPp diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74128 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 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json deleted file mode 100644 index 1325a37dbf1ae244fe10f739c30802fef6748e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24335 zcmeI4U31$;vWEBCzXHW_l`l5Z;eet(_FT!ay>YV6CRR4dN$jIQ-Ror#`1AE{OeaQ&rZL5_Tu}me?0zZ_W85y(~n=gdHm(ki^o?l zJ~_CkhW~haRzE&C8@Q*V)t&a7%lvBnl)Il}qob^N?4S6FpZoC4%WP8nMhF|Md^RqN z$*m0h;Qg%rD6i*brGw*gw3zy0UVma&Eid|Tx%?;oGFwc77P?Pb-}7QI&n_ljub)?o zwqS1-dFAWpV|z|MzkOPas@vJz)cCku6k|XB#0R;G#bnZ2O!uBAe&;>W2)`_Cv9XU^ zo+;lJzIq-_bnx`@^yK5}=4Mb7A3htOT^?O#58?I35NYq?jSbK0G0ao7JOUOR8|kQq$pM^LOW@jf^{H>dgFlqmwXiZ&BoL7D0%B zrPh_5=XamIR?|4EuUBX@(_`lMRZ-s>^Qnlv(S1j#xl4terxvDtf`!1?& zllAA86?+{$w=LD1MC7&|B$|BXB=x+?iz``RHlO<{hTi}EHrxB@bnlz~-pT9D$Gz7- z_dhsvziiIDe#l9tdGR-2T+OcySOefwBhep>3MbE2iC&iO66 zdPjXMBW)86OxQd0kyysF5N+uznU~3=eCw-GR{O-VYZ5-}zZbkpSTMzv!E2o*z!Yq4TT zBHgrDR;-@P=hk<5c;$_0`06Z+ta}Gev#QE&sj7?Hxj&5q4P%0TS>Ag-_tQW#2lPGj z*_~spw0D3hfwLfUvZyTpTQCffakgBH>ANX0cIUq(!!qG^ELmuC;t06pcU-hXcMW4ZZN=Jo{oXo4W`SB3~m*?1gjdN%3I(CJ?Uk&LFcf%;)tSkYls`@Er#CPAc@CaJ}-RYjc`HC


ZDbm-W@i&8F14vb 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 iY2bcKuRHOyQuE=U3H4GygebQbDUPw z*ZmyTOP+O%JOj$QCy7ka$QjD$HVC{>+uTM?2c@(>D%m9y7`c; zxc<7hKKupayyixNeA!(0&lmPoHD3SZGH%Rv-mb%qh+%$U1h>R>sOO3sKb#M-Ey{Mj zM1eg9ywK4MEf$2T`IbHPXz)Tp#e79n-TX$+GhnM0N2tRBHBe)q8a%Sb0yPklG6^y@ z&>?OEB|D?Xf_knqj%)E4o~ zWQ+)gG5W0m=}#d$XD;%41C?mz2)qytbP(fO;v2M^N^FWtW(Y5)h?g$_?fo=NoY7fDniZG8pk&O!UZaj9u<%C9D8r5p%|?9i$csC3Rm_R zN2ytt3TFhFnjoUy!K}+dfCLrHcw$Kg=cxq7EVQ_R2=oEKk06c>V@zSJ1O^}|N}OT! z430FzvQ%K~i6R)Sy@LnP7=)&sWFTd}G3I2aCZ@>L!{=!;-JV5~;XJ=tJd`4FsWjOQ3yB40DygZ?y*L1>A^p0y&u)VQN`7%NB{$DNiC4f^~>U0+yKQav5_W+<-$14?`|wB+_NX z#T!8iFki3<5;=l>e)zNkbj#dG)(EnIdMGOEo4U)WGLL`WX1V#I_~$h3PrJn?4L8$} z5_3p;#Bspfzy`{4B%Q?U};)Mqe#S>*t>94W4#N9kK*K;DckA_8+03-ZH8bBLBL!31iHN|pdR$5%zKtR z!Gs)nT6maRR#+NW4yFeR2gZlxEmqt%=VIe%xCV1riD1nSy~QrjLRM_@Oh}TGmBUoi zCe|YC441~-sC_JxF+-c>tdwDFu%RX)r~$^_(Sise3ESjT0~DiFGSt}{EYxkbW!))~ zK4*AgKt}y!dDOGJ&!Z45Hlri^$v*Hf={50Ta@kL(r~HwBCV25Re+ph~)3@MvYZfv( z=dJWVYhA;f_X%DN&m>HrXjwOs$-HE<`q^d!RD{7|m6UZa{Kmx2U+e=+b!(!nLL^69 viwfAXqk<)aLl-e=poU86^+P;eYTe_%&$(Pt*}lD*|A-;~d;S0NCk_7rAVA#0 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74128 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 ed)@c{_m5q>G7e9Fz4F7ye_j9o?!O4#Tk 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 HKltSz$Dyc@ diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74128 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 x$~2xZ*S&5V#xnq|G)f6!+%w5+~NQL diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json deleted file mode 100644 index e5b544d05db47d1f97c8c0be3c10b8439fc631b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75594 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json deleted file mode 100644 index b0522e468fbb350016966f27936a4859939ef3c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466620 zcmeF4-Hzl&wqAXGo}!`azQ`c+uly>8A;>fGnSp0Uwnk&XFwVO>A{88~7SAEEJ6hG7 z#Nvgh=w!00f-AoGVt-`j|NWOwpT7IwKmPppKmYW%@BZ_r|67~wA1?p=|JwTdFF*YJ z%lAM2&!7JAr~1#A&#z$Lck}$+@}pkA*UvwG|A#;Q@aMmM|CgWs@IQY1QDITzrXvZdftC+z4*uf_WknW zf9a=cz47V)Uxt6b`P)DIb@eT zip|U0`*-8qXqM;uqi^_OGfzL^fWmi_%l!V7<%x4l*9VR$IHEkz1?7t0bGqOyZ#?G% z|1jZtO&9)*2|ZUP95G$_r`_d!F3mC)i{)V47O*p>X@Eepnk03t< z9fIaG^9@)068Ie_j(%QywjaE>943YMO%pnDD*Pp8{@E+h;6PdrM*g7_&oRxU7}t}( z7W)<&^uCF1+3t0mnH0P~bBR%1CR_=gq1e?z<6`3??wzTt*9a3Z4MbNKNGK6vHHk%i-60BH@bq=g!>TG^kuiCN|Q}JKB;^;MM-h`t%tIn0|3|PZU zvq;T$OwCOk7b&lM)x38`2JDBtHr}k7tL8b>Jf_Z&elZr~92k$)tqm3XJll4fj@}s= zOa}xvrq-s6VqNbKM}aH@*094NtS7h*G`COf0|P!Vu*f^88-EN2C)~cZdIE}Kte382 z9$uY6y;zHN60G5+hw9W5OqH06c@oUG4KU;xCWOzki?vwiz&hrwO%dx=TQ&=Ny(bRu zts(8Iv+7*Y&VV(%bxf`CX0aCQBv?amV_2IiE)JybH6gt-5~y_yV^c&iK3|GB!)2hk zE&QmOu<3{CwGmVNFumFf;~%ESI`v*Vr0)DEU5A0*yHcCLqzv8B$InC*Yq8FObxfU2 z8S7PBHkXjSCl0U97zC=b>Ri#zfHg|d0ChV&=ZDgZwOA*?db^ylgEihP)?%Fl>zF!2 z+QnFmb6`AH=`dxiS8>@~BKDq0=%rb=j;XgP@4d7xd#yKz^Q)iS(#9FMAU=1(LIyKudHOI-tUhI=#4?&J$ZR%LB;^*Tf zuWhQhFkJUyoCo6}uYH5dKyzF8u^eU7XB!(NKHJ!OVf@*~kmYJaKx=453tKMf(Z`3+e zZ`C`8dc#&=4Tws|4N@=0Vw?lxvC4-jVxMQ*PSeplBcZpBskN!1SfB3`Q#mX(A)1gn z&WXhXT3Keu;T;Ej@b@m>;jP73jB{X2FU^8pw2g7Ly~MoZWru~sBImG(VQng@7fUM%CUC3DkMaOGDdLYt_1NKy_A~&!Enxh^lkW_yuIrTeBTgb5lpL&xt*JMht6HN3l+cbqM1p z%r%WrgRXVtl)oB-pYdqAG1iiW%fLSc`QItYhkIirDAfw$p_4&N#fcHboTclquqnmwtoGKod?I69I~YY?>;*W&p0r z3!e`y1y$7>+J)j-?pW#b4g7k|E4<}|3p?Wk{DI%#6H|vOA#Y$&to71$Febnn61rXK zc*DzLEXFx79#dz`HexN-Nw9`bqPN~_$J8B1I}98KNrnNI2LKhW1YY|MYZI{+>l|3e zFvb`VV=>Nw@tF69!x3w-PJ%VajH$J$W4(&YX6o2`B0<4#Os!2F7pCi8tn*+UQs;7k z%|H`Y8|TLQl1*dAMuiVAwqE$)hZoBQFv_)Vx?-5YcEC-uat)2$F6osEUYBz@Pr~`O zcL2AL>vA!PY}01n^w+&366kkOpK-YQtUgzk6L36K{wNo-#6_IzUVYA^&x3v%u0_38 zuTP=ZSar&^T<72#26=B?Xq?!m+P2eo^v*cGpEggF>q9)nNPo?COwS992%2!?I5&%i zpE0LzuTk-%$`ex$Ki8GNYMJ1vrWupdRB*~^#xTbl)bq3Gc>$Y%O|CIARt5i=2Tc42 zAK$HmC7!E8L)oj;P`ob3m}AgCa{N;8!inw<>~3hsIUcKD^T~d>mg`DxhIJ%dB?k%w z8qI>kxH-vf#B|O3{ur+^|@k~!FPbn zAlGm$axK?MxCWVn^=edXIrNDHo4}yn-36~C%(qw?~ud5UkCLX*G;bV9Tn8W*Fz?sU;K6MfBo0{ zntEp>;5w+!I9z>JpL6On>w2SYfDfMnJ6I=JvU{=ro_Kv6|0?HK7=Po+ijK zSd?S^bj2`1eS6GLGbWa6xlY10{50#^LH#zLY}01n%qM$C9ACdN4AgJ+yRw~tYk;|v zyUgZ^i#XT4`g|IFMukItR-bd|^Pr!GJC|#@PQo=5H|Rsm7yH!PcKVRs8OQU}=81BA z!aVT`qk-nO_9Me#)6d0uX}+H`S-T!;j@nF5fe6dfpZKv<(osrN_vwj`aZ}UevKVklOgAqX!?i*uGIK4e=%cj|gKye`*rorG&tG~f-uE#$fIBgN%fu9I** zrq>t-axK?6xCWSe`fQ$9FWa(N*XuoTd_N6!SD)4A%60~>;ip-z-fIW-9Y4)+;5bM! z4xrFMuFWGC(^B{Pmfjf&^gYP2d7~VkFmL2Q)OYAR>OdzJ52$6Cp@-SN2k(vow_MA0 z60V2*^c{6Vxt8l3Tw{g+r;y`v_jyMB^cnp$hJpI5KIhQquUoIan@6hOXVh=FbM;&O z&Y|Bh7JL5MJW+i0C~lBz z^Ts~)ww*qtcSZue4svY1D91T-^C5kH!f2qmeQp*{%ooiUyGo4bi(j{1{RFFWuD`CR zCh#F+^^hm(fO0L@Ik=Ab>!*35{`!pm8pA++R-bd|GyOF{g|C2pF8mUDxt8lBTyNJb z_PEBoGJL}3fuqoHBD=V5A@<*%`p{aXZ<8`@~>m*!{>9u*Je)LGG0$2mA2dQNw` zm?!F|58iH@3-272JPpRh+T=;1$6Q>I*9_q9Dd*cm6_59HTp6$->1lJ^yIbNtGzU*iYvagNu~Kj;pen_zo?i1&x| z3E(SmzRe!E1&R};L$0ldR5TOlH#BsQV;nBWa-4(XvHHi32j13xh&`J-=f)6n-Pot> zPoMPHwJQewG{^;PcopJKkoD90={`8Wxu3?WQ?B(PIeZ8-bk9$tVk^gToP%TfY5I`8 zc5oaZ$Z#Au4swoz7}pa(MpOUI`H>H5%sgP?Kk%zi%x#)Szri3+7bt9yW2^<`SbaW) zK0{69TCS6D4FM18HEtA;Yq?Is^|t4Q9>aD_6NZ6Y%XJQ}0p=dZxG_wQI#>ow|taxK?6xQ?w0`QWh} z%W)2l2mLgLfn3XV60T8UroUzzAj5aSUQe_6W4+AFW}UD1#PR($Dj@2)dS2O1z;#fc zq5g6#$2mA2^xNi(i|MF)eMj$%1o}Mar_CGXI_2l5j_LIk#sf{bZFn3kI@vUDY(vJp zvGqbcZv<;Q^^PmxlVkmK#V&*I*w)ZJuJO8D%XJd2QNbAV*H@osY|~`lTsQWPIKFuX?X!DSdhFejq)#?*yHCCEZE!8=whBe0W4^8jJ z?vrfW={S049NkBIZ?;sY%ns?J_u3&XFYq8}!iMA2h;-OAYZ>=j z3$?Y}aZbL0cg$bmJSSXOeiHzH;Dc9whFsopzzyw>4jaKDdK`Z}epkGgO|cg1WvYy0 z4c1_-(JW|-u?xnE-r?05)0J3@brP)MlVWO(qs3aRlVH7Vc;Pb8-0{2Hr>1%S3?#6Q z!H_|-Jn^eNc>voJ#`83zcsbExOtjSc6QsW4H`7`I!S^E!Ih}hL4D0ZK~MqW83MaduJptAt8*fkYhBrM+l-C zHcb&JY; z?j4ap&133}qg7|sxuTo^WoT= z>a04SL7hzzRp*rIJXELVcTKC-s`VMv+Eh`sPN~*0FKvn_#wju8Js&h7(ROTDm_j-% z4lyiZSer_UbxN#b7@ItQ(`>kr7;Nf(t7EfUYd1mfD4y_=G_!h^**6`n@WmxN~~k*jIxO)L=%$4 zgg{_pSeqiM&MDP-%uAapigiw`N7VWO*Ma8tsS(|<=_jbR5##qTwqA&Tf@;WgJiwk9 z>!mAo8N%^x2}Q*Y%?H|IE!Ih}M)88)n(dgHn>w~Rvu}PpPVb1rt2qXNYOb1Bv=d+r zFyT7Te3&XO(p>kd^I6mxMqPDQopY%3n3sl87i+Ojf;9v;WbMyVN~!d0Nj^^91HbrP(%%N5`l%_rV0 z)?%Fl>zF!2+QnFmb70I$2Mc<8?bt9db*xu?*<4cgp2*<6;WJ`bn?f#3*S%Qh!8(NT z8(ayR+am-~4x6Tq4GN!SY`yRWspB?#STmye1{TFy?_DX(U^=iWjHxv+7i+Ojg7uJE zn>w~RvTu6n-Vq7ZI;PGzT6I>PE6NElX2B1j!d0O8=Cg~7G}pcAoJXC%YMuHG4o3A> zz0aWDSZ|88Sm(exW`dSw{GVkXn}uYzCUJ+Bi3|8#av< zUsC{Y{w@4i+EP$fy`f#Go`qk2!Z+M-9j}07!iAl20{*~n@x_by6~P{AA83{fU_^gx zpBwLGQ?BKDnGEA`d5~j(Eyu13D|^S+XG}P9E!Ro7hE@8iwd-<${L8)EC*gkE6T^p~ zSuSReizTdk%YMBx68IDdF2F^zTrdjMXZ86M`V3bi*K(bNYmgb#YvaZ~)wZ3!qjyFE z-!XJ6U%8k!%5}=TF{aN2MgvW_ZJe9I%V*5l+iOnzsKQVFtKoJi(j{1O@)(l%t549&YQ#+PK0+% z?KiZ)fb(sQ#dSe*b<2%h%XQ^8!Mc$H`{B*m+&MRf zkn6@ap}#ioORe2Ne+>bKK%-eWDgc{Yv%~b$ZRq9q)2NlnwLYYBdptjlime>WaSo2@ z9Oy$v+d&_Lpu=(EILSFqVq8xE8BP7U{=8!T=^H!`8RQs64>?w!PodAyAGwz6BwV8c z64Yzl9wFCqorLRc&kH?9vrHHUaxK?6xCWR27tJzl-)p)(M&QNSG>@!A`1KpD6Takr zzisvaGMa@S1f)Kz&lST2xy@cZJE-4q=W;IRNjM+VZ}ZAFZT8LQYkEf{(C?r=nDFVW23~cZEU^p1<%jG5eK;jn{ut6t{5ip9fNv} z0*PG9bq=nB`fQ%qrp3PLr+Y^nU!O4y)Mxd%vYmlz`01}(zn;w>7csAU_53t?jtYo+ zuAb-6a~KV*3(+hy)L)L}I0wgr^$_#LKGn9JzN2?WLcblt4M+jb5W7qF$@lIrKWH&ro+cmg5{857s-(8~aq-cKVLq z843L~>)Ap5Hjk9^6XuZ|sQMCpNge3KBK`L>-pv!$=QHXv3VrIc`kX_b$Nco&d{MnV zqh4cKsa~tsIrJJ}!dIYK?&gW=^BMKoJW;N5a*c$L{+jKep5yHL5`9SyUow_I-pwD? z^OSlX)MxWWIZny(m_9#XG|+?_$CyE;!=}$Wwjty9HMU+Df8G)7p&){0c>qSa)=yUq z6XfQDdJWL!TCQ_&9n@#@#WpSW&HGY&M;u?DF$~ma^|`X0fooKl$LiG&^T$QJ>t6jn zjeeuzp?<61IrJOG0_#9D%L8gJ$8wy5jX1p*AejAnVl&C9i1 zC*c}o2D!$lkZZZl!F7;h^T&GGmd$lx?}_94Y4gVg>bjTfL|nr;u$~>$?>86^G`Bqt zG9Wh1BO5h7@7Q`Fo=1+=L*4+RTt>+Q81dphXdcfd~%)vKoqR)*@g`dwMiz&Xf-(ZITp%?n0}T+4M1u7ez#CoU$W?)4$PGmfv% z=81BhGEW@y(*;HY&23ME42Mng#WrMoezEn!7vwP8?9o7fe&-jb0vP4`UH_DV{xe@} zlzu8R=J`A9?+xuZ*E|8hMU&S_j^(&=n$Suq~^cy%^+&W#~cp7`DPl_6a6mI<}@X+{xqq6?d76Y&Q1`84_r zaseA&#h4+;@4bDI>qd$7k=6_GbtL^Y*nn?LOr`!qav3^ewqyD|VeKd9>h~%18~P;Ia-DT_i~1J_8|04jV1o0HEsE@EBx>h)>#8Wj)qTD{Jp*Fk-Ty34T~ z=iqp-UTvP(r`opDcl6Fk=%-n)W;>|o=8tlp^La-&<`~yAj0u|C=SHT(ruXx`<_JG` zvUWrKe!d{bfKQI~+ZDSEzGPcNS=f7jPxQo(wUukRPQo=R96`M{Z*1nEZ>}SIM;u?T zF$~me^}4d1fNOxc=R3?77jdq8_4zdV3^%SmtIs*~ne}P5gZd43F6VNdgmWlxkZbeD zJ{7l}zNB}?@%*)Uq8y(vPrSltpt-I6$Z*&+Pkd>}rfuJzLu!vwx# z?0&v0>VR@B*EzV3tqZT_iOn4J&2?e#h=lq~AM$&*gX0K?J0Cb7)UlLs9064L7&fow znaku*_s$P_=7%81sGz9N>hme|*}PJH&RGu!nL)iauaxVYT*FBOxi-I)>y%u_IKII^ zqq#jskO{GAUfG6--)GQz;S2K0ZT48;z;k0az$n+Q6Dx)p>Ui+etbYgf8{bxNusw{X(1 zAjoZWBs!8Ljs#?esD_)7YN<{_HOLH6?cLQnj+BmLs3zjQ)l!|3>X0@UcnmbR%?u(N zHodjFjSz3GZoTk(-&&33VF8O`t&^@4X1JpXPI{<9T~H(ub1_eX`L=Taw^VPm#agU$ zU>)<;I9iOwI0wctgEHD`y6F^6-(S7BD4&=9BmWl81L$T{P`RGar6i=)*Avx4Krp}ml#aN7U zU`*c-!y4vNti?JB*64m9DsA^eDH*!0HKHbQ)svGu|Sr-(CH6l=Y8r7(l(fVYOEZdXEhyRcY` zbrP(%ox%>*s9TG*Sm(exrp`E8jKw$y#zS@L*%Yx}#bvXA*LxzNmu8)sZRqokDS@L= z%~kV?eg^D8W(;erKgC+Cb6_3A*i>78+Sbv9KL>y)YDke9x~WuUq3XAtGE zY0B6}j45O5g%3^{uV7KE_0pBX1STZprLQQ2h_M*wz<8)`eKl2Vb7J3IBKD3*pw9Ht zY{%3aN2}hdcSSt|=G*H!xDKfG)zop3?z&gK^QbrUb_ZjO0o7S`K7%@&BC5_OtW%pR zigiw`;Ui)u#8gqNQ(_&$_y+Tg=Jp6dRKunzVjCf*h^-gKQ$!Z@qV3qQ0Lu;wmzb5} zqZa^gD6ELJSm(exrp~Bqi?JBzz<4NJ=cmMrwOA*?8l~x&TAMo7tGH~Yj=d)i@1;>2 zQLR<$igp65W9kfP7h^Hbf$^A^Hg#MaN8M{WdS@h1=e@dhOubDZ#XMySIi%hkrkWB> zNge0J;sLGvfbU_%Peh)Ay7b)?QFT6{I)i%ES#{2#&h*wXwT60&wOA*?8l~nK);LZqEZP|Zyp#X2R{F?BXo6yuZ_ z52cC^m}@lQ#4%zJ<*@0qj%~#FtYhniFL>4wb{On!S4JLSQLJ4;Rtgh@cv{D zb6_1)XVkI9Sd4REJf_YV1Y#}LNw9{OX5AX#!ev0MAEu7=sxF(45%iuoythWJL-kg@ zE7}RLj;S-GUW~;!2gYOG+7xkd9Cfeh=$(;3oyWYisiIh)FI9ZPb)X5S4S$2^hD}q& zHeyT_TQ9^@MX3D)YG1g00>N1#)Z3*4M8ZV2rSSP_6#S41ty>?99QP*}DI1G{u zgCTXtAP{S@&Ve<+gbRThKTR3yRa-U-e!V9S@4X@Ism*o1 zaAR1TIxY^R?lmF3GZLtE3}aJ9F+N|)_y(7O=C<%7+F{d_v5gp0#?}k*l<}+9so%h+ znCq=8l?hD9&>ekmsQ-zzSm(ex@a==GjByq89;L$y||E7}RLj;S-GU5v#z2gYMw+7xkd9Cfeh=$(;3o%ib0d_AV- zrjBBNzSOZ?U`x=16~~Z4mcyp8V;eHYj;$Bsu_IX9E`^i};FDwBcEv7(E!o!4J+AS( zT+4M5u2J6z>NRTFaxK?MxE|AM3l|DIO!x}Oak-c+*2}hRmic;59N$kv-PLFH zxw4&sYxwD*a&@`jY;rE=NjQfB2Yre0<6=tcUSHBXBY}PgIW|v};}hnI1x5qSZS6;f z!=`y+8#3mJtry~X;+UT_1Y|8`UQ8)?T@G}bSa=9aB z<{NJK5m&?-6E5tG6YvKFL)Key2oEgRXiK~r?-H$g|->%x+wgeoLOt1%7R$PM(z$Vw|KlS;={RikX z{dbUSD3)Bmo8DISCAt1EuD3N6db84N_#(NM>l{8Lrq2_=MRR+M&_KVp?t5!a{3!kO zOZnP=To=|(81vH;*aU2HjrmRA@fv;Kz)z3)YgVD;TpvVtUfXW zM!D8+R}2&Ql%PIiT`9+MoP*;*eMaF=uH`xj*YMjxy~g2kE!Ro7-d@YWXF#6IY~ENe zsZJz4nSs*YphD;TCQ_&9pu=&aWN@%uTSZnaeRF?ZxGdWib0KA%FL%^TI{l=@6R&2~_~ak%=eexE|W%_G(Cl==<9 zg@1a+TM3Vk+DRG(Ao^PrzLUzF>dT*FBOeTey@T&LtZ#xa8<{j`4i41W4< zo~S;j)MxtXy>?K~Q9n`7)$>#6ISPStE!R1?4(c-wmt#53!SUGhj(77#{q`aJHUt=c z88)NbQ6*Hb)$3E}wRxj@ol>uZ`fR=^$0<1;^wZ{xa-EZFI0x3RWBUDop+*z#8|OyG z!=|67+J=yyr`meqqd!me0T|`lbz{Ylw_7}@Xfx*hI}W&^9p{=S`26m|u>SEteMFAm zbyq3qpK?JD&OBh^KRi)7Eu0fe!8vbe7h+Xdj^!KpF#=ai>Juj387JTm{01D4`RfP% zAi0+79Qr)yry=ihE!Ro7#*_k3F)Koz%L9|7T+4M1u7ez76v(k0=ir!rnm#1j4vq^f zKpYp2i=5*k$hG-oy^PD|=d1RfNKiisa*Vp9`m8=zmJ@JH-xA~c36Rl*TgSPP@vv$B z*woJavGqbcr=i~ldpq@#Ct#Fo^}1qse7y$uaxK?6xDM(w3fyum$2mA2^wSsyaxK?M zxJHF}&|jNJ*2}tV*7bT%9N%A~;-P-4-<9nIT*Fvk9SA#Jo=|%^mg5{85Bh8K#Km;f zy}qM&Mgn~v^wZ{xa-H*eM>yh`4|#*}Ky&-t$Z*&+Uu;9he6jUHJYNiQ4EW?&KV7lQ z;5)W8bZ4FThS%j9X8Du+mJC|Y`qZA7g?WXJEY&!1#rr_{<>nBz=sUo&o^CA2b62M z&cSt1pHaY;V>!;j@t{6q7|69;C*c|uXMhS{0ePM-=8N?*E}M0|-V?|7)2Mi;*Xng; zI|0{0eTKTru^i{%n0}gdy}fpD9GE{YCZ+E6DZMii=sCwhkZbcuxlWl!#yBo8CTPNq zgvt{Zh+hH1C2g7DxTYCJ$%)?rJ@IS2 z@doR7mFc!6^wX?gLy!RvY{$e=0{G+{{pa_kzs5nKVBCS-4ebxFhd=}6T3?bwzd0~I zzq>Fiea1{I$M3qU(8;LJ2hnHq#Mg!T^*{RS-Wdt~bxf}(2sE1dY5jCV{Q;`d`{@Zq z47t{aRE`tqHAWKjg?@U%>vAl|IXGq|F32@NmutCB!Zj*!tXH!gRlEeW`7T`21q)g^#{pZw8EVt)H$KX7C;G(_{7O z8U9<&-C;U=&vEb zdwLDmqF$@lmF)~%gUle;Sar&^T<73A$gz3iVmj(x-_biGp+2*&_qE%>absTTxJj8; zj;%wlFfwRvdnRN=Y?@!TA!B~odLf=)#`O6L_~clBUa?E)Yl2*(-Xhm>orG&tM1owK zPqt~XZ>~doM;u?TF$~me^}4d1fNOvWUjaFuuI7`AIM==Ud>Va5MMHg7pL6K*UVS^L z-*D%0F6T)&hXMz=Hoxpsaog!jdS@KZUz;b&@d@+98;k~;+uDx|hfVXum*zjQG%pWy zaw%BN-_S0U%W}s#`37FrE9~Wj3(Ln(_yfPi=dI#bj`@xoU__VW&&Rp(UN+@gu9wL$ zo|BK=|8YYdP_A7kRu&WJH8d2QVuG4D#mTW8=iqoypD_&NTCS6D4L|*L>(@6dNaSAb zlW@Pi)`L&kmT#$+>Ks&q(`|}Tz>s1o&Ovd^Yi~0z)l!{=YB=p}Zt*G#B~mTbNvIz2 z(STg4r8)=I0CU?%TjQt~ZP~n+srN*J>}AMDL)X=2wYid=fok|@R;)wXjdMx4lqaDa z`WvF!yQ>#FQujKN-WdtBJ4CVfR!i{-?yUy%1s(&~IL{39bXp?NcM#VRL8s zi62#-uuD%K!1e?KHO-iMCRXXE8KW3)5bHcx$1nzaKt+r(wybo#KrhsTJE*&%{lS$E zmYc-dC1M3Pp_gXen&am4y9>uxQFayccfD0;V^r^Bs5dYdYq8Fu-T)Kkkgxh2<4bOS z{f|q;-WeH8$o9H!2Wz}pbyl5osPmYYMo~bhSvtD+i}cn%D6~%-K*ATQESvbRBP2b zhg!$f8PYDsVw?lxvAVUXVxMQ*PSeplBcYcbt5cggiuw6IG4%=;f+n0d{0^cUHccI0 zGlCy)Q@bJl&=*+Su6$gTC9^`jbcVjtxXl1Gw7R3#@-Q! zS8EIc)mpW#XeYoLV8T`4)vGDuBF%NLI_Fhq7WATRfWI>=VB}SI)jfy055+fE7l|3e)Y%lW&(m$EY3ZGjz`M z=BoJ_)ZEljHBYJLF?Gh#sK$2*CPWjG z!-N3T9gIyCRp%3`v#Fw3=foPmVaQuQ;5yLU_BV)j*!0=OHiC-JF4kW7;Aa;fU{S2~ z)|J8pVS310KVZGZSd4REJoN11!xXVz#bxtG)ZP;b)OpNHL)%qr)w-gc0qgB`99#x4 zewZpQQeF3|bsn__s5=;A45-ekb53=p3E6AMh5@RF4g-fl&S4P4+7z79|l zd&e*~brj>AsUz%j2CrEQ+;Wx>A_HbPUBa zPZUzbTC8(m9aCph#^wzA=8~{?#NpK$gFtmwoh#ZIu!fgr-5TJ+W#Cn=XT)60lVHAG zuGqmEZx(B@&Ve=bcL!rgy%>ve4vfbtAEt=)DlVH##@-VNy>(2jO%)fW>t3uAVGTPR z!uk!a1I_JIBf4SJRIx$gvx}`4;;CW`W3VU2dg)4C2Gg-Eq1#KuH@qy?Vx0tQ6fan( zW;>?lrjBjS?3-S@cf{e<9D_hLSIsNh39ts3a2J9BewJdim?fHfquHzNva>9k3aRUCpZ}CNp_?3sub-4ge^bfiN4hQdL zQ_kglnH=Ns`OrOlm*#mUjx)V zy~YAWuH`xj*V}8kJ+AR?xt8l3TnF_T>MqA}oP%TfY1Z{d+re>SJXx_=Hsi_O6A9`k z94A4p%_|qE>t3$&a2?~gz__3Zw~li&sQC;Ju)T)Gk1G76Kz`0Ef7LR!H-+rq9fOGUCB+bP6VlY9OG~~mg5{85BlltwcNJ$!;7=& z{e5kY_TzC{FMNUTfS+c48-l#2-ym82R=+Ej34F+)eq)r#wOr@mI;hX6*vhdS=iqoy zpAk&RwOl9R8qOi6*AqZS6K)&l=0eeYu`UzMVd}W}^sVdF6WEk%^*V=MLqm7!9aIxJ zmg5{8kNN4z=N;QL**EWN>K&1xjt4)@dNtcYJ;&kdxq4pN&%pimT5r#%m_IIJUia#G z9zBQP?s1G!pgyb5r_g7(8o8G1BwT~cpkA9d_Nlh*^c}r3j_;?<8|6CX=dH%{d4|zI z6K)&lMux+t_ocox-{-t)H+;c;soU)BtP^LzDA)SwieU!d0Y5!fujXT>axUjdI3Lq* z^T%c$`sTW^cSHjHh6mpBAvj!pR-Y@&2{<0RKV&vfT*SHV)#p6=Jm{z4TGVUx`V@MN zRi|9bbq=m!koWwwd19Yx+fLunJLC9%+B{LNQ|5{E)6sTJ->)zxXu_T2+{k>`G>?4E z8Rn6-8$LRZyaGnK)_+$F6ZjTr=#Kxs;&nNe;~X51)w8eWjm;eN&2?q(hy?mfza7+T z9Ijrg*Ol!ITyL-C;4^@6xtc#NVqN#@bsoJ2se2q_6sXVY^C|S%yit8VWIa2m-{z5W zo|AJpiy+tLk#e1q>lnv37-}@P#|SbTHq8^;5b=9AS}%Nbo_GU{a_zdYVwj<>hm~JY zuTd|NYq?Is^|n_4x1he<%op1<**ELey(1FnHAvm#7>BFR>T_i|0mozaf85Ly7jdq8 z^*N6|^Zt*$HUxT4&*5s+bM^cbdX817T+4M1u7mn)zSyVYw$qpN&N#l`HeZzMl=&k4 zbxf~0F!de!jylkZ#RF888G3lf0pI%j8t>+f>UB!J#z5Jrcii#1`m8>mLZ8hS)#sG@ zOh3(bP``1w`mKJSLch%))$f%04Z($f#;fISo+!sDIUc(|zrJ}Nd&n@J>7Mp>%=hw6Y2^T$Q3 z>t4M+jb5WdqF$@lIrJJv0_#4!S{_h$IhNxb91qqz%pdzy+jjbn-Wdt~H0#+==so>5 zkCgKh=Il=x5j5exF=mkAuxUQ|niKrK#@Y?>d=jkf=<^fs$+7;rVwb^(Y-{Kq*LYp7 z>Y7@y~Z$5uhr|yb^@*eCVT~6UENeE$8wy5eX*p zfXKO=C*gd|U*p|!E!R1?hOxjp5U-XusJ$G^aSo0L{k3^wy^PCd4%2%gLtPJw3q{`3 zYxBhg>bjTfL|nrWhq#_DFdk@bpBotto92s+67$8@3%~R8i_-=0$+3RAVwb^pKtoyA z+iM5)96rWz;5f)R4uV{pN49CSZ~E`v5ef7?$T1FApVjBeasrNr>VDJ3ym1ldx>uj` z=rjE_1Q>pquU_EZ)ob{D&q={tI79N$lyH_CO+ z&r5}K81vT!#sf{bZ>T>qA2!V&Uvq+=pIW;iovuM;6s)_;1qJ?@2Tc42 zx&9)qp`qwizRK$)$8ub;JG{TpmutCB!u9rAZqJ99FV@Sr zY}WaDPbBam5ZpbEF$&aY^|`W~faAe>2V9F>%XJd2K_=_fYzOt+{BbcQb+0e!opF3U zH-D7tl=)*!pC=d*G~vc^Ze%!YnlH8?;`5EI7d|>)oB*R->$fY08GHx)HZ*moKEjk& zuH`xj*V|rUk89lCAlGu8gX^F^<8V2a;~X51)vqV>#d;Z+%{pH1iG+T7tX|D87E!;| z@5*`x&d2;UR-JM!*EzU`VcuIOnkOzMr0(@0y)%xl&*q78oia}x^V2ho2AbQR1{n^U z=8J8}m@l?o_~?9b28?p8pRO1t@F6ij&BsXPSdMdW%z8C_$Vaz>I%jagEpI zTCS6DjS5Flugx2qIp~|~$lejh*J}&|^;*5IY$xCvV8U1M)tmX^BF=TMJ|9(|w=q_o zRp%V)%<44T)aUo7*Sk!K{JBN0MwAs3c+I&83#t=}O)#e=9JmjNc zK%`o#lTaPX6oE0`E7ek+gKC%vtoJ}M(nl$l;v5vm?ym;b-d$ZU;^*TfZ*7XWFkJUyoCjmt zlANK6r1FT_*CAum0FMX}aPR|*rDjxn`H{ZFjLItSJ<(_xC( z=ET0~rF%ylUY#)rRA<$>qMZS2l$PnO*#^jP9Y`4`w8dWRlVHDHzSzMUZx(B@&VhAI zogw{VEXFx79;<|yD%PvGY%U>tPbBo(F|{^jT$rwVu}*|F>~IL{8Lk7(?NcMlVbhec zL1N0-dLf=N#xMqZVyu_0)MYRo+Y-86>6r1dSc`QMtWmres#DLVj%|+Yo8G#2#NpK& z7Dn|}y(`)Yum+fL8AuIhw8dDAb6`AFr=DTV#agVBU=42_Q)|3gti?JB))3qn)~1T} zDlVH##NHE!^U|h>3&V9U#(6NNmu5jP+77Av6)pwM?TG`?51Xct4Kh>6)(i0zlEWf~ zHCPmDy?CYYXr|?g`k)w#aSn{f)Y;Ur&53=}i}#L5pw9H#G1GygRcqC{qMZTj?R6Yn z22#f>+F~u%Ik1M_?qG~DAjV>x1LH9-ZR*(VW83MaduL=Y9UybeTbn|P`KM33UpWKj z@D(vrVk#-tDX|V=e1n-rb9;m!s$tU_KJ>Ym6DO7V8{X$1pZktXFN>Tr&2aIK0<3Ra}^^d$CT0HGD%z ztvM_;9h#1cHnDgBsxm_k?>OLw_6MhocT+~y`uO*N+))ToomJ;EsI#e}>YP%YS(j#; zuIBSQJwhBqPo#Rk>#b5SyOj%cfgc!NCcfi|E-w#saw#|`?`SBry5){@;sk{^W?r%W znotBj+x^w-AM`l>dW;zOayGp&wM`7(nA&ELjc56nhl zE!Ih}2AMInHdSnMV&9BkdPf{ytx-l-tySxab^@$J>daNQ7>jWZjEC;8exN)d)?%Fm zYj|nasrTA3bw?q^Vc;-GG7M0|i(!qzzF3QO4yOc{GmB#2|iytFCf!gSq>bt0_c z8(6mvsrM7E1I=xJgQ$m1Z%l2_cw=hoh4_uBL+bqmi(;*}t`sIPB{6kIVML6@I0wdK z>THVG=ET0~t$Rl#Q0Fl(4Q*GgRqKj&2CTQ&ac~)kU--PJSc`QItf99%7-I~Gu^8vT zc+5+q8YtFcodj!;NpH<|OwCOl>s4Mhmyo?D4)3*19T%qSUaa$A9a85vxDYhq#Bpjw zH*A_JHYiLLTQ7WYs`v&L#agdjDa>Fx;I$#C+m(?wye!sYodoM`rvPqIw|+BaY;$Da z^wPZ}5~y`dopH44tU6be6JR`4w|;|Ki?vuM!5UtAs80O`2P5WUo&wJsOf3^cb54YC_HjTIXu#)_>M zJ~&n^7r-djy6K8x0vi(4XDk}!SdMdW%u+RLdZX>&I5C-Q(`?`L=e;8m=sm|tkZT;S z{;U6$?F3u{O!yQ;k>!GakYhQ{!SSFzqe3Fra-D?hvAQ7ME!T3Lgli~n(1#dL*2}nT zt`mDt9M4aiM=lW8y&UJ^c+5{17!5SHwI7)eo92;?67$H`3tx~&!V$B+9rGataLT#< zx?-8YhYadB>VR@B*EzTj>a%%bn;jaNId9W`&4ksiI)R! z(1+ylAwiD80^pKkj0E-hMS6aHhC<2pyXmY@;pO_nxQ61gUd?t;&*7WoUhb2uBe%T- z=2`mf2_U1neQp};_tt)Ijfx+o-|k-b(m*!{={1IdT+4M1t^p=|#maZ!ALLk$b8yUrFvvC3U9ROi z3D@w`WA$og(Q+>5NjQfB2ldkv-(`w&cHSNH0#xSZGa6Qg7~q__y@;<;~>d6*sf{pagBG&wOr@mI;hW> z4dhskb8tLZA2DyNmvPx#SN5Jr=)Z${ZT`4GUH5XGh-*0F7}r-A4>Y&Wjf{s)^T$Ss z`D5#ac>WmV81Tule!60p!FOzH=uW-kir3{@u9I+$3I^-fLH#z5Y|~`l^w+&3j<4Ss z2I{x^UD-~+HNb?=KzvxP_y;+b;~X51)vK>?=W;FANw|i;4(c`DE!T3Lgli~nkZbeB zdKs6^bz<*{GuWxv_T+4M1 zu7mn)zNnu*qn|ckla}{EL$3iQdqZ&u^i{%nD<-LheX@Kae-=!t$OupA+jn!I+Of?~Vg*XvaUFkG_Q`{QOREV86>9 zzn}X2uDeRXdZt`ZV48Wr#D93Q&mZXIQgF^2+J%^{mQj2IAOE{z8lGS`Gd?eaUpdA# z`xsr0KOg5t=EJ6+r`pud&r@x^@X>nx0E}|2URMk`L3{%r0u9A1xS9j;x*W@K4vxqC z^aD;zuH`xj*YMM!;j@u0tk zi;-)&PQo?F4C=M{V!e#ZX1>^aB0*hmP_NAw7pUuAuJdpm)8{9Q2AXi&I5#pIHq8?o z73PVp7d|>qd;&(f)=yUqGx!epY1XURhUV_nN1k|H?&UrS_uF0q+@f4vp5~8j8tt2Y zyLUtaJrC+L4p*Pm=gM*dj>qaDyct-oLP>BG+=Aglmu)t3!CaSi7%R*93axBL=IHsSb57}!6#{sH{jswR*&T$ar+B~ve#$|I| z*?S^^{|<6&{NC_{j^#K9$Ak3`^Tc`?m(6u!?}>!|I;hv? ziwo3sFV~5j2x}jZ&S-E3*&o|ugBd)NQ6E18o+W9xGZ56V6~$uGQy?VFG=o9}ns^)~RwW*GahE_6p#Z zbwb`SBiC}BgX^F^<8V2a;~X51)jMVgwp`0~60VWV4Ek%h7&({oB%Fgx7>zxDjZq@k za-DApsstlPQ*2wLrkx)FdArXj~Qe*Y??1NO3W8q zFMM>qcm<4dt)H$KCh#Faea5;`j^#K9$7A*CD<0>QYq?IsHT*Q|)ocg#9EZ!j+$Z6F zd#wi_g1B+I;veK%u5)k=!QJB+qd<=3I0wgrejBbvuH`xj*B~>f*XE7&GA^6BOz(*V zb-qEpHg8;@u6w!8!*xub`N5p}4t+;u`SALDGhbAnbACQH{PbA8`i6Rm`mKJSLch%) z)$f%09rV{YTzyubPodA|iRyDoeUAC*?Kn}jR;`by)}Y#2h+3Uet6`2&%K*iARc%(A zPoT}#In?Hq+DsoEZHKfS2dnLB`w6t&8j0GTQrjW7aMtkMXsXR>^9i&WDZErmbrPyU zW=N~O+gitw(s9J@wua^KUTdjNNp(n@3p@szU>>JNgu|vE<4+1LH9-4Ra~hVx0tQ z_y&4wwnJ(@fpavW{W!H=yT;C#E%n-U)O`AM11cZvwI`q{)~b09HRrf^U!Q>9a@{V* zVw?lxA+J4|Dz-VYZ`Q4QM`Va&;I(6FjiXg-)w-gc0c-dQfQlsy4xW5Yagpk}SFQ7? zbqr%*tvajDXHaK27O@uVBv^yYu{yP>W1n~1P7~5Qj4syDO?#j@OSPQHQP{&U5QKHqJg?JEq>IkZq3ao8G#2#NpK&gFy9Gy(`)Yum+fL z8FVbBh>JAWz3O}xbq40Dv+A5foyWX1jJa5gbrP&0xG@uAs@Uh-SfeR-ZUMWjyld0s58CvUOQw;Zl;c^`3cn=^+45JHP4~uF?BXoRGm+#&KLx$ zv+A5fo$0LsDqIDsfj3h|)%t{L4a`+*)jEe-$JE(WQFT6{I-4qrbxy1yxMSYh)KScH zVh(#8G9`?c^wxUo1A6PbDWd9pLUl&HPjyzEbExx>m%f`Ss@5k|YdCM!TD8uh)&LW( z0_#V9JA)XDaSn`me>F|WUOP4nFf1Gf4uhP-Aci%H;$khbt0_c8$xQ$?+ny*XgVs|M_22IsiSJ0vW^{7XVe2#XVv)(>TJrW zI;T|UuUe<(5?A$Bz0aWDKFg?jr&RBlw>Cu-BQjvW?Igf04t|TIg0>Bwn1;2UCCn<|QRPORY@hP?F~TnC!l zBM8wBo2HI!1erRvUijeD@eM4Bwcff?n4rKHG9hm$jEJ!q=fHUAo{%?F#5O1P%@nbB zL;`gl^U~0E)mpW#XlKBBdmRUtfrH;n6&IY~HMVUly0#IQD{?DKZpX<~Y3B=F`jj7=rQIA}}Ul$_1~>^*b3T1^rVlP_~%|O#BD+y22gj z8XAgT1@x=SBFA!EvCH5)fNGFy94^;#orG)nX%@Eu?w)>QQ6uMao`mx;{l>fHTCQ_& z9n@#2y&TJN4vvRzU@aHp#CjQ*%{a05M22-E6gQ~XsHdyf>UCv11J`iGF|G?hMsxez z3|`(xKE)iSsh^KIwqE$X>(vD;%CY)fu{*v#qs}MSa-D>0_-WRw*$(;=#KLkf_er?l z_QcR@99#;9fn3XV4z2;_9>?a3^|CFSb-vyc$M@S1Z1q`vu54%E8h$&d*Lb&F%XJd2 zp}0Y=%^MdJQuq3h-Wdt>I>@p4q8y*_`NauF1I=yiN2bH3`C=O~=8LTt;`t)$(`?7| zdjgztuD`BWCh#F+_w(`TJGqwY99#$W**vjLlYMiY*gN9*`ix1VRb6wdx;`n-vVW3{C*Ol!ATmww_3Ye5Kn>Q}vT=(kpY4jPO ztIz6l4t@T*_39b!T+Zb@3FlDYpf53x>{D^u=}UTN9M4~yC(7{&^TaER2AbR2j|_)R z^Te0tnF51&ng7pRO1t@Ev3K_gzs3lxw-p!F5od%@dnB=$q@p-Vw*w zXAA@NS$(c-XW$wYX8LQk0Wy3C7KY_&{}4AM;u?jVPn*9^}Dj2fNOvW zp8?ZSZsv)LIM==Ud>VZQ=<2ijoI{@n{WRRUT+4M5uA#U=A7Z}Pr{1>HhxE=ko}V^P zl;cC>iS!}Sc1+(nko7J4mMRp);sL743_ZQ$fE(KJJaX*5sJr>3dY@A7IWRuI6C9ZJ zmElyM-*s0hsH2t(f~}bc@EbAx{@o@NAFj{1OmZ#PNqh$?c|pC#;c_k4Nw|i!0H~NI zad5etN49CQZ!24-5BarczQH;%$T7fHpVjAz?(yp#a4m8z*GaernXG3A_1iqMdyux% zhxE=kzJ8;gu70cEmF)yv$MpFDaM6VO#<`K%u<7%SFU|M)#@Y=ZU9WxsM!8m>bLjJ! zpMIe3C)aYFgzIgu0B&(`d6+LYv(Pu!iM=C^=ci$j)o1m&vYde9vHSBL=820q*S-3j zN1y4Z_u3HXJzoN&qMobgr_ghxJaR49Ik*n$v-x75irY?K(mUh$e%pLeu2Vh_Lw_C9 z>nDr`nsD1VH!>YI%^P2HfO%u>hL6r0pMX)W_0tu@1U>{Bx>N6X;&nNe;~X51)vurC zi_IML&2?h$hy?mfKh1Vfzj3(wt$tV5GjP7WwuA4$!K;V<f?!Ug2J!eykZicaA9YhfIsjXe9jI1H0yeM?cg{7yp99c zm38nY90x(JQBRR;xz53LkYh|xaxBL=IHpeta*e~~TCS6DjU@v>g|EPRqP+RMW4(;a zW<9(2#PR(!Kv%ET>&kWlu7mmvb(do~&cX4ZpEhq?Oh?`8J9=j%(C4pQuQq>_^OX7H zkbX}W7!fq#zTtV0;jn2Q*@ldHWb1|a^NnC_yZ$j<0G}M|uPb&Le8{$j?s1LR*Nwd+j<44k2I{qXUD-~+HNb?gfJvDy=820q*S-3D8hr-n>a+Ts zL!bBR)qFju=Wy$CFZW5fhav~LHh=6>bKB`tdS@KZZ<{a5@d@+A0;7TEw)P{_Vbgr^ zrTKn-YVC%2zBuNm3t*IM{dC1Jf$tc*AEclzDA#hGgX`G3kdOGwu^i{%cu=1)4CGp_ zlW>g+^Ps;rf2@~v*{tjJo;be0M#V$@R=+FT3Al!_z&a4vPE>a}mg5{85Bh8K#Km;f zy}qM&Mgo1N;s*8Fd{M4Xm@iH+9%#b0V9X%HVbgrE4H=(bY`qZA7s1+&pPm4p9P6hm zb{TvJG?YH%_ihKr5yqM0$Z?c&90j@ddC4{n_sw-_?}!BRLy%(}u0E^JmE{B+kJSw) z^U6h>>t21%qtEo`5McOanEi=gT%um9*Qd~H+^r(la-DV!NF*hJHV$=NcH7EFdWbKA{emPbTnE|6*>#r+@3494Obf^9? z<8?Wf;~X3h>a%%bGY5Th-Pk)Kfj$rVX~?^JtzK8QGjP4VmV?j0!P9KMxQKP#tJit- z8iKpWF~C-z)#p>_Gpd4eE!Ro72ATBNYzOt+{IO5PZKp5kopF4>ZT=|NDf7peK3`!( z(1aVuxsl$fY08GHx)HZ*moK61tDaxK?MxZd^(;1&l@ zSM$bZ7W(Eov3EoQy$ql?xtcF7;#~LYa~^$WeVT0u@}3WYF;TzO z?^EbER-JM!*EzTj>a%%bpL*L)AJRMH`2N~FQLavAl|IXE7xSKrJNn>py4>%`s>3G|tMI@%8E zI}TUh)%Q9UGK_=mwI6&54xVo2k&C$3z51R<-yyi*csqtsomJ-}sxzpzHljA4pq34) zq2y|{T73eowoal}r_}0@kH*1jv)X(DZMMdtHmB6)y_z-T7|t2K8l^q8TkSr9b^~&$ zmg*c-hqT$dt#u$d9SB@Qh-&Y(mg<~T!!?AcF7Oy=ZVwnlHf(yUbsI6oTdiv^{NA@( zV+<6qDAqdZN@0RKm}2UTB8V7^aSn`QH(FDj%@6BUTsH5+>phV`o%d?gd_AV-I9fGV z%`5sDu-{(i!G%!GO&k{~uY1)zkD5bocQD2nP@PrhGpIAvTCBx73DzJprq+gxeV%PQ zO-JvH!+U8{MzKzrGKSQ7g3CY?P8+92bi<~p;!E*O6>B$qaH=?gMX}aPR|+$j4tVLI zI`xD?iI|Id63n-q1GvSQm`oj;bLg8(#@-PL)EfqP2V)$qI;+kVmz6yFrF zc0)Wxq_+;4jw@IcYrS-(FoEe9y65AH`kz>fbq=g!>THVGoI&4Q684TbygFkLsLrZ$ zMLPr5C@s@lvkj2pI&iY9spBH$b+4MAMa@zBP|a2I9BLj@XQ;Ipi*XK&$0{MFihZ7K zJ55LLjD%i0rq-s6Vtu}p@dnp{CY&}#45A!1O&MP^fGK0`hIq;d*0w7hH?Swhdg)4C z2Gg-Ep*vXPWw93PBv_+(F;u6%nL0M7&^MQiy(12<-moyLx9VNdPJlJQgv)@m-%Jq~ zX|8+K`7G)TW3D=@&Njdq8OhqMdUEl zbZ9#2I42elO!;Mo9Nuxj4efY}NG~02^B4I1?!v-r-%TM^_YVvBLI}s=a{ZlT; zvt}N^Z@w(vBT|JUuI@2)##IqxF-~GqMk*upOkyq8Nw9`Jj;Xb&qh9)iUK&!bTC3JM z)H2UEul!c;8-4bS**o63DzJL&H&uv;D@PVn-lxyjj6pO z4zJc21gf=aUC~Z}HNf0aXH&#Qn(JP5K8rfTh^x-3a}IT8U3#w_Q*(H4u^0O!*h7$G zSerWbdAaR0DZMie=e120#W-hpKBCS~xC}J6PmL&tO;g2};`{VV?S^=&NN*i79Z#?* z)_UnmVFJ@JbO+xP^+2%}>l|3e)Y(+AIfK5rBqBHYz5YUkoG6qVl2ivFdnOXm?HLhw(T?>y)zPe>zG=bDvI^_ zQpGp84m9DkF=7ziuxYCJngL7|Yd6GGMXtbSjW`a6td5=ZKvtzopE?CZ3-#YIa5gZh9PfVF0dVF!g^z7 zKo-QNvE*w?FqW*{5RWB?N+IO}80A`bT`^2xOQ50KwU2Va>vAl|IXE8FXOqNc4*KS@ zv3EoQeIE4FkazW3y{>F$;Cg#42cN-3=EZDr5$n2Fuk+|N1b2^Pi~{vpeLjUgL$Kvq zu9I*LGU>0`4(hq_W1ouKPG8bH1bNSgfMmdjS8;BF{TbS~ozde*$$4k&)2AEEVWFIsJGz!{xS?~elmuMZ87JTm zeDKOsFzz_uhW3ZoL+}TqKk(<{mzC>U>4k8ViT_}ouMXHa*I*633T#WkOf1KkW6*!) z0wt5<*R+yOpJ6!VTCOXo8GHvMIHuPVKt@yFpHrnNaYTYq`$BH3WB$V~heh zmg5{85BhHiwp`0~60SjJP_NA&>t$Rv?}O?+ks+snlL&Hc{lnu~j0T$9 zV+5HFo8G6|s3_j&RC^(QpVOG1o&lp=>!&M*8GHx)H0#$v{YJe+&gDD_=iA-^+;ULx zhH|-<>l|DM^%;lDu^i{%c+g*)C)UfjY}P+|PbBo$5a2!E0oS5ltJjt73|xcEAlES1 zaxK?6xDIk`p17Efy4QE~&N#k4nDzg;m*;8TM7jCzS2%W)2l$LiNtpLcB2V&7ax_KrxP&-B+py~g3{wR&CI z&cOBdS`Iz~?$zr&dJVzd;~1kreO8}Oq0bO(xt8lBT!YL(e{KHQr{1>H zhxE=kzP~nqla}`(3cWU8RIgL& zbhl@(8FfDOS$)o-&-Bx52ld-L zQvE)oeq$J@-|BY`{RWuu87NPeyLqDed`5jn^+bJEpL6K*pr3|-%e7o5;Tnn?^daVp z`jC`9B*?LOq8z8>c3&A$1$IK3l| zug@3;>hn7pCK zdW=C(o)`vlE!R1?2AF#sn*NMF&66o{StyjN6?$vMg zyRx2v^X;`AdL+q9_er?l_7dP0gJj~zD9W{5=inNic#mToF2{15gX5w5L#B)QV!e#Z zW}UD1L_)s}0p8PVxEA$Vy{>F$;2LBGxrV`(Yq`$Bb&zB8#l>{gy}qM&#_{#pd{M4b z=8IpqUR_{3(A@So$avT^e{4g@=NVfse02U;0Ha*%uPcTLd`Zk-^ZTsiSdMdWJXWtR zKF`>u#lE?2>>ZInpXslIdX2-?YxTOaoq_A^wcJh)v$K}lJ~zBLn>**m5Gqgns{9HN zE@{hzTKhDkXgSekP5hc}yg|Lrqt_5zz`;vT*8;fY82#t>=e|fU6ofmlyP-W^@1PI) z+HL;Ao8PBC@uxd(^fjmOHJI7uTCQ_&9n@#@%5F*9PJiAzwJWW0ixrle&tKX;5Z&WbZJe*-pSUz=ZFB z*iW8II_`H(B%lym)c#WH~p8M~kFiaMZN%XJQ} zgZgZq*vvxTTqpL9IKDn(7^u(cb7eaN*QhuHRQL)UJYCHf7qPB;_4+h=jf#hQtzPHQ z>!3bEu;o~eb8tLZ?=Vm7Q*GPnJ9=j%^wX?Y@3n*aZXW44IAI=ngHb^f?i^zV84sK0 zk*_(!JhFB}JdXrxJN1zp;FDwhcf~G)PubScJ+AS(T+4M5u2Jy_>b3b}GY5ThUD-S0 z_hpH_T6I>PbExxJwHlOL3sJjIP^$*j za4c%K+MPqYx1BX8w(g-epHG`H1k`4=IfpjWR|8ad3TU-85ViVzT8%tXtyZgZXmv=N zQLvU`Db7K0?0#!F4m71&s*_L+y``^aJEY~_TdmJNpU*B(Z!}@UF<=nku<5PUZNwCB zt**WBwQsG42Pt4rjP)dyx&(JL4LR+C(w|t1brP&$wc!lFE!En5v0lYx^S-^_6Ngu8 z3yVe8Oc9$i=$l@;cSJ&UrU{9*W5WVRtM00M9U2LT1we%>LBVe_ zm0YC0?p6CdY9GTGwGh==bv}bSn>wn_IiHRJnK8A72~n+8>ocgeDWqzhQmsSkJVTDr zgww{U5$&*P>exnz&n~uJ_=41No4xHy#|#$5TGLS}%uv9Cmu4Ls61#&rUKVpPPlEZ7 zdYekNIkRupse4BxQ16&J<7m}cb*?BUzykZ&~M#Bpjw zJ8YUdzJ`*|I@WIZ;MDO77R6eVQYlQJ=8({BuYJYKVl2ivFdp*SS5w924EmpW@=z1_hWV?cFQozI}os1Ay?SSP_6 zWR7`jm=ZA;^CXzVSHw(-sbja3ZKt>HosnS47{d4lIYx7PgdnP6(-iSFG)xg|H+*o4 zcms=Kt?8%~CQ#=gFMUIyM6AU+3D(E00u)H>#+akT2JI#-kv zV9a|yXhQbd0DDKxO&u30uY1)zkD7BB#IT0LQQcMd9O@p!7}<^(i*XK&$J7~1O0gE} zBv?amV`^>6*zIH6>7{#TBwSL4u;%ZtTC3I-ZDR2NRAq)7-f_SU?Re_Q6MTMmVPG=u zri@*X+D>)uosj_JAuoMLeNT0MCjzCQf64{<)yxAX{)6{~)Ugs*=dW6)zT>KixtLcf z53k;^Fk&s%Ij{zpm=o!(O%c1DY&*Sm?~KE%vnirjr~Jwzdh3{4qsXo4&~(&set5Np zDG_V2&VhAIol!OyV=>Nw@lc)m0glmx)5eHFbi=04E;gI)_b#?x`1*C~A+P-at75O3 zS4xlWwI8SlinUnhz#7g0oMMUiFjZ`GX5Xw^_l`KcI%5#1&Z=`oI|J4zJp$9jeY9Fe#YMn!^W9kfP7h^Hbf$><~8cRm87V9KfLvY9H)TWNzPPU!ix_3r~ zB_r%{$do)G*Jy5^8qp1#rjDm*piTgTMe zRIxdOzUifVM;ut6NFqu$Wl9gHysRA<%s4C-u(s5+nT zgMr^*LR4$j`V4Aqs;FA0RO^tJE*I!Any}h9H?kTwjS<@rF-B~?@WC-+xd2AF)^=13 zGnDYK&SRyTZD{UxZKPcAy4=fs67ILX1h~bjarF(GaxK?6xDM(w4wqv&&cX4}jUnY? zwpcIYvY9RRo=E7oA;5dS1Fl8ARvW zyM=5!{dDh)488--VXR(VAlPVbdmLmuY??p5#tuK6sPJnuOTl9uH?#|}D|amS`Gy;= z;}y_MxUe%$z#sU4D=0Jc@s0y-Xn%D6SO6pX1Ajh#S-h7`xt8lbAACWs4%T++9|f<= zvHrTUcYJ-ugd^8-orG&xrJ!EpaJiQ2BwTNMUib`@^~#Rt-99%B^k*=E#SF#_n&rt~ zl?SjrVMI?e{LF5WDTT(6}*ab%W=Kq9vxgJ{)6?7IygSO z-T{r1Ys@jE^nwM5T)!m!cc|lmOxCOS+R$KJM^4NI|KK=q9Gt>`quwspa-D@7y6Xn%cpF!hwB2HQ6{Vn|oI9%@KJ_+~RYd!c7l=;fMot~gIvSa$hBN2;TmKHxrPyuYq?Is^_X6pH`dFzY<_-7 z?}-FHB&N?-2r`=6V}uJq@7Jr#KtDgEjfHRhd8t>hDcAarie&r?18QXILK>l|FeAn&aUu~3v_InKc`{WN_@v>hB5=8@fkww->wcgEq@nf&5E z^l|DMIW|x1ma^^i*S#|`_>due<{zLwtIw5fV)1}le#Gag z!V%*)*r|uy%@?~wwVit1J0kGy8D=71-b;)Q)) z3aIk?&}+v9IR<=kte>tB9bcc#7xf)EeFrKSWB&SqDNy}ZzfYmxurYEi*EzTbnD7}W z)-&IXE7xS3gkUkZZY4!ZrMLP_OZBxt8lBTtjh#T*H{iwOr@mI>@nkV!dq3 zW=`IFB4NFnb-lfIY#clx;An2o707(pG=FSV74yg13)2L_y}=+)7aTCQu6zPUxz?vt z3=`;kP@hp3lw�!SSFzn>W_WxNQ3G-V+J*nf^Mc*En3gRbG3Wbq=m$ z9KQivG`GhHG8;C{6DtwsiLDbpJWqTBjB>3$R}3@M_293AdX0LCT+4M5uD87cxW%%t zyqPbyX|iwTi@hTf=ygz^ak%=dK3A3#a6DG8e)D<8MV#wiea@rLtWWQ?A<%oi1g=Is zSIvvR=r;s+k7JAi^;vyBg+8My zDA#hGgX^F^!+3yWoD5AIyxlAle$JOO_Hu_;oMyaZy0EL+FTCAt;uqPi{)oa)u$#EB zTXik(dFC6~MnB-nl>+O5Zo#|J#KGImH3RHV(f!q+qL4u-Uo*Y(x z#!8_+zjHND{LT~mcH$hzDU8$4gfo_zJUE10lbPP2JiNJw}0ufQ%x=C0{kZEFTDEuHMf5& zVu#Dj2f_=#@nzzWTxH*@5%|ExFK_svg^%kNnx&cVpzB+mf#S3higE{a^qqwtalD=w za1jeVJm0Y*YSk6fN`&cN%M(oR3Oki#wQyK{fi7>QAv8d&u z9ymjx;7kOj@GTR+R+t}wUARhsdQ2Dm5}dLpQq1=1@8qw*pEyD73g0lT7FS#na?XZo z5sj6fS_=dw*a@(#W^i5znuKx(@T6@uWLDiW<9AqH$~*pS{s{gNbY~>EtVTXZ=~`X* zJ8~4P2H_p=V9K+yU;HcYR8<~ORxb0(w=kKRFxXj>;9mix@h24?PQ}IXco|m}ucC=l z75=Hyjek2SSPD6`I1R^Jf;AXn2{SxMY; z^%ls)xD|R7^bC8da5S%` zifQ#D-iXK(KV;%!qRbc^B%-W51{mUxd`}P=MX&LPzkf4&5Hlry@T#1SAB84|AH98H zNATNsS4-5w0`;`2zu|W%GlXcmQg`U2SIe5!n7`rraJZ}%Eq9D+E^^WBg>uS{;xfAs z!b0aftr%Om?^WMYCsw0lm8Pt^lJ{?Ndc_|;ar(pSE1$bMKNlhE-+8sjV7UMTW@Y#b znOn`DEHF(hb`}CLQ$#3rtHSe2x_HG`YbE?$(`u>1^3G}^S$T~&41_|kDWCM_>)8z> zg&q}p#i2>c+0PTF+i8^vtR{(71%k6o;aUok!#|Q8&v90`KwOn|$ndJ*Ppd@VS)LeK zbYo0hZadk5R$7NYLZN7zrWHpf&61ckYVx_vggoQtJn#*snc#qHD|NO6i`{9>= z{QTn@9%}LGcjxrHvMsCU-dL?)-O#~x1|vCol+_71qF3`Ams4b|a5knYO`O%J{)O|$ zs%*vCfNO{~&MWO)6?+Ig=ZMuPTy-V?4vOVE{#;EvnD4pPT@8=bpT%Y1Y7+W)!Wn2M z$H#+n0uB61($_8p7i_hF;E!N2f>&!*pyiNV#VV^`a^=ofH!|Uu{&&h7=(*L}cEt?- z&eeK(y)0S%62G0i>XWe?8?;swgjE)|T7a(>2`fEZ6-HON7k{fYb*m#d?XBi?E<~sj z^e!uVP4}~!N6Tt$g=uajGkHmQ=E`;*!H}?fUqKaImbL6xYYA1vD#M zg$u{kJutM?|4x8Labu1Md&la=yKCJBIIkBc4J<3_^!gw2)V=O6|L6a$0MuMDG%$m! Otc9{5G>EL_ss#WE{(e#b diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 348f1953ea70832d271ea0c5f015878ece72bb76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json deleted file mode 100644 index ac77510963d614ba5c340eb14d253ea0dfa7a6d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21205 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 I{i5W50O9yt$^ZZW diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 348f1953ea70832d271ea0c5f015878ece72bb76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json deleted file mode 100644 index 47a7cc84c41a9d724c1b9f4115a1c6e89c9c100c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2668626 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
Tz;jnP>LX^4MIb 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

+Owm^WYT% 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 H{PX_}Mu(fH diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 348f1953ea70832d271ea0c5f015878ece72bb76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json deleted file mode 100644 index 8d42780da1314ffcf203b41405e3efcfd78878b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2437729 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json deleted file mode 100644 index e6f8492c798806035acbed63ffa818f1e9acb958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2425355 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%0DFe_Y{+ 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 VfB%<%x&MFj|IPpVm%sbV{{ePV5t;x1 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 16eed9d48e9bf224fce28bcc1720c0798dba3417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10644 zcmai)-EQMX42650rwDZ23z7P>`zl3YcoQ`?n#8GNFHkJmIj`mw#h#%@Yh9%=H+$qF&dAs6E+?BYTddT}9#-!dVG zU|g^qhRcNNS1L9%jH4}mKf*ojByT)80RpJaSqiO!w^--#{DX6<3bg> zaUqBAGKQ^k7{`6fp&S>ga9(CiupLa5P$;Hjh{+gI8aHTM{Gg|bGLXgkt~SD=##eNZ z+34_2$LRUQ8jg^$Hl*qqfWMN75#%il>9P%p!VAcR0Jpc|?bNM1mRMm^6JW!sg^rq~ z-pt`kZcq&FTZjA93$e<^l#*lHCQ`29V`3Y_KDnk-C}Z5q3^#6!+V7xjQ{8cAJuXle zD{NF$LCnnge$m|u9^oyPGzmYWQ#f2*FcBNCxKl_Wir}_tKR1W@R#bhaaIt{XZ3PfG z!&}JUL<9nYb&v{ct~jRVsaNly*Gv;*SBxyY5JMYi*%oSBW2`_sLLz26TO*il4W&5o zL7}+CBaEW~LQoB|3%qZ{*w#=Cy=S5(86y&gL}DYhPY4MUh@vKy801^l9c3 zcS=Dq3o))kPaYB2qqRtYjNq&Q!;M*s(6Kcy(3Po+!u0EnkcQAFBv=TPCT}1(69&Zz zI{2NWX9*s%e8C{0#1jm-!kWy4;&$|ak*asTk>O;DTM){6s2?G`=6u38kxR`@5^SW= z3QRN)afUL>67V<-1qjK)otky#JsQt*OC%t{nVKba8uOfyBQjnEy2vSg4qKAKthL0lJ^*qjWUq{4#c)0_o}57?>EwWk-#K@ zGqqt4#`{KEB)b+TrR{74q3n=voh6}EYbyYRlZ%;SBN%FSC8Ri0j58}SP^v~?*n=p? znnHY5Xasy1QA1+G5|#dgF=>zZpHV=(K#C+HB6TV`R3K2$iG{l{!HJM2c^S@vghuyt zQZr`}EM^i<5Xwr^z>-o$8*_ouW(Enig%v0wbRuAgp7$78_ z8f0l=6M{t=5j3L|aMFK5A)Y&V4wx~hFfeDY_$t+2sTL}#vE$-kUk9Tk~HC7+6$$eB?JD{eO~tu&)d`a z7)Rc49u^`ZJB!9IG9NICSWu3w>)>Oo^FAwIc>%#ekeK9?zGf^%SynnrI+i}t6(s2< zU>Fh0#hqCW8QGaMzJ_G2H!!M$lXpVhHAua4H z5D;u2+hg!Z>7&Y}ix`V}iCFPEnZdLten}iB36KsNrIhY~gt%mP_IXTzg)b%g3DYg# zCDo8UT)v@-Y*llUQHIsFj$01kro-t5Eib|HI=RNs|)#rMJS9EpC~n1u~)W^(`wp_NduZK g>Gh{%<%8><{(A|!Qri8WGvgz@`1k(*$0vLL1L6MC0RR91 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 4f098886a58ef4403b75cd388367a6e254062963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18554 zcmeI)$!;9U5e8tN^%O#%edx&E{VK+Q;E-*Ruqeu01{e(V?yhWZS>Ml*;DccpkPb7f zs;pdM`Qwkstp4M}$B&EOj(7Lhw_g^2`}oIn*>5ag|DLX{FQ==&pPuxm>-}F}|E}@x z!)kc2*^C$M?V_!=Zx_qAKR5OEckPC*S{>e=Y}Rjox8*p-a_Fn}is<4l-Pii>TqEjc?bkJ!{~Xmq{$X-rfFo zob>c?_jo)#{5Jjf+lOx-{_>$K^+!6sIX;|Uoi0#nt)sm$T2e7ymq7p1roL&1R6^;`sIU;%e$(Sjytz`sR3cbKkqIU9GmO^=emb zxg1BBmh*6Xar^n~%{B+YE}q6d8Rp{h{Qm0Z{NdQAa{l?OwZ*e=zP-$Nad*6b{M^^^ zWZx$npGLU-$L!X$uuolzm%pC9JbbhI{?0IiemN+&Uk*#`mo)b2fg6L+-g$d9xWMW0 zYB0-wV-nxXYWwAMgYozFuw}%y9L%`)P#d~j(_l2>rxymF=r@|zjak>uS?%MM!Bb9y zY?;Lj9-dk-?}J_JY`}GMRx$6<#`~B%roCg5HG*b;Vdl^MMvZ{dZ|pIz8nK}_aEQ77 zSE!dIjv(ASqcz53XOp+iN6Y1`RdquP1M2k&)B&N7K-wE@8M1Z=s1-_BDWMh1YD*_! z1O2YiWgEjrpJiLI%vlWREk+i**d!4*)z zw2i>Z?SQ0a46>_kMw9yugZzdOMaX7Y3Ik>e2B{K91V|%Clb6IInKHHz@AG^l(_ehF*ED4Tw`Hl?$w{`WwX?-Hz-G#Gm|a-ODmAOJ}LHu{go4>!*W4C!ryX1MxC~F z#d>iW?qiarUk2BoOHoK}Yi&gWp`I%&!69d<^GUPwIYeA2Ls7D9okWP9kKhz>Aj8i0 zJ5$0DQIe$z8)cXR1AcPmZYI;e76|ra1&_fiRd5m5Fa#;ixvp!1u_X&c zCdL!{bA2titN|-Zb`t)$#wX^NhOp)gSr7ry*Mp|$Z>GOfEqOkn#1iXR80NUC&;vze zOi?`?HyEBmi*vBj8jLjYOjHd;GKQSdnvofbX&H(LW|hp|5zLs)t1L!FSs~et0F0_c zAvFK}%cd#Ko8y^`{Qb+a_?sr<;6_=68&yLKQ4y?kr6>g$SPZ&&s*WX)Ad<*eg<7Fi zWhz6nzV!41LNwvP#5cN_+XSmv5^wC$Vx-IPho~DghcIB36{2K#%&A#)3Pz`C>119v z3p9~K6p}4thFxk)St%2qTotNuk)mN4nBPgQ=Kha4mVu_Z28?gEQ+$deYr8~q_*+>4 zirh6Ix#=@`LjoazF*rso!u&F;8%ioT6<%S$Z4oH6*uXxqNUsU?3;tVlBXk6hiZYgU z`eeYGuz(h;3gV85A;&C8LlJ5`6>&1jp#Cw3fH;+7gDCG>h149T{rvBGp2VesZbj-R z6Unp+qX`nM!lF1u+_0h%Zy(&kv_cvPip%Q?MMp_>ab>}USCjVE#X0D6&${OlM` zf5CDbOKgRO24-4I$o&ty2oT&5gUhgPu{HJp%K|iRR;o(o5=n}>j~!mOA(I#wU1BTW zfEKB3Gb)F^Ri9BC?MWzO*=oW-kc>^r85TyEH&p!0&AJgN|8UO<+DuH`vfK==&T~3v@~7r=fBosp`NQK~|F9e5 z*_%&UT?-mv<`Q3WMMYTFZ#eV0yLGV}9G+vq^hCe5R`OJdMstTcifdL#BEX8yB4Z14 z4&oqbj4pOI&%&CI|eB7+6Sh$zp;vP^9&qKbhj%wPZTFi|8baW=yP0>Qr} zGv-EdvRG{y>H;V7AeS`5%5(B1tt`IN)a=Xx^87l%arW~VJsO#3hUDDLh|My?v4Bvq zfuE}|XA=+OXnz^R!(+qhqJ?2E>{1*TCCns)6$Et&7mw(!(NqA7or-?(`9KtpHZQ*v z(hXqFP3~?Vzw}>rnFW%?ul)x-&aS6l^mv!E2>GT!U`!qh7Pq1nm1P`5T~zHvvI@JD ztOos!^EWz+dopo`qdbBenY$F%tg{U*F%4(~k!$sXhl#8ryN1v}2`0Y)I+0F6ceA?Zd zX|1x*|391iUSIzQdXW0RoQ_}jLztXTPy6xV^YHKU)$`R)S1q{yE!OV$=iTk@yesiH zymYree7ZXi_hwx;d$aU#|K@nwZ*T5)hllOw@q#nW2D4#>;~$e-!_7}ki?_dT-yU8-r@d1oXqUx|A3V)@L5&Zd zW3rB;yAt>9^+7>z`)QZM4a~6S469;@@r8N8iFPBFm~w#u6(wF?D4;V=$?JsF(Nn6m zUZEaWkYa+rqZlj5z2Ou+2jDs>mE^8o+}7+Nb`K$=W~EUz6)<0<#uV!U&f|azzU>B= znA*RCd9lTs<=SKz4d>xxLp)Abo8W(&FBUX)!U`p=j4y1U^qQ&K09rMAC@2FO?5Lp* z+sZkG-~h&5V#=&}xk;HFwmC_%Z3GQpDZ@B}kfFzvK`H64wgx>usS4?80}C_Q8Mzo9 z9KVEl86g{Lwz8R~m!K_zB34#5Y7$EZW#F20D0+F%DB-4wkbxkek8^=aQD1xk4%*{7 z<`5~VCE6(}ZEI_6Fawl8q)R$m4{wY$-4!!pyaFT=649>FG0>qECPz7A5{!ZXE`$qB zN?WYq!67Js*v!Dx+XkANQ1oWHNgdK|Fv%~mA`vo~mgK+?p_Ub+1jG>nBr`{nmuQm^ z8NQ(R@w`?mqky%D8gI}&lO7&I9wIVC3_e%#qaD%^j(x-m(9yxilcvgAN4A}=flk8w zNNfa`j!a@j3Vui;Hw^w-`Zg&S@UU9kw&#qpN$uPQ1Xq|c6Qx^38TBk^NYdb_U4>Bs zLTbPj_8G+z!O^-x2CBdVN=H>Jac~3}6;*-P< zArh1P3UU(zp~+;<#&du?@l66FY`w+WiE6eE;?bld)kYw$YiDYlfca9EFy(|l2CGR$ zozO;MDB#5!40Hx6QJ98?Ats%zrUs)IS0F`Y?qIhuB6M$o`ia77G;r|~lBN>iXi zzQD@=d>Jfo?J`^(xkB7Tl@ZDI&?UqMaIGoX8(^S7VGJy$BB(?;nFS~davGC5WM&(B zU(*f821;D;dOCi|OvhG8r!C=)HLNH~027ECC6`d$NEV#T6O8L*=3%==QAWq%b&`Yz z>#iVpFez|KnT|p$4{-oY!%Y$mgH&Dx2}>BbqY_PW4{)~0al@EL7Mv2^gm??G++e9F zNKVF#Z?M)Qe`F&os7dNc6@)a!T98bL2{)A}m}!K4#3DwG%unzqt08nG)33;uVnPiz zx-bDvyAlV0ive9+bQ2)!(c0*eY?y>(5X8|q91tvFS!vN7hEs_tE+b3`a3Q+I(oOvd zmWSFVTO>jIt3cqklO83|gfUi(e(jS*4rL0KIilKJVyfq4;l(IYEk|%*DTgg)z(a+Z z>Q<=7!zl!UOXT2ST9=mC=L{B72(zH6$XryU(Dv$LQv?$OW|vUhF-+*g$*e4U(|pX@ zh)eYe@f_C2Q<5v{XgHdjx+e?ZV1xzj5b_1;IhYu7j#brVWbXma!E_jN4B(1vZlow5 z!;%i1bEsBuMrN;0eW<~~MHTyegZ5MJGo)I+5>y`GB6w0mmKV&BglS*{2^2LevZJC( zy-BX9LY{ul#K8(cC4mkAlxmc6RV=arhEP@3XC>~#|qUvWlaL8v|z$+Me z5o`>;ts1JHn`K#V`~da0W>q%sxq{p;6E&3f-&+qH|?Ur)!=)BW~t z`2K15jtQSC$=6syB}*}hhFm6As)n1+yksN=8Kt5^Q#}lR@{zkeH-~TGDZ@=q4Y9+B19UfK8<{aGO!iI^eoMhnkHj|%|`-)YiaKSjLOQTiv(!~rLxy)1WCDI znK(|AV5O3jQWQ)fuIx_F4gm`%C7%k>ZYI6u+g|~go1BhM5ACluCWj)k-`m&X!ygFz zfU^+tSquYXd|FG~5~B|3iK$Lsff32v5 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json deleted file mode 100644 index 73d7c1d6c87db55a28d8e21dfbaf385468a1fac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14334 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json deleted file mode 100644 index 26ea2400cf8930fe6a3e1b4a085a611984d8bfda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22156 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json deleted file mode 100644 index 12a843e9bc7048161bd561991d2aea4aafa26770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28889 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 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json deleted file mode 100644 index 21c535cabdd031820be105632d426dc5d4cd07d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10897 zcmeI&%WfM-5Czbz^%VlwS+IKe%&!CiK}(E9L=qK>G7=d2_sqzW%sJPFH(A;X+dVV= zsMoDq)%<*Mc{%yCJ3j6Y_mkf)Klj7o!SwzA{pj(uJ)SlX$HV6I&*o)9yeW5bb$Gfz^@?xrPkMuV+VxLP$EV%P=g@(@Q$=g=_^Q*&gx4F96?(a9ZhpWGK*PHh*Yd(KJRR87f z;czv0$eCYEPW!vv=I(J=wwBc`x>>iZHl3dD(2H|ATpeyVU%j!;5Ad@0{(4yBy7$4m z?P)h0WqZ46ZStzF=eG%ye4c97$XM-K*?^gA5>96jnEejK!T{b6wLmzQ51dzf=} zf?;?j=gZrgzil`SFE2ZWem|X!KWI~CEE%sB;|bMRvSY<1C$7br9fl*;Y&l-Cb?&j| zLB|qp#-=mWP~D0>8gjMr!IUX$jydB{wLntltB9pStj9;J5CS1<#gP@EG+vvt=ZY~y zHsmehGUQ{9+Tk^Q?2V;wb7s`c2Mr^m?^>hK6(8ym|WkkjwPE;Q-08KsD_T4 z5!^b&Y&xErn!DtbJ!{F5amvPwv_^QZst8@JvG9UJEZLLK5sJ5{nV}zJXTEMJ{n$6x zc$$v5#JLx^QJ-hV3nm24+=3;FEm$xDy%y-NgtKaBWzCEQM=JfS=B%({g=$FQcq7nB!)x(3LQ2gbD(9OHC1q_bXrP=aIZrqYJE%s7keo5G`b4i53XpnkX&( zNi~-K6Ao50RP_yrSF*WNRs=$u@gTSYPAUMG%wWxe5jYBJ_zRV|uo8`-0liC&I2&vI z%(4T)?Eh%wpIP>cUPi_8@Mu92u4V+9wo7telFEp4z(-zI5}F@xDW;0qrj42ds*x$#9q0j{!(UK&!qj0tajdu z86YMy_Bi1+ZAFSx?`6lL1{!lp)(VhOa(8Y~Dm zaz!awlASh1{Y^+RP@*d#%afpm&qiCrSRFe|v|WrUK1ZPFk?4Qr0a>6F$O1#1mXI0{ z80cgBpvtUSe5^mx_quN#iVhpn02$5)q}` zR<(k#fEid()~L}Bz~L=nh~hFvV}n|-q8*F`QF%g}QHhjpZlPUrljw5jL3W7BV}h6w zNS0<%>l=AEN1MThA{(N|rfCAB!?w}sEK`LJWn0ojQD)etm;#JEQw%gUMO(8?;St6@ zdMwFMa(rwXJvH1fWQ;7YskCL##%L}9c;uBZBqu~exSETBgySJAMq0(+2l5<^|#gIXb&8UJQy)x`y#?SJY2pPCX7w{>f*cZ^SJ+b zzdb!2hueSdt1VLE>=u;Gi@xXx7#aNy{#b)D58q2}Vu9$FTL4N-^|cZZyj^K#@u(t9 zsS@(I?G?0w&BP6L*%u9mmkG#KqQMZ=kk+iQo)9m7+p~yfo)utbkw`piJSN=V_>e-y zH9=I$S-u1LAV(A;nYWk`_#eUQCm;WJR7Ad{k5AcBc4idB0K z0zyT9H>J=+Lb{kupKDRqhn`GzCCL-XvP6zw z2B_I+^cXBQ!z&7RZ=|E_wxb%NTN*?$78EA#KB&%Yua9g!+}~+0lLj2BPp{wgr&q3f Z`uAa=D>Yrbe>wbKarpD)-`8I+{s$Qn^tAv0 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json deleted file mode 100644 index 59b15a0b6086638b6215c1cbad9aa6f28542787c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10645 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 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40db..00000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file From 6fc537669506020177b31916db04b88e2a3db4f4 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 07:57:11 +0700 Subject: [PATCH 39/65] more fixes --- ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74146 bytes ...8a6c7c92c604537febea6e2287e0e3f386284.json | Bin 0 -> 24260 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74146 bytes ...ee4e5ee0324e5f38b49daf9dc9d1f1384bdae.json | Bin 0 -> 24260 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74146 bytes ...8a6c7c92c604537febea6e2287e0e3f386284.json | Bin 0 -> 24260 bytes ...dfd789f4e600ee4aa306f63d281b740f2d0e7.json | Bin 0 -> 24386 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 0 -> 8844 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74146 bytes ...971699f696f184c08c2a12a5930a1d6631661.json | Bin 0 -> 22350 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74146 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 0 -> 8844 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 0 -> 75616 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 0 -> 8697 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 0 -> 1466608 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 0 -> 21193 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 0 -> 2668629 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 0 -> 2437720 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 0 -> 2425346 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 11193 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19709 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 0 -> 13996 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 0 -> 14923 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 23447 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 23447 bytes ...428f9b6b120d8fa853e3398e1539b8fc54d9b.json | Bin 0 -> 29547 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 0 -> 8216 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...106e5eda740be44679cc960ea35f2134af628.json | Bin 0 -> 10892 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 0 -> 10644 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 0 -> 11317 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 0 -> 11002 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + 61 files changed, 25 insertions(+) create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.546154000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.598081000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-24T00:37:29.544194000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-24T00:37:29.598737000Z_DocumentQuery_f7b86e21e5bcf796a7c9d570c64ee4e5ee0324e5f38b49daf9dc9d1f1384bdae.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.546204000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.597728000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.611459000Z_DocumentQuery_254e866b054c1427a47d649d455dfd789f4e600ee4aa306f63d281b740f2d0e7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-24T00:37:29.543524000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.545143000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.598817000Z_DocumentQuery_d67f67ad2f9ff259ca475971fae971699f696f184c08c2a12a5930a1d6631661.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-24T00:37:29.546319000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-24T00:37:29.544535000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-24T00:37:29.544223000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-24T00:37:29.547687000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.599078000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.754758000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.598966000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.606190000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:29.598638000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:30.085258000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:29.599207000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:30.072218000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:29.599593000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:30.072303000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-24T00:37:29.611908000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-24T00:37:29.615871000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-24T00:37:29.632356000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-24T00:37:29.611949000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-24T00:37:29.627284000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.629157000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.651813000Z_IdentityRequest_abf7b19244827334575a04cf67f428f9b6b120d8fa853e3398e1539b8fc54d9b.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-24T00:37:29.650095000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-24T00:37:29.650285000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-24T00:37:29.653372000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-24T00:37:29.656446000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-24T00:37:29.661820000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.546154000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.546154000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..a20af6fd4f943c3e621a9b6381ae300774f904a6 GIT binary patch literal 74146 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 H-@W-iM+pgM literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.598081000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.598081000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json new file mode 100644 index 0000000000000000000000000000000000000000..2ba70ef6edf4c8fd5c67fb9bb2a78650d8a363ad GIT binary patch literal 24260 zcmeI4+jrZ>5yt!MzXFHH=lG$K%7sWtOrLyhoWyAw=hDV@6^LAkNJxMINI6QH|Gl#d zUVz`Hi=Ct=Ij8nRLSlj4*_m%aIxhXzvY?Af4|BrUq79gZ29u?aWSqg7fVz9gK||&{Ny7a_EM~7vz7w7&ph(iJ`)Z1 z^V)tpo4WOt@^#^>r_ro~$7lCPA66F^2SxGl$>jOj(OEVbj*f>e&p-d{>%*_ctHXbN z`Qadc?w@STT92oGo|*RQj)=XDBA&@Q!Hc+)0MVrNX!zDEvUz-bkyWO{PwdSwK~;+>1CT=;64%Zy=k zCs6nn{`HFB3$y%3KlwDy{U{0_RtVx|^|;rPDm<~)boki(yK&M+#%pHk%=~JnlQ3^@ zRpj5Vf)D|JtvfsGch}ykX_D2`4cg4~nE7p0RQYjPP3rwH>laa~*4)3x*6z>pto|)` z6(@Y#O|@;Z{oJx*ucPO-rFyf7+_r;6lW&})URHT=E*s32OJBus{qGmq-jDb9zV7dh zUhO{az51#D-l6+>cjeVxPBPDnk9~2zoEoqWfQxzd!*=YDgNw4xL&&n{`gm^Q>v5IG zfEIkF@t`E`aX<0<=ljXM2j%I#{kA7{P~39DjlZ(Sm~lDvjhU0Y z*lp%o3FqtQZy%S8A>6HWqC<7xrGh+}{PF&d?Pu)(S_zRF#ZWaKHOkXt9IWKZf%~gWl?W z-hA6v9Vg6+#Q$J~*fPcjC>Bioe6hR?J~}okZ9bpb=S4E}7k;+B>sPvI@^_=>F#?1t zBgC~>Wh9YqS}ZFzD|6lYCJ(Q?F%4fm&mvR52B%q7WtUXd>E+Vjj{^;3f`3`wd%E=V zKr;{Md*-v(j08;{ILFQytTL89T7$W0hy&2PYQ7(E+mffNWcaGCoGM{JFWemX4w40}{THw}< zxq(CDDs4~%0XxK~k=R1L64XDw89|HUUVb+-8h^^_Xuvwg`(W1pr4_dY!4)>`nXi1> zE>oeYo&}^E$6LNKL{Q2mlStFES!ae$&m)LrG_?)Xhhk&<7HIc08kI%0ZAy{TvYh#>xGDr7#(X|Cm6WkQ zN+$j+H%6blo?2?&CCTls>Lz<7d#3(N)9zoJc9ngP`VO#Nv%#2XuUfrr*Ikm1ZH;wy zHgV!sn<`|@5OyL&2PsO+V&!75O&M5oM}4%w*zcg;Vp->V$Bu@-)`N#YF%-BpNm2!) zH^O)HP>0~%=yrWisHk>Zf}VPB;U??uU1*@a=T6tWyPa3NyWUWdomlgpG;;(fMcm! z?c z^vKux-vY?`OATA@(8lWn;M;XtYooJ%@_}&=`pzyNT;USkXdDAXGgG66INxvDGQ1L% z9TD3i^{x=6J#Id|iSJjD;oi+eI3)IKD~UI(GC+Q{nY6M)ilm-qd+G2nDbFGwHCkmn z*cXuthl`n2IR-;3{3`1ZmGdO*JEALV0e$0hvAe!iWIJwe!DfoNE?S97w=@09K=COH zs9*0pQM3?@ z_N+H=0#1#)oy^MdcYboRz0(Z`$E{fH7v(tgeOnOgE%UiQiDhxm9l3*%8}$e7u)BhJ z)3O|wv(|xOi?Q~awVQ*(!1L^A(Fako*@?}w2E!Ie2BW$;huisG=#-ado$cC&&#Usn zPfkxZgD=)oHC(JELAZdL-W`v28xP~S9X%tq1X2fHoesFb=%~8@8|FtXEk^+kAyEn$ zO#R&%ox>C(+%SX)X1DGPvJH3K!b6bi0N)*!aDB+&2H>{Xqz(=`q<{9|;u}UU0TeCq+)4=S@d&nqOqdW~xg&;dW-LdQx<01BS263`&-hjwN|^}6Na7tZ zvSU`3Ei!va4h4)Hu|9+h2iPJ}azv#b@&RB#+%Kg=rvuD+2xL%(G^L(KaB)XyrUzKV zapMXnGMpn>gmaR>ke*No>=T-N7ffS1wS@XEmVLp&K9hqjzT&b%%WLI)5H$r|+ zQ>4!WaxC5;c`NN>3gHBdCt!ghWaUr=%I=xnx{WG@&niONuapPyj=|rJWm?<_N}iNH83x zQmGTi35nn#l}5ipQld^r#5c*Gqt=DB3g@JjSnATy(n)f}ii8ga1BpP#FbsQgX-Y4n zrl|-PuJmg+pedx4*au=ATUGFEfX7iJ@yTOuip1LykPdi(gsIe7M|fa}?=+o6GbWEi z?ve#Oiwo^@z^f=Tpg<+12hdtdpP-YZ)Z#JsK*KufnP^fsWAc)$%i53lQ}_{}^df3L zWiDeT0$K#mPz#~LPKVPrHbj=r1qqNeYhYWV4<3gNG5)Lj(4}b<-4d~*{FgDBW|1dE zE1W^vC&CIzW29el>l$=RkSmSr~)uuVDch)Yogb2*ZRIBR!L485sjL2SS=O{b&=Ols~3 zFw{D?E0df~krJu3WrgmHJbOwHK&rH8g&G|hy4G{Is#2&UjgRlra80F9CL)OzdMk?| zMhHZHDxs@YIKG^(ckjkrV9Ab8-%f6R37KIcl2x!Lq0%fc0KAmmC`A&}h*MSvO-XBs z;|zw(6cTS)^3uOp_e*)o37`c%Fk`ahIjSV0l$)T(rgDBv50#KlP17IAg;Q>m#-$He1EE&WtJ%}hgu#r!aIJl1 zm`1pjsG4bw_!A#snj<4+$5BHAcY#dH*e!>r4EB;1m7hpB61*@L@Qnr~YwWRb4QUnd zK%PlVD29_>I->zG=a|^!MBWK*X;7(y^ejS^19z1C!NQeM%&{LNkrMt2ZzPG8c9Im| zjc zkaADL=7}fzGpkJS8^-1v6Bc4BzG7w~KV?|pS%Jhy)}q3k$b00~M`};{$3o)i3l!SX zq~c#RsdU91BdjB*WX+xOy;KUphK*wPV=on!Pe@vK@{*<~i0vmP2jPQESL}&N z>erSR=nL72a3;Qt$H?SJ)OdI$hcxV>+)5O{ha?I)sp42o@Mua1tG4x+>E$O8z?W9U z?A{7Oq)y_i8WLI@5yFi+dV!=jI1#NyL`hMkp1|DY*x|fAzR{PcI$;iS*rRP#hJGg? zkgzJhtPyGsL7CU(Na2=#g1))TowIm{`Q%*)aYrE|q;2ex$g2$~TIDnfd4T~#-hy$I zfOcR&5XW&$Jw&|(DN<4S5fyRI4y!$W59+5p!uY38>1X7%=5GW73ON zZL(!2FJBNG;*{cJLg*M-NEPIryV2lU@YMOa{o>dDAcsIlLbX&XYF6pxumDxwh6uqV zCKJ%TrP<)vU`h!EIkD!sh-MJbQ3+FW`s#S-#CD%!!9r3&_9e7aW@I2^zHpMzS&m3U zS!zqdSAGIXo}xl9T#75RuO@XDUypOF9;7=YM3V)sHcM}9A4qBf0T3Wc_#oRQ!DeBm zJd)mn@WYmq;~OesJ~ANWy%(s)*{|YoFldo0GAxNQMLA-_!FOK_c&x8-#~=QEef8q$_0?Z*?(FU^ zC&&N&;bI)0t}d=FKVDp3ef;;hI9pvDFRP1-)%ayuJ+_>TkB^O$@BZt%omXd0{^{B4Cr_We zezJ1>^`Pg^Ui|R<_4Q{*%h}QUrLI5!{^hG@kH3HZf|a3v&VIzAoe`zu_l^ZMoYFMoXe5u7V09=%=r z2AM}spZxm#rzfwU?L>L<LSyVqtf^j;Gx*(HnphSC7elubn={Fy&qkZ?mUc}#gpv~5ifAaup>@mRG zDdUz^MD3nfN89dtj}dM@(6+0{yScw+husHjhS**E{F*6t_Z`1xjNSb;YwWJ~nB(RF zt)Nb87TFEhW0KtmYc|w5cbL;yddeq>F3djZ~DvjAnuag5Y4T>>9xkC@IViS-+I zodd;+`#K2D6tu{_Zg_6I0i9qMIlsQC+QAe!)?0Okp*tdV%pgQAabOmW?K5RyDAk&t zK1X)Ae|QOPXsU(*Q1WJc@%sppRKFSoeSVU;uP5}ZmL39GmHe+OtgbC3N(~1^! zRt333iG$W@c5#Kq{gf#Ph_tzu_ZzhcR@n#wombcRgiJpd19I26%~&y3*`ECJ$0Rw- zE9kf_B;15)ZWr`&VwpddGeM==TyOQgt&{EzOgr?#t|&7=rvxyEoz|-uX4cj{dE(ya zN6|2gi7P%QnhehvF5&hGjPFJQNH-7+R#f=>>}#?xDyCit`KEhFX|I{*Yhac*&c3RI z@on;C>Ing3q$g%-mrMcceF>iY3>Z4F;x32n_P=NkzMj~DECoL#ks^`%vd-Q2C?sl5=Z=Y+IwJei2|AenTkrh~BB@0&9eFFZ~K{c=)1_ z+02jg!J7lFh&zu#eEtkGdMfhZ1y&&y80*vh9W%uuxX3dZkH5zH)q~xH58gzY#A7VO zJH=W)0E7u%_fR&vLvY$ts_@qO{gIvB;c4pnyDDWQjs*$-2%XL+O2Iy5^449tu0$MG zbVw(~RCtEFdM4A^9BiNmky>vO)EkW@LN-0rGIUviy_(4sUt;6dk&ZhU~H^tb5<4S(N)-6U|RZFl{{_5U`?LQ0p^c$QbcpAAzbd^5G} zus8Weid#$1wiYvlj1-e8Xi|@)O3Dy{qnsN>4}xZdmEOi_CM9gEMK#e}p`KLMYFaT3 zxdfF$IK};iGBs`x2c=ieFE(s9A3`BhC%2HLSkAH}aXAnPLTOXSc~uZBk>R}Cgq zDml6aY(aQ5F|0C0BQriB&Z4T#rh2Tu;B%9e1h^0QO^4}(s_leMP%8*k?dA-wkY?8h zoM5A$j-4e2-K`q(KruK|YvkZv({6+)EwP$v3A-8ZJ6qC4Ekddom{9DgspfixwS>e}s4`5G5WH5(fo@f_#h11-ycOFV5vhIP zPf^5#AyOz?M*JIG5T%{(4U|mN6BSP|Rt<*zFU~rL4uqg1a2>)xC4`;02D0 z+~PUBNA;E+yIa zt4z0n9(u?2!0_+}WRQ@S=Lznh8?%gpc>60)CA>Sx7-Qu`FX``{wbuEU|9Xliy zx8*TfXoX148-u=bkYYM#GY_;&yZ&9)ebvm+=>iTd)!XuD_abUohs}W)uTX}TIwDYH zjg7Zk@&q9)7H`pJF=fRBMjK&`5KeJ_p-eIx`yN<3QMwVw^C2OhIX&rAD{GCj@dkl% z6w8rWwtUZXMl_t%GnvzRN8VxLxH`m8EGYU91uJBfJ(W)`Wd!t zCmn>XVT@E?r%cNSK(5iLs}yp4fp-Ao&5Z&_h;?5ls?J~x(?tp)k_R5dn}^0$Ts&99 zL(vWM%YK1Pt2Ago5m~t$F$H{dpGuKMvxb>JBT_mho7hPRscROd5V}ESXC^`YAl_E;LdK4TR>hWzDp4$xrzTokF~Q z3C<*p!Z1k9Wt6C=iJ%9lLt8aH={Z2k=nec~=Z!pwW$=Vlq~(>-a-vvJi(4eUD1nfl zLT_W=hT;B<8c^r3NYm7Knm2P!qclE?FY>EvWW(dHnF{H}KrM0qZv1d;g z=F%7`>Iz0;#wAoEidIUau2X0{p=EkkC}h?-0ZmeA=q!d~2@6--hJL@(5w1|XIRX*V z0z`=zS}9uqD%D2HSF8ka=YSG*rvZtg-DU+ZNuc5S}7vd|y$Q6*sBS08%`peK)2=S8>vc zE@B3Z4O|vUuhK|HGhZ{#9>*;-)rq$dQzx3&O-G95H{g7}ysQfyky1k_I$-0~Prcz3 zA;r$AVWwhJF>Sz#d{8QIO~sx|IenX@Q^@5B!GwcdbrqRqkV*k`Go@=L&O2qSsZ=xb ziuIr-LNv-hK?quSKpYSAb*~dbFm=j&`%Kg6;ky%s4u25uU6mp49>mEFvQ?9wmCQ82 z=GfLj8%Z!EN!)Kllu--(a}umALM7A9kaVi^+EZ(~#si^}sThZ?kL$mDw*P&v(2OP0 zMgWuP1E}O!KL}{EC{nWGBxhvTAWdPSJGdpN{Xa+Q$b88Vh&p$@3+Ad|A(!Q_omtU zEkOhBu=Vl5TG!@+Y)nq)gnnqcamcx zn1)Na$ksevNrTpWWrS6;IqL2UY8-*Z%g{ z!#sW%{grNakeK zh?N*=j$n%Ld!s#*#-4N4W#71i_rZVEbb`jMLLT0<{?J=rAGKj$?Z3eVz~2!%B==eI6L>VId!am`tdK#?1KE(7 zilP79*|k85qIq{Kr>$Y`v zfPW(_XY5u;8=WB0WK!QK6C{bi=-_7lti2a7W`_7oV|nrI5quh*Y6j zW8vP0NN8-Rh5zz(sOVL$2@zw=Oc82ne!#jl9;6w~vS`)_vm}e@^9DZF?E$w@sT6HAT*MJ(-o}qYMANd(j9kK^ zw!5i_Rs3@xE%{tqC0|quGiRmSAQ$!-JPd<&YALI?u(R1EDB}e z+t38|c9A5DRMh#Pgh-+38U<3O_)5x<06wZF*Q#npBy)!9?SeK4PkwTatZE)iYy1hY z^-0n(_>G(oqY{yEd_AIJ7LVnFXby{Qz+jfuDh4^=Px4CAyojEE@pr@g^0iSIBFr8N z85r+amQUT;AeN54)-wYGPD_Q~;)}d3+w7VMytji5VZ?SpbFU6B`N;szpxuO2x|?|m zl^3;?vM5YR=Mhj#P1B@*eAGqnZ<@p3HUIb?M)ocIYExly|B~*4=+MOhUQxpgZ8qrh zZj%@cu~JP^`D};{Ni|iG)R{csc|e6krnYW8uwfeY44EKQgvbCnxKW%n74!bM`y4NO z$h(IEaZN7f)u1~Gqv_n-NmD9rfF_p@^VDHE6YTr-;u$u`+gWaIwk>plgsgeEoa>M- zVijaj+7SXI?)PsbZdB(OCn@djnn=@;JH}Geq%f!4&;ulA(KHoVRF=&Y;-sdj17>0+ zrWH#mnvrHGi1D(fVrNbAruVaRzmXLaLir$iV7r>znDX};mGc&_&>)pFJQPhU*MAVl zRC$>*>BYh%BR)Zd)XUOESG_xPqWW#{N-nINQQkO<;M1baDSILow-YoOp-_G6NjAt7 zid{C=W!d7{XnrS=H)k<5b3~Z)7+T9d_KZ*d#M=U5`IPSxd*46r8`DylI(|0)SK|uz zl11rlsE8O(&Gsd>A#_k`wwy^Mydrnzl>fS)V$eH9TjdGQl$or^3bmHmEE11v!Q=W1Ej0m-Ba(wBM0<9A9KpgH8wY9nD7Pb}vv7D<`Zjz`2HnNxg{RD@RSw%4d zWm_5txMOnxBK&T*<4@t_Q%WEaB*Mb+R9$}zO<{ykN^oyqSf-n!HXxmq(gmr(<)V6T zqbkFnRV1n^w_*j8IayK6>1*AoF2ldAE(zcsvD?b%WcAwMW7mjSCMzA%HH4yyIYTI- zO~};#Uq-V#gVk2Pni(-wq;udiz1}HAYb*{0K9v0cPYUgb5nJ~d=6P4Ydd5;Lp#+9Y znZpsTF!vrJ*xpG38^uK;a)uye%+)&aA%>B zasqi&Y`0gsfem_6uCE&c%4nPswrO#Yn#(9rPd|Je5)Z9Bh=BI;#h*huDVD(#+)bts zZIa!*vS|TN1Z=2@kQ*J_o%L3;OCUS1Ud-g7i_}oYNnmf7WEWGQdnz~G?#0%XAP&a% z9T7HQjX=UFiU@_U9dU$a*#O9NN;Cf_h%FV(E@QT+9HC;~&*m%f>+`|r-BX%V=2SzO zZ_!|frEFNcC;^{E6MXv9DKmqh%P!Dt2JhDp(L3dVhKQ8WGx^-gF7Y^3EDvk|8Tzc8 zI4s7PTB}pCW)-7u;4;YV1b@gEA*3qBmT=7)HIy?L3su~_K2L{pq|OlV>6`h(o5Y7V zi9_Q7KhbeP{o=bCx1kL~xV%oHZUj0c{Ah@Vl&z9B_Kl_tI=7zeqnu$Q6^rW5(1t*+ zNkdpw^}1rEGHPPQsfRPn_vDgXo`Rt+o#KCL|BWI)83va{P~{R8^H_I=`G}mQRFQ@V znl-d73hXuG5*$FAx1{npffmOCZ!W$`xkLswvKPNfV!j@Wi=Nn~Dc0f|rAg$@*O~JM z%l_`U`C<5{6!Fz1>s?{_;cq;iqx2FIw$1M^-sH!}H0@%1ooKjx$5V*yn`N9DY~0_! zTyF8Q6uw?gwVV+2U8S)wg+IA`iB7S~(0lkMb#ZoNP+M>f|9)TKG_LTBZ^4f4GVd>{ z-Ii&Ocmie@;d6qsB_#iX$YTCo)B*w$;){W9)C}>ui0C0VjNs)2gk7TMMxmjlaMq%w zq%^m1M*DS4GyJP*Vs7Nmjh;J2aI2W(3Zxe_H4e7OH*HL>XRI--wS75J6fxdpyy(wt zs1EBs_kqU+be=uCVM16Ih6DqN4)h4jmViPmPs70^vRM0@@lU~w&&#Ebzl3`Y$0cuu zY6W%jtKdUC8PEQ?2%=jz?X#w#|GRgYS>!Le%b#}*KUxI%n+_wjQ~ZSji?vhAFJnQW zhb~Qg>C$0Djzr`cDfkT7Eyp~d5E4~;KVg#G<2%wLEMS&iLb0mu7mhtH!aH{?pE8@A z6TD=E8pQjS@9{+JXxT7KZU(5C%Q9n#+5BlTw;$SnNuANtB5|>-93dX_l-y{=%*|HH>Rm}1)^`P`;IhfSHL=nmt zs}pTL{AFXADTUe zu}?ZT#H5xXLR54Z1xarNk=_zfX^KW7!Q3_c_RO5$j3rH%${{;Fi;K2D2na%}7s`>+ zoCnP7Eu_WnKI<$tN&$_{JMJ4oDB+l5#Ij9)F6m15WzJ4Dpp`Jv+7Bhr4-!HGXPA0K zeMrhubm(evZ}QWRmU!8}N;k8}Qj1mKxcKh||jr>(> z((|RxNysHA6Jyy7msu&iv*v4_| zNTUZJyXBN`v@N=??V~w+iLtE`%5kBvltQ*PzNJNx-(x&E`+p0Tch&Ce|NUiGvRv1VAD(>k?q6^JfA`-v H-@W-iM+pgM literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-24T00:37:29.598737000Z_DocumentQuery_f7b86e21e5bcf796a7c9d570c64ee4e5ee0324e5f38b49daf9dc9d1f1384bdae.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-24T00:37:29.598737000Z_DocumentQuery_f7b86e21e5bcf796a7c9d570c64ee4e5ee0324e5f38b49daf9dc9d1f1384bdae.json new file mode 100644 index 0000000000000000000000000000000000000000..29d1cf16b88efc2518d988a40e331e8a82232216 GIT binary patch literal 24260 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.546204000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.546204000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..a20af6fd4f943c3e621a9b6381ae300774f904a6 GIT binary patch literal 74146 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 H-@W-iM+pgM literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.597728000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.597728000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json new file mode 100644 index 0000000000000000000000000000000000000000..2ba70ef6edf4c8fd5c67fb9bb2a78650d8a363ad GIT binary patch literal 24260 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 Aq5uE@ literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.545143000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.545143000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..a20af6fd4f943c3e621a9b6381ae300774f904a6 GIT binary patch literal 74146 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 H-@W-iM+pgM literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.598817000Z_DocumentQuery_d67f67ad2f9ff259ca475971fae971699f696f184c08c2a12a5930a1d6631661.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.598817000Z_DocumentQuery_d67f67ad2f9ff259ca475971fae971699f696f184c08c2a12a5930a1d6631661.json new file mode 100644 index 0000000000000000000000000000000000000000..1fd3f33a52259db45583cba47cd7ec69b36649ae GIT binary patch literal 22350 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 H-@W-iM+pgM literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-24T00:37:29.544535000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-24T00:37:29.544535000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json new file mode 100644 index 0000000000000000000000000000000000000000..3cc40f9459efea8dc9fdbf85fc2b263fb47895e7 GIT binary patch literal 8844 zcmeI2&2HO341|03Qv^EqAX5K*m7)+FTaAszR%*)uiooyQUB^zm-?+`C$M%p$KfB8% zhr?MaFSEP5?0MMj*W)((a`zH0{bDs= zZ~Mn_@ncx_Z*N*vwpVWsPvc@0CdjYuP3z6jZ}xFoYpm$3%S)@%6~cC=aWOvj?_j$E zQuey`32E7KzF%$T(-2LWKlWjsvvZD@HM8BYKRm{LyaG0cBRXvSp48U zsbL~Foo>0tV^~)(uIXslUcjFr7x8|L5#lauI7A#&z@-JY;Ji^{O2?)wml-g^;L{2N z=yPjeV~e0#fiQNsHo~CB3q-raB;zJa-f-Ax9kAR03|=sL4g6w;DXhgCn9^zvs4zef z;uVI}+y|+}2ncS}m<5g{$Q+Co5#^edL=+j*uB%-nxR3db(V**GFp$Ij&P9#XZvq0L z)rNM|1Up`+h{Oii7Q0gxaltxw-eLvj1|cNrXazjgVhS>wR~R7i#vTD$5{4wB(E`SS zgdm9{rH7~&lB!^25Lt)>{LJEq$Kq8tdW|L7$x>d?vqW2Jq6s&r&k+_WVX_)-ICGy9 z(g!&v(3E5TxTGz@VANw$T}Z0rH)gpSMHNY+Ajc9aG9%;C0cK$b!|(=ty9Bu6|G z9Fxq2mZb2fR7|&-oE93GP1N(+cy#8q>dy{Kbjbe#k#H&n6M_do5h_MnjxUnQjHS~i zWAGHgw7Ml-FUSvNH#d=S<-FU0D2-K@qLs}#K_?3o_aUtX)rV{yxKv)|oqCfy zXRAk!Npd{Bp;_QwmRdH=1Z`dUNAT>|58L^4*u}2`DRiW1VO-ZGtWpL<%kX4CuH#Wd zCJ^2drlU|$naM>({K}z>#3V^UMi2!h!c*)9ld-IjQ&h_Gw8GAbNo$LaFs2#nr@+@M zxP~1&HG*YCQkf-LDASpc zvMFcXVfgez3cFV>&St+%K%$dM!(4mu97V>(g17)zA%V+Erp-6+D8 zev%HY^uvTBC?%yBlbFJn))b}EyO9wL1xgxa;9rW%Zai$`cm6~lWcTrFaK8?pgKsGo z=MhT}VHDsZ$5^PyFvJcKEtxFhf;v@Q|Y|CS;Cd;S0XmkqxGHGtj1 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-24T00:37:29.544223000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-24T00:37:29.544223000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json new file mode 100644 index 0000000000000000000000000000000000000000..4fcf0041b93d73647fd553256427374bf4c79b62 GIT binary patch literal 75616 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-24T00:37:29.547687000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-24T00:37:29.547687000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json new file mode 100644 index 0000000000000000000000000000000000000000..4123a0044a3bc071be2f3571718b4b90d43d2223 GIT binary patch literal 8697 zcma)?TW{M&5QY2fUt#dM4?M$rfIOr?e?Xs$LQo{u5^9;QE&+;Kc$c6~^fe?C8Ye*Ed@e?At!UcL9n z@4tQexj!F^^J{-y-Y*{a)0Z(Ra@?QB=Z8<}@28umn_q6S+V5Gh8;{HN^0>UREWNZD zw|ARkx>rPVt?FvpkBil2xqVpNPpf~%_2PAWv>^EMvVqY zqI6z&xDf$kC=icTLV)USu7Xp*@S@2DsiKN5(9luVapCXxKaU;)Ve~HI;dn4 z8JA(0>l780?%>J_TZHLEGi&Uj8d}R&&@DjUtaX%w4id zWe%#~Qnq31%S>ptWm&;BL(oRpCFpZ?(2@LFY?uSWD#D<}0;1g*6^l^K8+QC5w>7G1 z<+p=hBvx=9nSd{=@MviSrzb)IG*AYHM>Z(|W=u$?aaJn_Ra6NYtK-UI6>a(*;rI*N3M#F6yX z4yP7xmll`NI7o-3OXNj+G&oYNAI=`M#RQiY3d6gcWCZmSw7G_779y96ijcR zP=Z0Tg6hLI7R<0QhM^ILT46DsW8knJX*tHSELIj$1*7gm{ax@Jws#N9<7uD2ILx7A zrP}uOuv$;D!4NqF2{D_P31E8rv5|GtM&dSput}nI5R^4pQrPK&V^tm%!~+XS1=*Le zHIv9f#(p7d==8qG{5gIy_(lWQkf*p3ESHwboNw5y&j=Y$4?b}s(X_Fv4XrrmdIRnA zvS-6Q0#Pgrt}qej#3V=tdxnNK#${0?FY?e zKb;=(m)%)wE34W0D*%qgn!Q#sX$qGa45Yd*&oMr|m2Ie%`H!}7V z@tkR29F3Zp2r^Lv4B=o$J_1TD@`Q;e5-alS^m_nv#MxojNfAdARr6iKa%Q{7{~j}C UNe9f=mHGE1^3Th^=ii$6AJ^j7TmS$7 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.599078000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.599078000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..883396a628abf2e409c01fb761dc2ab56bd7139a GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.754758000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.754758000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json new file mode 100644 index 0000000000000000000000000000000000000000..4d1eaa7fe52c1c0dec4bfbf96fcf9bc1667c4143 GIT binary patch literal 1466608 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 tj;z)#tGeN;crxGqzlNo|-Jk#Wzcd^Z39 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.598966000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.598966000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..883396a628abf2e409c01fb761dc2ab56bd7139a GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.606190000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.606190000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json new file mode 100644 index 0000000000000000000000000000000000000000..4e023eea4eade7b2df86de69c5b9d362691c298b GIT binary patch literal 21193 zcmc)S$!=W95rtu|^%MfvUNDkl`Be;qU`uR?FeSD*G+;FJ?yh1>YS#DD;>Lp(lJ1z9 zF`PINk#&E2^Y-n*uUB{X*SDV!{_^&>?cwgk;rIV+5Y|I z&6hWSdb1n$wOM?+dboUl`Ea>?!|$_vn(4=@>kl7yGdNf$2j7Nzn%Ldd#k-G}*PkzL zZr}a=>ixy{JLly1{Mnt~)^+&o+{5*!tBX(fyVuUy9BpQEcs!^3BW#!RaQp7|=Hd_O zeV4*+0#9RKzu&#%{pJ0~PnQo@yQy5>Tx{R-ReoQ-jd^f)b^my?TgS7tZAZBMdGFNr zy&rZ`eE-wMw~K%M`l_8Y-u|J77Z2C0Zv*~*{bc{}nOJt$*YUFj?M`eZxBtMIPw>K7 zJTM#XSeyMf&N)+DM?5jZJ5Qf!?rE0iO#7G{*5bqw$EVEc^lblx&##WK|G;c~gR4Ab z&U4PPk2yX=aHm|KLl!lM%wbNLgsT|jz=(5#_UFVA#z(k8YZ#@lVG6OpIX&7JwI;eW z!F9|e=9EE>kV|gZaD%!SbuminSi$IOYgFGEW*536(`hOgjq=Pf$4#;3e3OA^CpVM}AMIz%3k%B%&R44H&x4P&gs=wsi%ylhm+q%)36ilBXm^B>WiaXB8H{&y|7LtA!fuvPEly0I{sbIH=fRhNhFb8 z3NPuN>EA?Os(6`7s}GKGzGXPX{evK8*`~Oeu?DoHY*DY8K@)SRoWoI%c*O_@^;RQ5 zNu6oYYgEPS$;1_%$f_|Y$&nKVv??k>iu8L_&gds2Js!&>QncdS8AceU67N+z#t=a! zH4SY>UXpd|%&Brj_(3TvFW9j>GoGk@;F?aE*GKnZB*|$lJ`f9(S+K*D7C(&$Q;I50 zhTZD|8y#KZT}B#i$cZpJ)e!O+IRd%sgjJm3g(8KE%7{|rR8Y3X>wUh{u)KeLq%T@$ zfxxnY0Eal@v&pZl0>~3*-VT4*^Db&4O9g9HM`1a?DYUsbT3RO)A%A zhnh$umXfucHTDde(1=&Yfl#ja!HQ&@C$bM))oN20&JF1+=v+EuY)s~#Bw0!xq5W2Y!)zU+lw1I@rrN3s2DVJGLx0r% z${2E$2zTP|Qp?CD24d+ZQOj7K{00-iBpZn>1Y`#BtYkYzj9J89AtmY1Z5H^T)H?y{N}6Bz4BRRFR|%XF09)CQoCBUGJh1~Fz<#-T8jfUNrzpPfNU z7}m5>uoZ993$)ps3h!83T?>|A9W$->WXeH7+jeo~l^T&dqO75&3L7eISsl@9fKaATKTJN^Kw1fB(AUsz z?Gq<5@B=0`&`kqkdV*g}W5320R0v&4-X9_nrePv3Pe|*-TGD8pbB@@;+QQP(!g(PV z*_Va&gwZdjc{TQw8!*SzxFmuhqZ*`v0rP{wbCua}NCyN4%Bwt-cJpoytv(x($BjQx zo^e4|5J^h{dd&KDwHE+TX$vRIS!VOmXaGWcI&_mP&TgyxC73xO3&u?ImzDwoJV;M= z(JE*<4nSYn>;L(>$~KwBBLFO}nu6dTzzSFKOs;Z>UYHg)bCpS_eaF+f6qkW6uKxE9 zSp@?ndhG`V8A{U4ZsHaNl7BA2Dpj#Ok~~@O$?gG`nSztK-3oofa>nW^`ka*4m0bd= zL_zW-I3^%Rkglru>a3-l@-+#S_JVcgcP0dI4%0NTlw^InyQQoOB!Y-F-C^w`%NS#b z8KnYnEcY2CCdrgM&N`ifBW4$&59GHt;l38DF%^SiTy9dv-^Y@%Ta=!Pim)ya4~mNs z8?u$PogY}jXu_6#z`~TXhw{883$(-Aco|pm5w8CD5Xo?}DtcuVZd3Mc zKOPJb7#w-o|LoA#M2-PP_vW!^4#Q*g{6shFeQDodELOtCl4NR@@oSBLWgmUQ9m;eg zoy{6S*!E91y4b~P5jvR3oLZK|k?hThNEtF46|~{D(j^vTWvL69rKNfmT96(jV(^Xj z(XDNSg0=`?gp{$#i&Nb1w%crUu#%XrMw?hRbCSd3Ij!%O_W1}&{ql!RFSNy=&?A5t z+685-7JxB>05_TckKcuHa&xx7FcgPlrjm5Ln~!YBw8x|MT7cYsbU?gD1mjMW0Bkqz znYZcprk*mX)a6s0%MamSpw2jUy7nQesSu}EWJFJ_Nd3U@7?5niFG(XB!R)$ihx=1) z4TX2%Mm!UB<6ZXfi+D*A453K@B1l#(hUWhKbS}p1=&=Ni*+i_Ky+7wa;DU@2Q&94hgB~6yB1}EpUE$j9wyF@8^ zztH`{d&>19Y*|7vE)W*VX|Ww=NRVzykx)m(!0asg*icA_${rTA7i`l^l~eWtv`b=o zZT&34SYXQjILS?ax1}oZ9C`B(g3I0ZGl07<-R&jM2S4q;ymxWE{q){Tj3s$AzE}iIpiXh5rvj*Rf#ES{v=5XHOrPgnP@(Lq&Wl^HK=TEHK?SCCBM!_ q=;SRWMW*gYC;yhPd}X^2|NLb~S+>0K`<=V*M(+On{_oeXNd61$JzB2- literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:29.598638000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:29.598638000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..883396a628abf2e409c01fb761dc2ab56bd7139a GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:30.085258000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:30.085258000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json new file mode 100644 index 0000000000000000000000000000000000000000..374fc7868a5ec520b3deb3313bde3ae262ce4da3 GIT binary patch literal 2668629 zcmeFa!IJCBk!{)I`if&UJ_80wCNuk2dLUCvx2t4bReC0=-sD;RdwVbgx0EZ}0P_=9 zc^r5PgNqx7ATrarVq=GIko;f&^zGX}|Ic6k^4CB8`9J>o|NQp9V%Y!T^6US{=&yhK z{a^m}yI=mtpa1Z$@z3q@{drJ4@P|MD=YRaI|I@Gk^83I3;g|pTRO{&~6o^ZKKnzt>-W`Q0D>_4j}JkKg^2!2|Lsrz{>$(F{jdGB?a{7p?d@`FFCTwG{5gO7^B?~FZ@>HR(*0V5{tG;R_MiUP z&+*6K|Mg%0{r7+SrT;3w|F_@8c}DsEYyCa``7gix^*{fu{~dq#x5ZER^Z)bVpW?j# z(yRE#|ND3Aga6k!Rj?&F6PDZc<3F@JPPyFily-T+Q(kb6E1t33@OQUY9?^Kt3!buE z@O!ljtNZD1yZ#+y{f}=8&T+*l__w!(_5AcRE_g}qIAv@2L)wMsyyMq=Lvdd5IDWz> z%1Q;a^V947z+cKKxvnRk#w%Y7%456XuXy7`xbUyytJhdM{v8W7c%e`& zH&p+Q;(z)Xr0&zNO{H5F{D?RF2r`GtEuS4_~0wgLehPG!kSkd8oGtHl9=N+ z;OoNI?c*5r!(We6i}kl}V%?V|pB81m0oL2>?O=_E#ror-pL*X^>rQbrZa&K4Z?D#n zP;g2`#nncP#kh+tIQSW+V@jPd3GnA^pPEzT8Fsr!uRT>ds)(6n%jWYjHmk4ywO&y#kvUAGkt2l zb3&}ex(L?W?TQ@}VyYOg;<~v+9F;hnmo`OQ8IHXe*THzoOY^O?nhs4zpj|+n*_Y0a zQ=JmNU)yQmG$=9+X1q7waVpkgT?6Z!I-4>MyV-Yo?@^2jCS^*UF$q*>)j80vfb~ot zo1X|J)?!@*>nXLylf_!BYhVo{D}`Q*)eL?8Uwa_7LP8)~1fDLy5g6WfY@;n&&V!RTSe0k#L)R0gR{a z3E>y^X*x6=G0!Vt4Lh7tYkq69Sc`QLtY^G5zl&I`#kvO8Idz7K5@Rv0f$^M|#v~AH zu`Yr&y!2F``flnNuj;zl&>NMguw zxH^v5YdS_T3aIm(mo`-t>+_|GoR*ppO-RghV(}BcurB4LUvR&*7>jWYjOnFmLbBuB zw7?3~Y2mb}IW2Nnn@Z}%OM3Af#yDDaR-MnF&Zds4b4hik*M|PWEMrOeV(KW?HL(Vn zIjnKRi6%r7Qp1GgFgA5molmIFrjBA=6KnW}DR2FN>%ef^-@vDH*tVCW_)+Z@tAJM? zz%jq*db#3Kv^1P@xnfr13End@=6rz^lJQN-lsv#9&=G4)jCMg|pWpb`7Cz$@v%67B zTEjW-7&lVZUT{u6f$zk=K?)bVum#_Vp2HYL7h{)*HI|5T>Wq0U)?!@*Yg|xrYK^1C zTC9s;4POLM;WFTzA24NNE!H)#&S8u>AjV=`1LHX_4aXwZVqFAlkjXwZ$2m1e=T_{+ zz6kd489A(xPl&Zx*T6c3F{3*%7ULQiPkHTEbVkHltczd`uboqC^#8!>sP(i}sNVVe1(Hi zy;biss5jP|VlCD+u+FKoDdM>9_MIkV6yxyT+7wZ&5Aoi`lv=;RWnc)WjZ?#ybLe{& zpH~3i)D>k|7U(CxFJQUgfT>Q%8(0);y>w7mz=S|Tw>uqgcvy_ZxCX{^>THVGox#{# zB91~7P-pg~v*Vn)<7m}gb&sh~VH#|&``}98wcku3S80#E>Rw0Pp|?92V-Bd!s`DAt z*_2UrK4Bl*)KRQ!VhtaWGa+b-YeF<3HB3kf<8}eK7;aAytS>nG z3t*IM^|^*V?{%(|`i)+RoXdF;&bPe-xP@GQ`iN$^mg^c^C-oVJ%ds5S;CSjrk#;dl zjF)lU%o0Z>Dn#VSQ6Rv3z5}jBy;iS-?Fw9j%p}*C6>=@tHMmZ4Y@E27j@auvMlp`B z&*q78T{9+!bNFrh*9}Gl!)?#Qrr~#7)3?{C_)&f(7Zw+<@v>%vJt4c8*q`i{V`pr2;{8X8MAp;s_}d|vwB|6~3*icx{{ZSSzh zwfUo5m&_k?`n*ZS)~wSw=!$`2D~$9Hh`F4uBh zgzIguu*bEZq^h4jgP(?+tIz6lO?_rxZ*~mu_w;`IUeoPs3A{arJJ~0ur1|8p7asG; zD8=Nu6XXImJc>C(kl9P$o-_DSaxK@tRv`WdtnKMDR;hqXj#)qN$L_Fw!Ts2i`fMKg zccNe(If`-ozMy%eT$k*h%<1(N#sforh(4sx`=9WBnw+1$Vr?hK_63963ch1oL#Z$5 zN$~b!xt8l9T%&`*{&rHo%_sYHc5JR2MZ1@w8+Ps5$dwOkkB8j73rA?AzyGC4NaiK7q&^g7A0 zdEyFj?B%!)$8&k&4MqdQZSCj65WR5MiJcPHiM#*?`x);rA{fGb z!}D+vYW^6P0DdB(`C}K3eEta5cKRQ8uqem+>%gvp582kxJ+AS%T+4M4uF=s*>b3b| zzbuZ;b>k?+@%0+hK)qJ4gY5!b15Ee|*ynaPPh7=0_UiL#^cikkeO8}q=rjA%*>O_e z;ohAG&VwTJ01BPt+B|Yxs{2mgGKz6L|83qV$0y7iIT7_8`i_|B#NsD>ek%QT&Ud_^ zfg;y(U4-i?KmCF}ph~G- z8}3~FR=;cLcT%6t6V>N4>a%>-W3piksAH^F_I?$u%5tj_U^uG=|&f=AzU0Gx~nU zp%QmuxIjSfkmKco19$?!h2aA%%CYOhK(RtjzOA7mL7!g%GKSmQ&qXIPAHT1$OTV9&+N+TNyj1#Wj&u6`3RdM@{SGV- zpFh5$4=C4iU4!eSKAR`@%jDSnoSRXIdI2iq06M#mYT!dJjPe_GVYwOkkB zdb?+_$2FcU*K%Eh>!dzI-Q`%0YjDi(XJlV5J5J6E^T@zp-CSpmN>uRUa2`pn%_mo= zV=vcrxXy9>2BU)E_8j3N)jZPoJC2Dk|9(gMmL%6;Q?B*nfo28Yft6yCYxGm(TCR(5 zz3mmiE#$eqnMaN*XW!|kM==WMbyA;kxcaO<2g?OGp7hhczi~)X->J`|7!|mNpJqQB zg1qNL;9}Ho^*dOvz&XfFa*bIc*K%Eh>m zYmSq8j>FY+_52iiZvLpAm(+6zF8nl>iOU5Y5A|7nK7~G;FRITa^?A}yn>WgJO|Ic2 zl0L+|QLamJo#VK{Kx4Q)M_|r5^z&5v6#4YgLyg~&*&3RycZ?fjk@kY+JfCpK>v)5` zT=2qPaRUCp2dHXS=-&$t_}Tel1B|E#{(SuMcrJ%>E!XSC?ctg#V2Q2)DSFG_|H+Iu~=Sud1 zmFQf*nzKT^R#_ z&(-so3kByvj_U;=W9Yh)*GJct{Sxp6d1R7fGy>&VeLjUgLx1F2u8VMu4o6b2%^Ul5 zbZo9GM)=DKlI;&}erJaL6M_HtZ@<2iqQh0(xpTl=vH<#6X7Sp2B= ziY4wV58!x#XIief*nE2T&%(Fm;R$kGh-Xa`H*N#_J~6 zt`mdX!})2xp6PwF!|xNcm*I|$uw8&_fC--gJH6b@6IXGLz509_eMW~veO8}q=<}qXhC7#Q zxh}#r6gTNZ%ooR{x9{{JqZr5Y)8>hCT=M%EnJ3bR{MO@~{_~3h^)>pM5RwA=&v}#N z8Vwh@mg^c^CpktRQI6%f2FH{7Y(A-9uj$v(=}YQ04p*<$>r?2pd8K+?Qm-Mn@XHuN zjxpTsq+>+KhwMX0(|F$$QFIrTPm6zh_yV@jPDxDE_8A)1gr&40oY zaY~&REc?V7%U-emSy-c4lT&NFY+^0e!ST_(^nwnjSc`QHtaIv&qs3T^YhXO*rMDvz zmxwTB%|3Pa)&=_1>|1jTy~gXvAwXB%RrfQfJJzFOE!H)#&Z)C0W54K*&6IHz;_#gj zQ^u9)*o$=`tl=9{YJG*vzz|Lwr$)5Hp*N;>Nc^DGUWG4y@8T6KinU%kC@f$?Afaq+ ze7q_8iigEmjB8*#)yL-BAjDd%i(m~eJ=LeaLhHp`%!^>Yy{?1n!0>7c8L#5H*$Eky zIGne}98jHA=Rmmt#&g~p4o0lSx(L=F6Ydx;1H-GS;_5hJujv@YIJ{b$DvI^--@AB& z%fJv$8^VvMhC@@tK0{0qdlkMoMZAGUvDQlmg%wN(yfpjN97A$pt}(n}EcRkw1p93# z0d6t8`QFBU4IP_H$We#_YMxVP9IZO5&Vh0PjHmk6H&ew`nq#jz*HPy=FAc|{TC3J) zP;0C|#agUuU=4SSH6VsJQ^j$e?K@4!D8}Kvw5g(4mrNDur8!QiH@|&B6QT);d4F{E zzMDF#-X+yLr_S)&sOKR8h4qsn*b2m}Ly_rifx( z5@X);K@*Z4=ca`zq|@RM(;|npsiat!#5#wuDWn*e#F(Zfg*D?PJ0*5XVxAL=pYc77 zu){g5O&wM16RI^jDXO(TK$$I-gLTF$q*>)wzZ`@Aa(#E?fqNFQ$;H_X*Y8 zR8p)QpH!e3=Fr0A5jj6rixF+f5j@iG0ANWUDP|qjbhn& zzc8P`55B#@TP}EEuQ&mJV1f54PI>EBuqozx>zJGsFvmW$abR zzn76F1?-^}g5euj6l=YAP*}lqU{#pI8kmc*f-1RO0a7+7xkRI`(2+2y6I;lv=k7YzBtgh6dRUhsKJX5@W?)g)fd3+XXPn zwQf2vEMP;D`i$m>9LsSHj;C7H?P8MHFNz+ui}(V)*Iv!{u78YjB;^XB;laa$JMsNq=pg7%$_x z+1DGDDCn;tz%UvZHqHw5TD=aoD{wvMr?KjkYq_q$byAh5Y*=lNbz509_eMUz^ zeO8}q=<{AbJE`Ar=W;IRML357C%HDS9GBw0)0d259M4~yC(3cj_dCwziB}j647ar( z84ic$iBHY<{f|+Ge4a>uo%0=6z$n-H>A?eqMobgHS|2G&rp9kmg5>6 zPxeF17ssWx@AMs`7zO=yQm@S$<@$tq;|<0GL%40s8Du&fnm0bL0p^WShJ4-#*3jU< zu-yQk9P6h8y9&NzTSEadhV6!bkZZXv!ZkV=bN%X@`C~T=V{_d&3UPe>hK*6b)$d@t z0M`H$J_EycGf!N_Iri%FY4jQHTzyubYv}W&pN2b^Yq>7MH551LL(CV)rMK_&A)^?_ z^V8;ua(u!(@eZSb;kNc8!{N|8@u~UdiBX1po=88P9p`+?9q>92^xuJP0iQB=f8QOA zLAjRe8eAv!*}SoviLtqk9ECW(K4TiF&+2oqU4d(KqyZ{?1%~Zz{a}`ZL$8zi40V@dIj+I+WWU3_aa?NqPTw(#QP5AbpPkfi^GG>AVIIkesxQ%(#6%|+ z52$6kLJwbXz#Zd!9?27Y|M0@F|M6m;s6L-jp8>l1{6Pj!PS)qEc^%W7YXIa z>+_tSe!r3<{ zHGIjW-!^|#&r9lgQlHUJSD)4AGwAaJAY%wOjyZ!&heO}**rmVOzm6(=b^rPS80A{M zK80Q*9g}OhuE90D0XW65J zRlH-bexF9a(eY5f)$bbmo%GjGdpVZl8XQmhYxBf$sqH&`$0$ZYf1T88^F_HXnUl}y z^(%}AhH%@MGsti_G+%sP1I!nr4EcN!tf4`TVS5F9a;%>Y>?-&UXej%7*>Q4SV4^rL zoEJ6cMUrdt$!;#j<~nl}qJZ8fImY4Yv-%t?7vOkuU1|QfigWDM=Q{dKzYPI~U&gS# z!p*DK>h&q~+B{OdF4^Bs>a+Qy9GB#H(odT|%5_by;T-1t^&1Q|hH&4wHXsAy&^)qF zA>Z%VtB}tl=k)sxFv_*-#=x*ZpAQ;}h6jf24gVm=a$JMsNqsg??3cx{*{>djD4@@i zej4(wUaQx^b_K4t*K+U~7`8X_#Z|0huU^;DYX~mD#jw3$7O2na^C|QhT|v2)>mpo( zO!{k%lX`CcI4;F~r!N`BIKJODf0XNz`D03-mkW#thH&FJH!>U!%@?1V@B1C23}2it zE*HQk*ZS?iu!8S^--f25A;RGW{~*_LU4-jxuK;d2uS;2dPaXwXo9|M0pk7pywv`a^wML;V^T zBv&4=@E`2+#YD;X`H~!)C$1(W_WF=fjN|LGd7@mG%oFGQbc4~raNE-$!{N|;u}>M_ zzu2pg_Z@TnkOmm#T0b2a7VsfCKh1TI9LsSHj;YV|A$#NGJn;RF{W3Z>*Oj9X1@xTr zAjvfjSKrn5V7ma<02AF*4tLgit|L(}``1qeZ&&oyUVz;l<1b%Ff?V}keXgO;^w*py z2pBQsv*lW@i*OCaO>%Ai_`I;b|HpOWD8}*pG<=cztUjMXpBI3P;kNc8)8TMu4T>Mt zUa=(OS4%P)Z42(vTCTX*EbP`VT;AXb>T?}^rX%J!=R+323Han3lh1z0b0(DUhw!dS zxz?A|@FhuoHcuRv-oDd^jA9g6C(h-G3#NhktUd?Z6}ZOg382Cca=7^Z#vxICr(Ta@ zRN#7hEk}@%!z_5VdaYgu+Xc8z>NC_`j^(%p$CG{<9b37U>mpo3aoMltIH~96kHcd2 zoql^1qku1&)AK6?97DKq%o$`l9GX8q=Zc@R5M{{UrwZ0~){R%dC&&7d!0!0^4DRJx zu8VLDzn#=;^Tuut#-^Vhg*d)mV;ZQ}>UFSPfNOvWU%}zkd~p@$*sIT{(Pwlt)Mxd% zhCZ`D&2dt{;m+k;&Wmsk1x|8p{x~kheWx!O#WjSPoF z^Tem-nrB-XRa5A*n54bbA3p1j1G$WtUjMYpUo@P=bHU+ zkeSqL^Gdm{$u*orl56uzxh~0dj^jHFG=|%A1ep+r=9PVl_5$@*6z7~YsK!voq2nmx zIClEfQ$E|Sh+2L=Ew?8k)g`Hh+`>u2f*`lik?2T@I1-SVq8e^Ss-?OJ)gUuPwRczR zI7&K>sh)`UR!enBs#DtB;4v`VHZzE9IP}))K0~~w;JeQPzAhYc)>wN5%HtZ+vY zob*(Ox}ixT=3-t1^KIt88Xr5$x^3ZyFXwRQ+?YY_ z71xnh9>DPe_qANnoLp$BmMa=Pc!GCT2hx2j=&hl@fCVOla{}myHOkj6DBzU`Ec^#Q z6g%e0S9e07cw(&ysiD?6b;e~^jK#PH#`Fz2tYI$2TC9s;4d1{%_1-u&4Hj^Zq28NL zTJIgRmpdg zd*{>|M~k&s7r}aa9fvgz)OqoJi}5P1o2lcdM1j;1db@)$=78#~ItR)HFrM?$a4cdi z)6|e`HIjph%6l<}rfprdJQ^nPh#9mV} zig9>#HdPeslBwd9m%hPeV7TpP5an=a%GhU&DPym~7pIIjuqf7g>7cNH2}ybB8yX>E zEXFl3p6XlQOcnbzacnLTMU_dJwW*?5*Tfn=B4KL!$x|uqTN*vxxqc@^jtJZ;b0jzWC3~3i*F|L8}oR>CrTpdU3H65cE z1=M-3Z=F+bQ%Er{nLatlL{k#;oLD@dm0$2ZjQEMjQ_z=wF-26JPpHnIUUgQT zYp655bxy6J-eN7*MX*MzIfpfl7HhGtfi=K{tAHB6m?G+>Pw1r~?W(itTtl7drT4}; zH8*us%}=Q2rjBA=66>5gn<|QNNsOmb#RtqahH&DTF^FxUWFfcuOsX* z*xT-mJiww@yMzo13xwr!Y7OeeTC8heol|G@vBg-7YhXO5&X@#ZE!IV_hL>jF8sNfZ zK&>C9j`6Cln{Oi+l{mb&Mz2HlR=or50$AtN8B#CCVq62`Id5%>xH^v5YdS_T3aIm( zmo`-t>+_|GuW%h0!fC_bAiCkuRI$$(Q^j6|e5wf6wmTiKU{8$o(m`DX)3Gg~J6Pjk zu@>thSfhDCZ@o9psXO}GP6MYwk!dic?wAB(E!H)#2AFUmP~%rq#(34%&4%Bo#NoX+ zq+NAZodfL(Si^hg)EZ9~Yq2hZH3T<@wW;IkKw_^68O11|);Ww#8O8W~DdQVl28P?h zk7$QOQ^r1HOc{F>@+sqQ+NXX4n_{lF4k`Hk5Vq62` zId#S)5Nok6f;C#r02QtR>ilM^7_Z{G+0Yx6IJ}oeuS2y~tpn`>Sm)Fk(k{kgTm$1d zFKvprI*!H+2mZ#i*ODFPWlq#$JLa?USBeb zQ9!?w9GfS~@d@+92BU%Dw)P{#;m|y>PZ{&XUWI&~IOnGuV3ce9bYNJ(cTC;Q*BbhO zaxK?2xX$_Mh6c7A%W(~ksn7Hwv*YAE!Qsvm=Sj_Z0#M;oAop!&ZRola^=lVY@X7-g z{sTY6wml#ojThlNenz8RZZC+L`Gh-u#0{~=f*1CR6YvKZd+Gx&H!vrvFZI4aJh{50|%3{Uy2nGOo8Z6?*eYui=a2TCQvO zkeog*02jmUIYI;d(Yo)gIq{?P(@*8=|8ZRyMVRx`3)lo~a*gYozT-LjeuAH#^VjS` z$+7M z^>)uRmk6$I@ce$0!F#kZwH12d`eQEv96S3Ij+I+q&}nZC)aXaglqWi zq+a82xt8l9TyL-C;4>i4?P}f_FXOt|9~qT6o}b1nP@mQ3V7UOtlYSbmMXu$#2-hHU zvR`ffxSEjI>qAB{j<4V5k8)k|^H$N&*jXpuU_3B{`^LGE*>Gr{*r$kjVz0ti=ZQDK zDA)Syz_5bvfWL;O?&&oimutB$!u7US0JrQ{-|!D|E!Q=;PU=%?AQ-Wx-(_k0Rmj{2^?$6Tl|4?t#;YphD;TCQtwo#fcOaWyHi*QbnP z9ABT!8|AuW-bjC)(`$YqgT6!G5flCJdVM#4RIf|wbyAT^kbp7hh^i*j9)YdDFd z4>4bq>yljOIA(C9pVm*G!B4-KC#ugS^_hNpZ=BR~^iR}t_52iijz*wd%XJN|llqLq zZ#~1TO{q`aJHUt=c88)N6pi8J;tJkN{Yx73+x};tw_1Sz;j!SYp>8H&X z<+>)2)KS-|Sx`sYa`f13!T+4M4u5n2LsJJRZp4$T#Nx7Em z8eAti#w?IyIj+Gm{WN_@cAT6SSb#V$oEJ6cMUrdt$#@yp&CgdIl_=0ZNpg(7r24Er z2g?OGrfhCk@0Y7{@B&d{IORdpVQE9gT0-8$tz%#YxO!XJicCod%2eD z8eAv!84YeZmg5>6Px@(01G$##B3z@xJn65^BjaUVH~V^{636$~=y<5#>UXeRfNK~F ztOH@E+bh&wj^(%p$CLirJaIK0vDbHuVieHlNk47ADAzUL?+8bn^C53A9vE()8yOCV z=8JvGm@oD!do)p*!ouH#{!aa$SULbTH_zIZo<18YXft_eHp$ z({oG%xt8l1Tmww_4#;tPGhd9CZQbnijY=HfZ$sVHXZ1PQuD~_?c2ckLY`K=}B3wgp zlU$oOt|lb*`jAnK0(za~*nClr&zCPQ7Z?o;x3wRc4u|H8eae_G_A2D_MfRsTPU-h@ z0i1HKzYZ)5_>igl`IZa%fO0L@HMmadGaA@(EXOrCp44Yd1G$##B3z^63{c@KAkWLi zd@)|eb+fNGDsg;2jgE(UtzHM)1-MS?Gt^y<<+ujN^waF??TwT3!2EGFDY4h5jA9hf zbIyY#*XEIOT{4f%aok``FoYY&xsmB`X#Uuzi1}l$!Vlz++wAT1M;c(1YyEd%SiyH- zWe82(;~J04wOkkBdQPv=;FfE-uEBLupK-Vx%W(~k=lUHxYq@RhhZpB?=iHb=?G+Y? zUjf1;ZCl{DmMfZ)3%><=;n#TM3HI@V>An^8)9hbEkO2>D$HG|x_~ab*^ZU}D^Po{M zUVz;l<1g=rKm+AkUs6NAIWfL}cws*2Gp@vP{GnWpPDXt`h(4PqK3}N!|LCtrF$((Y zoL(;wXbkn!`st4P15}mw(+ipya;*;ujtl5DW)k#;etN;7M zH9B$ZS96@?9*4`l+!x_~d#wi_0{LDR-|rYN3y;iS-?Fw9j%p})Xb;`9|*WfzIv3cTZI%2Qy z7{w^4&+O~{*5l;7F|Tyql*}vV)}c2T84R~Q6EY$W%`f|uF~96p$mf?ieZB!cIo6*C zb_IP+l56x^gl56wHepwuw>(Eh%2AJ>_kmKcMKDml> z?A7Pf=rcMR>a+S>L!bBh+e!U~JC}1gFTyz#ILWp7<+v30oxWrg<9PnsJW-BMm?z$0 zG%(!Oeq=ZtnkPOr{}oH~_CS$a!)pGHaid(e7o3w%;LCc0y;9>xT6m!*RB(T#R7T_4F#vTKrOt)$*~;Q;CND> zF%9Heu8VLDKmFVGukTop$i3Vb;eLCq2cNPn-%>5rHK+!s+Z3aLA;nT$gW{am-ez8^ zrMd{!aN674;!!k8q*|(rP(9J6Wy(iG*VSgV zImoU+HGDKX)+z1Axujgmi%<^zO;PRL)vFzey^drQqkwj&DE8iJDL%oy)nLBCV_>)~ z`-p5f^cK`UWBjP5UWFgH1r=r(;BGfT8dwx-opexGz;jG>K^mwRYq73@bxxhl5BoK7 zY_14LAr7z3m;|b`>KtfSz#3kfP3pZdz=jLKqdUt!my{@9yWn!juMcbspW(Z8V_yBh zl5(3pRGC=g$*Q~RUPIjh>JG-Z6o|1H*T8tLGh)aXuj0D7q#Ttf=)H4lZR)r(9ec4Z zgf;AN3hM=~1Hk=3k=k9#ieIqmwvfo7UKzGT?gwN#$XSq zh%x4tosK8yje76`>h2hSai@drCb4#j7~mH4((GGv-hBV?!tqhGUB&!EwHj@V>U|9L z2IgWd)-}`{V8R^oQQyb-l$-bexI`Sqs9-|2*L6EsRdye=e#tUVqz`UMX-k8 z(q?Qg5z(m?Yq73@bq-_X4`M9FH87sK=i>^FG29k@L^m9oA_gG7cd-}YM{YEQ9j3SD zIHl%SuqyVdc~E-v&Is>%7i+Pufpt!uO%?k!b8PmlMyBLdc4UFgd)~1T%I@@=ej!}$)UV5%iZR#lI z=ljIe8(av6aNh7ch;BGEb$nhC{CJxvL;g))U~RkeaRYl|thWy8DwvRM3EjaO4~w-} z7r`3MjGS7VDt2cuHkXW}5QkT5Oaj$fwGOlkU=1+gD)8vd6mga2*sIQU)tL>w>=@wh zObZx!)m?S3q3%=h%?(Cgti`$p);V=Hg&f!EzSFdfVifS+bLwpBDAqMoNBD-6THoO^ zFoe^_sS)*XXzKX90+>2R8S<&)lv>}xqFC#tgTewP1QNR4>A2%zF&5(*7|*G*sbhBr zV{?f(3Q<6v_xjd3^~TYvx9T0JSHOIGT?f|zjPItBt8~X+^{%7d0Cfjr%mLL|bv}bS zqZ=sJVqFAlkeO3!Q^j$e?K@4!D8}Kvw5g(4mrNB?>da}V>Ckkt0L| zRp*lGyw|7ZxGwjdCS??(fcMT}Z0ab+HB(2}=M>hja2XhGpBhmPho+2A#W!V)GWlrZ@^CFmUw<~tA#*@WbtZQHm{oTPBQZL40Tm$2|&W9;tyo&4Ql5td` zptsJcwW;FDbnL~t5Z186DXib%IxyTmHKH31O%*#NzIU-#A)hMdFa~>Ktd|bzDwvLK z3Ef^IzTsi97V9Edqj|wTHODzMH+AgS%(3aUMb_hPunK9M|BOewux~ z*>Q577*7Tk>t;MTDp8<+!g-S9+PrdwI`(p1hwB{24aNmSxOJSHLCtq~fbBIbepKTp z1@d!V`Kz`C9&EYdVzV@?MwTn4EuJ99bvT~W=LR+bn_OdNdbLqGSQhXhllqNW zBG+T-s8^@)#@AMs` z7{~Y1=8bY)^7B@6`h11azz}X5=SGIZq4%XeHQ)DnMHznJzSM2@cGihkz$n-H>AsRw_rgARlML3_+Z}Z1)9>(UnaTKC}e!~Or`4AkgKC92casiI#?hm<|C$8cg zd-b`FK2Q2-xEA$Vy*`CrW7R3wa$SRK800-aZJszTwSA}W7{xfgpEggF>ymjQ{d9Jm z)At*U35IazI5#pM4$UK<*9`N>D8pChkvG67*ZS|kuz+uYhVJ<98y=TqIj+I+TtE9} z-q_8-*j!hRLKM(v`t77%<8bv_y$-f3aJ{{jgUpFT3QujEwFw_`s&k)VjKkGu z^*LBB!13JuA9wS_Rh(n5KG)G_-v6;ThCuJ>Ib4l;uAZMl&#?-XYq_q$byA&gnHLroKbp5fhzQJU~^uLJwbXz|a1^#uxKO^}3{9W1{Tz zJ6`a(`m8>mLZ8hS)#sA>Oh3(WQonJy`mKJSLch%))$fw}4Z($f#-r`UJW-BIay)l` z$cuTRT-W3pWI~bm^xAw;u4{4)Cz0eD{dCuft`lRT7sz3996taqhTC%lnGJ`&f3Zuy z?_cayn1BBw`+C`Na$W#t=Y{$n7#Gm@xpn3PeqFBRx(3%teKwEmm({U(-|8sD@%0(g zKz&x9gY61jPxS#G=8vmb$6mcYjb5WeqF$@lHS`)r0_#3J+8$7MIhNxZ98dN;%pb?4 zw(s;EqZkGKH2c|5=so>5kCgKh=IpO9A{fGbW6mJM;m~~Yc}?*98lw#Pd=jkf=<_S! zlVkmLU{}G1Y-{Kq*LYm6<+=#h=x8MM+I+E_gR!}89ECW(USk@l*Xnh!U4UzV315Ln zKiyO*$8ubQ71pI+NcBalw&eIj+I+ zq@Tt#kZZXv!ZrN#T)+Aa3lKS%^CFzj`D;8|uI0K0*Dw}X2jbE82DO)CIj+I+q`x*# zjF)lU%wa|)D)jZBxKQLhy*6K5p^m*=7vdU@IK}mHf$_j_``pNII5c1El$bB}D*S`r zzqnigpB(F_1G@^o0~*S{-rhK==kPJk1Lr}_d64AVJhER#$EN=tg(#r!Nse*2`m8<& z%LO=|>iaDh^Tt)2W3N8f(P#Q=2r&FIAHBf6tJmuFDfAlMaJiQ28eCI>zkhgP_~^yF zaa?NqPTw(#aeO~*-YC~KKQ9%|Va{JS7!M5LzM=led^j|Jd|ng${M0BzK7X9+hcv(_ z*B@+LYgl);3mW`a9UQ{+f!s-4AIv zT(0H12-n+dxji3Zz8Ej#y4mL&l_=mtAh>%RV-~2->T|GMfaA%22V9F>%XJa1K_>gv z94GbM{BboUvDcT3VjN%3%^&5uWd4}b=LJRtL%4CA8yOCV=8Jub`2NOTg|E&R7r-dj z`t885g71LehNkZHN0{=;wOkkBdfO}PagEy>`qlhm5%pXB4%RDhKIgBo>Xd7_uE8}7^WHkqJaIK4vDb%;VjN$e%@gIi zWS%(Zr>`&?7;bwSWH=m}FZL;8zSyhq)%oHTFv_)lIxsBYLvntaZzGjsIj+Gm`_=Rz zUp-FFEAz~LSst6~)KQ26*9Xq4B-c3H>xI{gV7ma<0CT60cs0*l#X0us^J(-M9ToLi zeXgO;^y^8zHosJ_Yxc*XxJjA5gC4x(3%de|djIKDn(8mQ0e zbFf{3Yxrw`3SYrTZ{~}uSjS$yK8;?ZL+*f2 zj`iDtT?JpVt)Y8d<8ir`>mppE!;#c$^Tuut#^yS56yo@LjcK4>tJlGH0j>cid<7r9 zn=h{79DDWosQSE(vFfZk*HCA6r#YrRe@q`ixxEmz`vkpePz}eTcB|brv^%BE_C3_* z^Jz1tfZD7!*U;uE9}NQ{)lyxA>Qtr(jPYElmg*W*!$e@c2a1tCO0g8zpg4DbHK_LP z>Ua^?&D3R7qCk2`ADtbiwB38H*C`NtXF;J^0Pmcly1}DhxP59wIvjedb%(@{dg@j9 zt#7r4MQLD9jCI~YT?LP_Euq`%$%co;TC9s;jaEm_beK2xYvS1S(xVWES8GfH)mpU< zvvE7%!^w7mz;w*1 zHTr*IE!H)#&Y2EV#C}a2n_hYp;_&K>NuWBb&VhCXtkGJgx8@ii!*w8KTrd`Uu`h!C zcKc!nYdl%3#kvO8Idz8gi?JBjz<90`VyYOg;<~wn9F-{OwR381%D6Hed$BHrHSBN- z>nmIbhTEq`l*6GZV~50)u~#9VGUhM_dt$7Y4(ckHj%^9u?sQ!7uvm+A5v;Lw`_=#kdB>bLwpB*sqCW(~FNn6i{b+?VRbr z(WubP4v4WB*T8trOPe|l``CAS=~0XdrUPWo zd23ThG5_|B_bXSx9KIrFN=zlix+K;qjPEeh7;euHL^T|mBK8?#irB00#VO()EQ+;D z#-Ol*>43M+sWloUVlCE1u-*L=8@`6T)>a04S zL7hz%Rp*lG%)T_obT!{U=n>)=dLq^PL$zAN)vaBi3;e+Fw(uFRD0zFJ$gSa=yrZGf z>b4i06DMfAG4qD?*McVS+3v4qeNb`y^_Vg6dAQqU`F921H zRp+3NmxIG~K5#V>Yq2hZHOS1VwW(siCXUVcWfbD@YK=C!YOPua+6AyqsWVsIVl2ir zFrK=<`hoU@Sc`QLtl_2Er`{Xq)E$i!r-9R;$TUC?FNZZ6`(iEDHL%WMjHAU^jB8*# z=e-fvh_zT3!5ZEh`U|rRj300;VlCE1um+hqtT89VTC8heox|9aFO_xCX{^>THVGuZd&RTaQ8%Q0F->4Q*GgRqH^z0@mB>IJgYNFMPkKSc`QH ztf99%7-J5Iu^89Dc+N|s8z|OdT?A{8NpH<@PR&gn<5gZamyn|phxgj1jw{o#7wbA$ zr_}ikE(Ak3ahw{_4Tq+R9ST#$UWG4C72m+3SnIWe!V0DXUK^6S-5Ghq!(uJgMX=s> z3g8xf>o-%zevKTPUV0RwfLiC&8Aq$ms&k-R0OP5?^&8Y$ti`$r*6`9(ed;$j7%>;~ zBAA0r*o+--jX5ILVqF949LA=I@v5zxOTAQ57m`wJ|?AY|@ zqYwr3p7SKhH4az*)&F3-0M`H$J_S)^yWk(>SdMFOJgLv-aUG85{B(oSz;Ijpk@;|F9@!}|kL*?Wfjkn9 znEmaX4{3l?&h^)UWdR>Dso&@W%C%hA;5w<#=863>IX3Gky)3MJPcE@zDjFV|njH58ZqYL1h7 z4&NmAa$jT}x$Pxzou%Ji05XQ#=cd8_XzlmbsQ6L(?csI5eRCZdrO4^?0u}+6976~6 zC12)Cw%Nn$@=2fZxLoTyiuexr?WA6#aVghwU4-j7y~Z?c%eZc?D@P>?`tPJ(n?J5l$6l@raScbDbH4h zzf6uze?1CueEr5WP`}mhV7ma<024j~@nO5+ALLk$Yj8Z*ufD;Z%e7n=;Trxrsn>Y6 zT+4M4uA#U|uFV(YWn4GciK7z7^V8;uE5xyv<2oGA`DuP3gT6!G5o{OGXZEM}#yMYd zH-A*mzkNI1_siVT7gW#H^BQ`d)MxWW_4$nYjA@`gtIsv`nf@A}!dD<(Y>l$1qIW~`smu=mApV+7bV~z)?YFFfYFF4?iasKo9 z=v#Qg?;ivQ_Pf2{_fwxgl&dwYXW9h~rYjFv_z$nF`2$664d=XL+=$tyWfY&lxBuO6 z8D3yFE52U_zjBUi))*znpO14R^Wo6XQ|;>K=c)E8e6?Ob0Ha*1*MT7~5I@0(KtpjA z{B#Y(<8my=H8`I0(+@Z?xt8l9T*FVZpPkfi94_Z_UWD`QwHmpo(%%onMFUHHbZsv=l5(WBtlX`8wxI!I!xvs-?PM=?4 zG%$qQ#<`K%aA=;`sW4CMRru;W@f9%2wSGDo@dAUFSPf$QzH9DD}v|9Hbc$hBP8;2MIv$1!Gs9LsSHj_IfAL-xkWd4MjW^T2sf za~>qQHjj*#aot>3j!G2p-${mZu z_<_6;ju`B1uPc`eV3ce9bYNJ(cTDOvxR-0WuEBLupUoTlWpQl!=~0N|>ocZ-`m8<& z+ZDKmpJx9W;KFAhZd@+-2RWDXBAjpcEcUp@v*lW@YjB;^XQ;g#%W(~kC;K1fiSaV7 zo9o6=iGuz*sn_Oq1<^5$CvWFdi6gpBotthvti&67$7gg?zr47MH98pVS96@ybMwc3*&LgGdlcgMdX8zJo~!4nE{O#Kn zZLb0x&)pBQz-VB&t^LS!I5b~;YCgZpq&-mN)2279^Sg{{an ze&soTy#P+s2jzgr!E-s3b2(oxj``jFpxoSZl2m4V5+nOBZV6zHdL-Xyt3 zzsKu=*MnfY0M|K=uK*XrZST+E=3`5;nd5Y|^Zk&$3SZqPyn;=+R-XgI0{Topp44ls zQ{`H&i*UW|6~Ha~guG!!uI0K0*GYZG;c_g;H8`H@cU&RZaxK?IxJEKF>965pUQewzJi zj+1(h!{uJ?i*Uca)`Jg0+_>EE4{|NnHMoZ0?s1G+AjfiCgX2lR4Ob)Aa$SULkeSqL z^Tv1?*UemJRH8tiZ&I(#8&{}fFV}Ur&gnBhm{Z@O?+BI;ug`b$MfJJn=VQZ9&-JVC z=$EM9>h~%1+x$`eE~(#1e~rV{XZ86M`fQ%4K9|(zoS)u~6IE-~`iN=`s_liS)g`qW z<`}&UP>e^_X0`bQ+H9XgZ7!+J^wHUIO51U;+OD>rK-=w+sO=@S9dZk24d0ES+N?I8 zK%0@mOSM!Np&DeSwA#C^bsQxfNA7NGSPt*CmgD zfO_XJ#?h*?>KrH+z<8?hv9qk(7Jm404tLIt8Pr~3k6w8I#|zxoaz%4;p`}``X!PI- zs&gH6p7YWG7wF(oNIN<9OLL>~v0!%E3F%Yit2-f3Jh9e<)G#5CP>2Qew&AiX#$sFp z<2f%4b1BwhT?A|R26}6bQ)<3|a}1&VIJI6oVrN_}_1ZCOzJ0p`l`r<%3(yp6)x3t9 zb6$MxPe5pE(k!x&hr&Z_en)ESONti`$r)*y4PPi^WruDgAw2^qyWytg)W6zk)^ zckv3>fgzkXY&)VF4!sfesrav0g|`Qa+#0&7cZ?gwvc2G(d;-7y=Y}i#f*1CR6YvK< z_{#H+-WMG3lT*YiSVYC~*W-7`b2$`iv0g8IKM;;%CW5`~h8}NO5Nnr=f#TuS8do2& z7V8>V=hPWTi?JBjz?k=Zu%VY71N0r!g0+g%!f8=+TI8_CB2uiyx(3!cjIkaSV==CQ zF-=PjYg5N~71zzwaa5v0rv!qV!`jqwWjgj^T?lK~;S|<4xDE`rPtAPh!pLb3Z`RQLbn@uH#{uXVqFAlcxm>rbLwph*{_jf(_4>19A3RK z2~=;@JJ2qGHNb?+pkpybT%|eos`FXY8JMfis&fr>p7YW$=3*_@MX-k8=1hpG;<)bi zohD=y<8WTu6j6*zzISozo)5n1P1B+2ho$00b#wk;BH+59aPpIbT2dd_(c?~ts zsk5n~>U=_V#w1XkRp%P&Om7WP;VRG#yqhwr)+bbJV6IxL)-}{Rr_QE|s`Cle*;G-i zYhn$-o%7bFj$&RDbJ*jQDPg>%x7J%9&|ANlBC5_ORA==2RA<$>hB{Aq=@(N))%t{L z4d<;|tJXEt8eqazVExE%XAomCu7NS{ucisv8|S70riIhMX;5<-R-MnF&Zdm2b4hjnP5abb;;P=N_ZigN_cE&9CDl9UtxXZdxFp65({os(8>s2f zbQCciATx)xsiJCqLbWzk6zh^$r_}isE(1e2ZJZiW4TpZuVxJ*?&tk7a{(Bauy!0zr z6l=Y7P*@=xhnN0M`_`|fj$LfV=B-Yn5EZcBb`szg2fvy+u1v>Xtm|M6L%f4Aj@FcD zN&@A>tFx)1>RhrDLT?TI-BD|p5Y<|>K7(3g{VCRBT?6Z!I-4qLI%=8@_=X(Trix-+ z6KnW}DR2D-*MZ^o3_`TSp{Zk^L8gwq3SXQ$zJW!t)>{XK1sZ%Q6Y_?}h!~4;4UDJm z33)R`?AOGxnIeut6j0|mFAZ&1tySwly8_nR>o~X!9Q}~f_+69lx^#>Vf4fSak zDBG0>Ec^%cI^fQ84Gl$A0sW_!MULe-u&dxZfNGL!94^;#U4(1+X*Rb3?w)>QQ6uMa zUWD^G{l>H9TCQtwoz!Qjy&TJN4UVU7U~L!U#CRFk%{XyXqQbfniksAH^wZUA^*Y$D zz%?9kj_U@HG2A{kgO`tyPcw(<>gU@WdlmlC{pto5UQewzJi zj+4Fwv9R3BeG%@rJu&ne2e*c4AlGtTgKL1f$Fcchylm@cpKny+_UQiksxxym2)lvDb%;VieHpB**59a(u$~FD@_|7;bAnG93=h7yFbk zU+h)L=Zox5bDY!f1#rr_{yMNM;6vu_=i|HYU9mhPU#qbcKRb%z$eH0 z@4&8tPubScJ+AS%T+4M4uF>&G>b3b}HwR;LT{#MIe7(jrP_NbNV7ma<0296fCZ%1? z8&`3Tz509_eFo_2v-(^^pMTqa^%d@1&gHxa=TP9JFENiCm*T$DmyBW@&tID-%JB*F z#2btThTGbY42MJW#HZ$)Cq^0ac_RIF&Uf4Zqg?B!1H%HoWA6UG8~T89E!Q=;PU^FH zVmAk4b6q$JaeRHoG*F+_=U}@6*XS_QUvmtQ;XAM}Y&Y}ARm@|ro}Wg~0lIpwp4ZUx zq&`Fa3wjA9h@+ey7PZbLqGY!~1fV8Um>w6wc<;wsLuSD#O#&j4M0R-bF=^Q51KJC|#@F2XewH|ayn7ssWy z@AM&~7{~L|=81BAh&+)#BspYbxuwOkkR9q8mG^%{rE zwOkkB8rA}!;xdVY+lzT*zf6wplP%MSyjSKYtP_(Q18ntKeGYVw-|v8Hk!!gw!ZpZb zKRc=4=8?mL^qoFr6yx~%jeffNt$qjF1-Q=X^8?^w2=|S1BeUVq_cuN@-}g608NRw- z{Q!(|tv=V#=Q%(9K;KWU<+=#h+g<_O;^6i$U+iXKY_1bWA&%##VUg8m^*LBB!13Ju zc@Oi%Rh(n5KG)G_`suwf1bWYxz^JI_>iH@394U`n%XJN|llpAFI4;F~r!N`BIKJOD zUzF>T?}wqk&gu0lj0T2q+c-Be9S+SKpVt8M#wf#A=Z&v`QLgpVfnfn30u9~icf8_p zIhNxZ9MAQyU(FZ0IT)Mk#8HR>`bHod>QfWAYZ92T88cPmyc6uEBMZV_cx*SdMFOOrMhE8i&iZTo>UQO9p@n zUxD>Rd-MH{@iMNP{p?YRoul7MH9E|b{@VO8UehOxjp5ZEqMcR7~h z8XQmhYxBg_bi`iYF^W+@pQ*S>y*6Kz>l5aS3ycSbuq~J~$Z$9`U+h!H_b>J;A$e;TM;v*Xs2t^cr`o$hBP8;5w<#=9S}8 z+jshoQH}FwXt`kQg3g~rGpK-YQtUd?J1vs9&ALM4fxQcV^)#p0;%>FdT z5ac}{0%M|ntKX;4Z>&1yTCQtwoz!RZ#Bu5EJAKF~#_|2Nd7@mG%oFGQ^c_Y6L%3~R z3y|S(XukNo2AD5K8NNDSyaPtL)=vk91$+oJbf@2O$K!G=$2B;f>sQ~+6T3MWo9o0; zhywadKb;*X^&N++@9KNZg$navd+i5bf`ga4dE_eYu~*;g=sN@#9B;=ksXKTW^3gb0ZC0C4pw0F;)aH`fyw|ga9K$)oSEIG3 zcB|bd&~893)lyx9>XbHnx3vzWrUQX%NKx&*)>2)QYPg0J)eRm4!|e%!$c962weB;f zd8>6);U9ggHReDAi(;*l4hjq0!IV>HG(p5zjB8+=yV08JY8by z^YNUT<7m}fH4pSFV86Z2gA1XWn>emg9(&cij+#SncQD2rP@PrhGpIAvTCByo2-YAo zr`Cpy<2u`SnvPM7!+U8{MzJoLGN#mdfy=-UP8+92bi<*k;#2WW6{8GaoGLD0QLOdS zL16{c0WUq(r(Vz~5pyvwg88;{0JoSEi>YIG4r6o4I0{ifyL}-de21x(3#8$2(ry6meW<`%cp_ic!!@(}ZNl zxoKev>9i=BLQX9)uW%_C!l`4%Ao}6ZRPuQRF_nxmSOZMB3P}0Y)Nz&O*sIQGQD^ir zRA<$>hC1){t#j%PH5YR+FM>G)IES^VE6j6-Nmm=QaGBDg0endAM znj$_G-xM**kWUfmty8As1{TFyFC7#XFdb9(eB99g6Kk=qfpt!uO%b~@7@JGNQHaB< zGbVxRtU3qU6|hEYnckXXfDG4xlif@mS1FIZYJL_qNAE*5SIujvc}|_7)?zHiH87s* zgqSLh>uld?Iz}-HdhMKAn=*>^`BKI^TnC15+L$qjayT?)d|m-e8KVsOlo70LcRKE1 zPmJ}_L0tvYu`QuHSmR-_7V9Edqj@par@osycBe2lmyDwjhgWY{7}Z<#4zvqk4KU#{ zAnkWk#8sMOuR5Paong#XXVtleI?s7&sJB>)brGx~xH%JIsyME@eWwW-#WHH~F37X4Jb>SP*}O+2gd?x+Id#UXBF17|#H7r0M(CNuTC9s;4SSqZYg0$P^a;H* zq+YdFt!t=tPMsm`Vl2irFrIqv;)^MxrlY3mfZ(!^ol|eL-BoYZ`vmI!0LK`@d1J;P zy5Z3GGWH9Ded=C?e{i4r0rtdLbq?w(gz4K7ij)hE<$;IATC9s;4N~C@z%34bm@4*b z;@G?~brj<8YK=*tTC3K9b^)vb=8ig>BCgULd)4_Y>I@^UI;+k#)R}$hy>U*>;l0IP z?2BLzLC#@q>Nu{;eWyto#W{`O9zDoOvlt6e6Q#SinUnRz&fYSri$GejLjwCD8%8_8IwSDR-FUw3Rt7H zJm;-V9arg&z3P1y^+vBl^;W%Ws5fi{)_{=qSB%A2jB8*#*ZD9-9M{>t({zkt6!g|P zwKi20>+_|GZ*UzL!f9j1AiCkuRPlKQFjb5)oce|Fc)jFu7Pz5E`U+4b=QGm0b2qM-R^y~3m%taIj+I+q&}M@ zc5^T`myM$k1@w8+Peb0-YxO$VuE6#7S`I#gi_DAJ;wsj$SFh{nH3WB$W6T2eS$#f* zK0~nOTCR(54KnGkIZo=i@#DA@_np3E6yx}Q+x$_kOXiO`eQq!!7{ZO?+{kb^G+%sb zzWHL5;j8n-1{md9za1D>@E!2m(A1s&NWK)&bcv#8b48<-v`1aZCh}$S*~bGE_7AP74027 zL4B^H&+Jcg3_;%WAs`v>;ZdBMV1I}9ZD;iOQF1;Q`}XY)bJ!@S?FFUf6YePPjgo*D z_KFkm2R``9Q!rj|z#Zc+?}y+IMm_N7Re^15xDv}T zt}&=zyFkh0_<30=r_V5)axK>ZY6af`3C`*D0+2D(cc|B0j}Pak7kFa1RNol&axUjZIN$aT z;FgnuHhAG=&t1jB95gN%nm^T$4= z%pZFdzB+%r0YIj+I+T>tv!`yKmbacr(5M7MHOQRw*XEDo z(%X0XkWq}|`)l(@xh|PM=KM83xLzNk4~dC=czwQ`C#ugS^?A-u-_b8ouhr{Q=(YKx zdRh$&LX!dOuwDv+Wb+jYjO=ooa36olRiWrQp1NNIW~V(pUT?Z!rl00G zso&<2>h~G-8`D7jR=;cLH^79?Kzq8qm?x^wXVhnOPt<4ixrRPZ`e_KbT+4M4uA#U| zA7Z|!4=L$Gk{p{S%5h1K=kCvYz-VB&t^LSwIP~*U`;_tXQhODC;PX=9i0Q96&guCB zu*$uDJ22(#6%SC=uJ8dbIN*-)4{*P&xjTKo2OgJexvs%AC&u>=FU%*gH(%_R&9V8p zIHM59*Jn%v_4$Jgw1(?fyFdu8JYeBJ`2FZHS$@EGK!O1(s*Ho%!@O}7>)5N;r_pP; zarIig4z>&Ukfc6Cu;o~eYj8Z-zcybSm)gG5cZ^~b&}a6iIZo;~`i|uS;2aJ) z$Mq{f#&G-G$Z$9`e|%mO?1w}d^8Jt`$AC|c)#p>_Gx~mVE!Rc3Mn@y5*N7G5TCR(5 zz3q9S$Cw1|71Kbj<+=vf0CSIH^Tc@B*3G`&s6@ej2m5+^;F`n;t z(1-liWB$UM->1Itr#o--HK*`3xU$Q&T-V?_sn6z>!;+>4m=dVT?^7jKKIR<=k zte+0-D)^3V4c+PEUGcbF%XJa1(ZOK9n&YINn?H8*FgDkbqY%f}b4&yETs;rA3vdlE z;X5Gq%hh~w73bKi&!^F6xOMeeeXgO;lYSZkF4uBhgli~n(ubHgj!SRf=|e^_j_0S% z7v=bb`Qi;m1H*0YN2bG}`QlUa%@?B#`FxRnn&X@gxdBc&*Ix&g1$@Zd{d_m{0p(h* zYjB;^XY<5v7RKf}aTMbC`iyCyKC92cb_K4{aR#XH6*zdgnJ=zl9eefqG{suNllpER={z`L9(jjR!4U2oa|Rg? zhvt#bYleAblp&u-g0-Fg$Q|&>vHm--tKd_%HFS?_JTBLAU4(0NJd%2C{@BgI*j!hR zLL6VOF%8sf^*Y!tz%{^xuYi~@ck{+ooMW#(A61{X+t;eI>Rdye=epIP++K**jrXqY{T# zYfJ*wTD1`&DQH%mh#Hl{@0y)NTTlf*(aA=D7oGPY>QHFeqIOU}muqf7= zj-c@HYK{J%Sc`QHtW#ckF-7doU~GEnQHX--OcRnF=cWaYR^3(im>LDA1we%>LBnq` zm0YDh_Nsjywa;OUUWn?fI-fzEO&wL|n(vMQnK`wF2~n+8>ocgeDWqy$Qms?!e1#li z2&auxBiiB6)UnSH-@DkW@B^viHhbHhjw@IcYfVQ`SfPOjFU>wSBz6aLJS^s7UIgKrH+zjWYjHkTz%~Y{FgR$wgM+N+MTm~9^H&ez{s$;KO*HLTe?GDD61FEy?dQ7r`99B4usk1Zm}f1n<{pvFgCsPC`19Z&UtAZtvajDfpP(i zdCvz;$le%W@2I({<0|E`SIz6FIj2DmYd9R$U3IUa?m3K+?TE1$*T8sAow1}8Yq2hZ zH3T=O)~1ZZKK7kndK9DJk}`!ge}C0lwGOn2#RE{aE9CG62i!5vr;a?q_YW@&OvZ~T z;}E32Q=LaK3Sd0trC-qBQ=LDEKx?Q^yCA>1@_>c^;5{KRSMuuooA#++@T!TqmtZSOZL46X~r@5r>`ZJH7QN#^Kf36j7{8e&rFpbxy6(jB8*#)u(=dV+`T6F=G(jaOis%yG{3d7kd?c`#$xQ*M5Liu~*H5 z(xZFr2l|0xE!H)#hI0U?SRy`575g=FZ1$~3Ar7z3m;|b`>KtfSz#6S*fV!jBri`mp z$6mEQi&~@ip<1ifHPkw%&X9I77ULQi&-JabWE5+$E`l`#cdk!u>NxCV-|4MKF)Az> zVUJU$QWMvTR{2F5foIjl_~<5gTYJ13(O1(ulf-YKl#AkP@WY2(z0emFFR z?2!20$6kee3OS|LZ(vcZH6cM^0kwvNZZ`zq@UR$*aSe>;)Y%lWUlYfsmmY;Epw9Ht z9Ou*ym1n^3v@BJ;o4L8|Ow=!=W)^pCZPHy$W9(Ben}*lxuBAU|6Ar zhjku1)f_`}w|gV)g2&}v?u&50?Ipl1R*j#&VN$qdwh+TWZa-UDQ<8{0N znguWH6(`^ie83g7EA;UN2i!6K>in?*M$`j;K7Ls|mqWRh>v28!fm|J|?esqy9+zYN zb+C7QeZ~bxuI0K2*RV=Sy~g2kE!Rc3-uArk8EEUZ9nZUcZW`$CU;>L7%oz;ZD}PlU z!100^y<8PlwLPPgBhG5IF{yNYsaNpCU zKAR{0db#)gjlY(n0@rX3IlaC@pfS{U;Cg4i_+-EQ`x&qB#B!|zzD z@tmLL8|dX)u8VLDKh1tM$4NcM;c_qcMY!Ky>%oVh&DXBm*~#{~;ng`be+)wWUXEUb zA9$Y_1b2^Pkg7hb&w*WqJ|DcOWDK|G2p59huNTWeKR=|;g`fR-sW-4G*ZPjYvVcCbKh1GcztJy|b2%@< z`L=few^$~&o9}1rm(j85uSX#Y=yy_|ak%=dJ_pMMIG(#d8IgZ z)NA$n6nc#mN3P|%2G=mid+S0h6y;csYj8|IO&^jSC+CHE?`c8cw#VEk>q@RYmtIz6luw8*`_-XdDllqOb z$+?^t;T#H_nkf^>>uSYQ|a6PBj;9k8}uY>IZTqpI}JaI@;->J`|7zH?<>sRypY}9A< zIoPhiHT*RD)f^}F-28D!Sl_AVqZk#qpYz*zwtB9f2ipa>PUyZw*xW zedtlRB*%bHj`h<4(ed@!d{N&~(|4eQG3T!zxCE-->h~%18#YF+<+=vf024j~ZM^ot zB1VqoxCX~_{ptrg9C9t!MYx8)PU&jQaDA)Rwz_5V6 zC-oV9K{=M=8XQmRvw35@jO(WV9+fDd&-B+xy~g3{wR#%m_q^&0&Wxt8l9TyJ{?aEoPOdoy3` zm&vi2FOEVK(Cef=<8bv^eGZlja6H$qe)Ii|t2oDAeXgU=>`(8FA<%oi1g=IsSIqt0Z!93%|(j(;w0J33dw?cArYi zd!G3Oj!_4^a;?F7pe%SchB$b8_?ZFLQ*_@ADyn>5bO8YV?oX&M+E?7*Z1# z_6_g+Wp4asZ}?+AH4obzKeX`_pXA~ORa|Z;!3}?9qXbc3Zj|!9-|3E@`1#`S>CgD2 zP~ShenpgbJ3v0XZ8plf*FFy;;*siQB>(&;?-Y4DVDL?)VjVg;WqG)&&KO2v34+$oJ zk)J)r-*!bMFyyRa81K9sEsIZ+?0?sJDPNrkb-!2PAEEp5C11S)eUqc2Wr`mbIE z{a3Go{;O9(|J7@t|LRqUP5<>?2mRMO4*IV?DfC~RhEG|a_XRvBNs0Rc^!NR>(BJne z=Ol1`=rp{cN+Bf&pDyLk23JRjm`IsKH=zAf^X71 z#rsBGKlazx^<%Gs>&IRN*N?plt{;01TtD_I#OC_(y$-G)-*IsL*e8YS$4rzm~WRNw#jtd#!iSq48ht(QUn^$r6svHGuP zUG!i2uO|raG<>?G>c8|~D<7XeUYVMz|9X~6|Me_`{;QWk|Md<7wL<^(tc(6j|Mdjn zod*3^;J}aN#^+1>`OyQIPq65}o|VymJSfS>y~CjY>UHq`)hL4ZuRf>xtKj|7y$0SN-K!9r_ea0i z!T!WM4&EQ#Cx!P%cN#t|yv&E5lf-|LeUD_P^e7u>aL3h5fHigZ;1P zobdjfD1-OsJXr|m;Qcwh61e}_`=bXQw+HSN_wxasm9hWT%V7WO34{Hw&cfviskrZH zh56$XAM?lV&CMU5F!=ety$t%VcNo6uzn+C?3-TZRSFely>q&?HtFxg0dcyGO;_(V! zYX2+hWdCcxV*l$|2>V~}JiNkr>c5_K(SP+awA<^)7Ki@pNr(O`%Ao&xve2i=$4R39 z3OL%!$D-)J1}*xpXCd@o?>y+gdL7!0JlOwwmPP;7@puIt`mZR8{;Q+WH~rT)KfmxD zh0pgq`uT;=%6NbDvkZQIVK0OCN58|sTQIyo=UEr;&*>`?!r|uwJmHAa`1t^SKEPnX z&j%QV@cx`$2=k#Q4)!NH3*Mjegu(tql)?VQ$^vbr{fTE~>`y$)V1J^Q!T!WM4Acty z6VJNXpRhmi1mT^APakt&f5QI6%7@>t@Lmb~6TJ@hC!RFepXe;upLoJxetKK4SqJ+Qy$tpz-eIsm(d*#ne?<}e z{E6q3=(dvYDYrlI$zs}{7_|8Qj&<5Jd@%q%pH=_$ER_DMmqGva4uk%y*FpakMbLje zr-c4%lmVaUgO700e~mKfzt(A^|B6bO4?S@(AL=Za4-IX=#lw6k;4mM0hr@j6y$<## zo^`N4(aT_e;vEM26TJ@hC!z@UC!SNH+e-7H&cnx#uZP97KQU;rKe0|5`x8+K`x8$b z>`!zS>`x4Bz{SJA?B915?B73OhzsV&wU+(+fW!X%I~?}!-|Jxi{#gh6_q`1E@84nI64d_0vo7{0 z>`y#Fc&EY7pZH`k?N6+H`1zRcm9Rh2>tKK4NrU}~&Vv1kCk&r19`+~fPYg1G4ZpwR zSqu9U&obDb=w+}!@eYIiiCzcqFN`91f8ldVbX)2Dg`J0wnHM53`xAqf|F3V!CuE2dB-EEZ9g-lbGH3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p z(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny z4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@Je zJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG& zp-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV z$0q8#*zV9+O427MwN^ofC>PxMISTB%RO z2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PR zFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr z2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~ zeIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5 z<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi` z*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik# zgZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhle zer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3 zk7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)! z5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^ zL7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv= z99zs!JjcfV$0q8#*zV9+O427MwN^ofC> zPxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL z`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D z#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p} z9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gW zNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVW za?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb z5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro z(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RG zKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ z{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I z2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B z;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O4 z27MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!3 z5atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeF zHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn z#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$- zd9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M z{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ z`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o( z$f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIg zaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$y zPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28S zpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~h ziN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAE zuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0 zq8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob z{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_ ziE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^ za6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~ zuxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQ za?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qn zhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_; z!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXP zp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wt zRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMm zur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkh zPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+ zeR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n z2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWp zgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6x ze+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b z{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt# z6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#G zuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA z^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx< zzOY9k*Glt+@!|c=>-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(Ia zeWD!niD1wtRt9|{9Q28SpilHj_P|5!N& zjr~Xc{8K z^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?L zgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;Vny zzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{ z{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF< zhlf6)PaHGG4f~H}p-&WpJ`oK1#LA#ggoF9QfndI{M9 z$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4d zsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D* zE5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZx zLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nY zim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^% zpihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf? z!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$ z#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK z*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5 z`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8 z=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6 ziGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNt zzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7 zG4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXN zV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{ zLG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x z6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{ z^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$ zpNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs! zJjcfV$0q8#*zV9+O427MwN^ofC>PxMIS zTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r` z?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6D zOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27` z&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b| zpx+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOB ziHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo z%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZ zzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$> zGsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9) zC#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(l zHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3) z`UIv=99zs!JjcfV$0q8#*zV9+O427MwN z^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5 zLcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjs zTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&h zEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdl zIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES* zUqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRz zPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_ z9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J` z44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp! zPdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj z_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7 zk4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@- zO7n&B;r-3)`UIv=99zs!JjcfV$0q8#*z zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-& zxS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~= z^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTq ziIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2 zVNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~ zLB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC z95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG z?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwi zqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{ z9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C# z{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{ z!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~ zSUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0z zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=# z^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lu zkELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x; zuN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSG zs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZs zT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1 z`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!n ziD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc z{8K^@(!P zC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q z`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM) zd|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On z%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBS zkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQ zeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6 z-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+ zeWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{ z3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1= zfBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@ z`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd` zp-(IaeWD!niD1wtRt9|{9Q28SpilHj_P z|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+A zWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL z`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE z->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4 zpQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR` z^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZ zeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ z5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p z(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny z4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@Je zJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG& zp-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV z$0q8#*zV9+O427MwN^ofC>PxMISTB%RO z2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PR zFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr z2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~ zeIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5 z<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi` z*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik# zgZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhle zer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3 zk7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)! z5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^ zL7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv= z99zs!JjcfV$0q8#*zV9+O427MwN^ofC> zPxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL z`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D z#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p} z9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gW zNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVW za?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb z5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o($f4h_9Qyro z(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIgaY3J`44;RG zKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ z{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~hiN_E7k4r+I z2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAEuty@-O7n&B z;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O4 z27MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob{YU-&xS-!3 z5atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_iE_~=^ofeF zHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn z#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~uxG-2VNS$- zd9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQa?tO~LB9_M z{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ z`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_;!#ptG?^^o( z$f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXPp9lwiqBiIg zaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$y zPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wtRt9|{9Q28S zpilHj_P|5!N&jr~Xc{8K^@(!PC-jMmur}C#{9G~h ziN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkhPlSW{!hvAE zuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0 zq8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+eR;C~SUCob z{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n2K|0zxL-l_ ziE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWpgFX=#^ojG^ za6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6xe+&lukELL~ zuxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b{m7x;uN?aQ za?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt#6LCSGs0^Qn zhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#GuMYZsT+r_; z!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA^@+z1`;SXP zp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(IaeWD!niD1wt zRt9|{9Q28SpilHj_P|5!N&jr~Xc{8K^@(!PC-jMm zur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?LgFX=q`ozkh zPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;VnyzOZM)d|^(+ zeR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{{c_On%R#>n z2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF9$HxBSkkBWp zgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4dsZYcQeWF6x ze+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D*E5kf6-|t%b z{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZxLZ1i+eWEt# z6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{3j;#G zuMYZsT+r_;!#ptG?^^o($f4h_9Qyro(C^DZzYhleer32{LG_7p(I@nYim*1=fBalA z^@+z1`;SXPp9lwiqBiIgaY3J`44;RGKA}$>GsX@3k7c1x6oWny4En^%pihK@`NDx< zzOY9k*Glt+@!|c=>-q$yPaIp!PdvxQ{^O9)C#r)!5f}7{^V@JeJoJf?!~Dd`p-(Ia zeWD!niD1wtRt9|{9Q28SpilHj_P|5!N& zjr~Xc{8K z^@(!PC-jMmur}C#{9G~hiN_E7k4r+I2nT(lHs}*^L7%7$pNEG&p-&t$#tr+AWuZ?L zgFX=q`ozkhPlSW{!hvAEuty@-O7n&B;r-3)`UIv=99zs!JjcfV$0q8#*zV9+O427MwN^ofC>PxMISTB%RO2YsSK*nbQL`;Vny zzOZM)d|^(+eR;C~SUCob{YU-&xS-!35atU5LcgyL`h8r`?<>PRFyHT5`u)hE->)3{ z{c_On%R#>n2K|0zxL-l_iE_~=^ofeFHrRjsTru^D#}E6DOG2Lr2YsS8=o4{4pQsF< zhlf6)PaHGG4f~H}p-&WpJ`oK1#LA#ggoF9QfndI{M9 z$HxBSkkBWpgFX=#^ojG^a6LTqiIKzn#LA&hEC+p}9Q27`&?i;~eIgw6iGiR`^ho4d zsZYcQeWF6xe+&lukELL~uxG-2VNS$-d9wdlIR=gWNB#b|px+-5<_iNtzpoDZeO%D* zE5kf6-|t%b{m7x;uN?aQa?tO~LB9_M{eES*UqSVWa?vOBiHfi`*nj+7G4+YZ5BrZx zLZ1i+eWEt#6LCSGs0^Qnhd!ZC95coZ`;TRzPZWbb5e)jo%Aik#gZaXNV7{DRC84{`rf{q_1+^K<_p@4w{-!|(TB;V<`J;!oGVo%^5a*Y*GL*Bi{AufN5wU)MkO z&;8GR{T1%N;{6Zx+x^%3+lB4t_v_F2bN|Bqas4-bzyDSJ?f1*L&wt`GoBaFzU%CGi zzkaU2>*vD$^ZO@N& z-G9I9-{$q_|Cj$-*T3iMKm6;y^<00e>wou>n;+l}}Bm;U)4dY_-4 z`;*Ae-!23{f84x38vK0zT$j-IxxfEOe_j9ipZkyb>ppeA{&M5H{~o{Yf73s|U3z~K z@8{Uv{|0_OKPLCH;@9VIa^d`S|DOE(+<&aUUH{(yKfYl8e14a&zva)LF5Z9K|AG4- z{C?uyKXLby;pcvy-M@I>pTPTH-(PQ)Z;+Q`_iyMI{QZ0P^T*BgHv9g^zJ5CH2gj#| z{&8{s{F!c!_vPm2{xjcHe!Kn=Zgs9d!2J(!U#@{k#16mHl=7i@N`o*Z=xM z^>YjU_4&oTZ*#wXyH3#0U;ov4@tFVXfBEOs|L*_#$G`uFfBZlG&42p0|Mfrp-T(Bj z|L1@9pPRsSo!npF3-$Fky8mH+?tdfSzr=mR{`u?mll8f2{M^69pI^Pd-hc4R{l8v+ z?4SEh+`7m*m(Ve{@i$f-B;v~96$G={G74RHQ~N{{P{X%zkXeR ztUvzp&!l+E^I!k-fBY~1_P_n(Km4yBb$-5&@AtX;jo|Ya zxR3X*?{(z*9sG5x@Og>+?c()$EB*XEK8NCd?0+5(f4P7CKYz{ZKk#{a+{S7@nKF6PTzWWAp{}Jz(nx9Xqxc~M2e12{2 zXZB}0?fVLSOY;4Tey*JNBjf(}cf0+4rT9GRt|!K&-5q`I8|>#1_3JJu_rJZ*Z`-Zu z=Qef!!hUW6pWlePpM4(2_Yc$0{WJ1?g}i<)KTq%L$ML>5{|gV7fB5@<{4f7u9xShC z`QQD!|NZa({r~oF{_}tM@84K{-S5r6J~rKNM4!HPKOpa4nEM%W|9sq`>wCHQl#$!t zpZf#r=b7^J=j-?4^OE$bgr9f$`zHE%7~VR3eiv_{e(p4NAH1LYX?owUf9~tZ=e^~7 tDY{?X|NPtk@WOI#yZ`O~{y%eNnS0~^`=9)$^Z(laJOAfD{i}cae*pLxoNxdD literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:29.599207000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:29.599207000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..883396a628abf2e409c01fb761dc2ab56bd7139a GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:30.072218000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:30.072218000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json new file mode 100644 index 0000000000000000000000000000000000000000..34407691cb2696fbf98b82001177e63922d08bc9 GIT binary patch literal 2437720 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 #+&1P6dN>@~ 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:30.072303000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:30.072303000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json new file mode 100644 index 0000000000000000000000000000000000000000..30a0e8c0d78ca22da356225f575e75a7787e9744 GIT binary patch literal 2425346 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 Jzx>T#{udoV5E=jg literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-24T00:37:29.611908000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-24T00:37:29.611908000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..ed92121f133b2b32621ea5b35a694653d7720d83 GIT binary patch literal 11193 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-24T00:37:29.632356000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-24T00:37:29.632356000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json new file mode 100644 index 0000000000000000000000000000000000000000..e0e9171f38f1f8af7cafa9b32f5925ad49914047 GIT binary patch literal 13996 zcmeI3%WfM-5Jj`rR|s5Z!74r{zY+ulO)(Y`NpvX6fMMw0Gd+5+<{ZV|WSJ}+&P-2t zbv>tjD^S906roa9BFr*EeuYZ02 z9rbrND-RZndXblloGmXG)636ATz2`nke0%QiO>!}LvvhxdcRcMkyW8#IVRLuf{k6Z@ypN1U4bRE`%W-$xPf$E*az5Pe zH}{Wi+E~S`i*7oP<#>gDJLlu>c(=J=MDgp%%i04jOm4Q1xA)ugzKOEE+w}9iD(Cr4 z;>l_M_;lCy@q#nW29th;HA0W}(j0R;et`6~dm8+bm)b<8PXS72wDpg_;CLRZY#ZsZ(7=L}P1!It*M3^Obt zLvq)6KLfkSij{**6-e8SSYl1elnEiYs}*(`6p~9y4NJ~2=M+=yi!Z$Sa@$d_MyMG( ztQoEi$7rn0$zlP0#1wBtO&@Im`sOIJwE=5QiTy^+39{zl zmnERLsHw1xSeN`cyuk>N9TjCW?mQS(D@c)3?5uxskmbF2ZXEyX_$eb%q1eRjRh?}1p)=v;FOtEWzynApwNgl=12l( zXbu{z&#Yt6Ak2mKN^kC<3@%Yq{SY1)4+CeyT(QIpOnO{U6TmC8GU_G~13H*sdcHE& zQYbzbSR@iR*4!3+DrZy#wmpNjB@?}rE+(H#MuxmWnn-~-#Yp7=Y9a)fQ>ho~#@4Ay z3j60u?=)?%tnfn9e$8y~eK9c1XJ=MK2V zZPO(&JeYoo1*3wni9kIvmL)T_LU$u-!qD6R6HqL$B{~8%Mx!WU$rIL?LX?Ei0Xs)+ zAT%Aq?$l7!4o4dwlz0vKY{0)3H?5^)9Av!sm#$sku! zHtbuZV@QFih!5kz@HAeE`;Xs7h+^d*Uz+2QUSRCCZU{UTXceZ2x4Tat-wSo@DCb4L~=-h)d!+n zMAn?cCFx*&uYQa*q>Ho$p^GvrbBk(m+rV;nM#$|}C>a$+$xe7OktUsp9$;2O!WU}6 z(W`GNM5Y9+pK(`e!eLo|LYG zp+ZH7eY1>l`6zD8&MyZrFEY!y55Fdsu`-bdF);>#Xo2tvdA3wR?(;!63NS(+NdXUo z<7Ys_xy3p>DjJQKTA7SC7t5#1V-`_ znwGmJ4VKHpDx$PH=UX8qxd36V6=T$SrErqPzL+=Pp#4Mv)priQqR2y93)W4{)he_| zT&X$Kl+>&kh{KTR!4-9cO8U2kOiYSqYs^@wKp;oau^{{Ja9a9Lu%ghX8Y=Ec1`N9h z9QumfK)!j&T%ZW;*)f(S|@wx=-eU5TVy; zh#ClFh&-$i-BVv&r7ogPfRLGoq)HXMk&ICtL#onD+Ds)IPf+Oo`k?APSlGDwqAk+K_6)`bl64J1nlNJ!w?324#q_lY&19%Pt_eu)#33b7?&ArP1*vh^$YhH$EcOpd`C-CAQDl0%3g zIH3!~uqe}#iweRAyWwO$Y^($m51ou6s)xZ=sF|$LhD|7y5&h@ipe}S0cb&-kl`_z_ z(1#029MD-cT^Vl2aN==IFhwQ17_^?Sjc!UksV-GBM!3Tcpz=9^NuS7(3n{ zbN(Q?oQ_Wq?azNkeTB)V_GbtEUz&W(So8s{t4@`G><%$Ok}S}7*ho<%>%^EeSV~hd z70fBY(wNni4uDcq@RU-?knTWo?L!HE)ybryPiWai@W+Zw0VYMPwq}ceB`mLO_x$Zk Wqbxmdd>`5VXr}%5^8eRAq4@`i@0YFs literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-24T00:37:29.611949000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-24T00:37:29.611949000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json new file mode 100644 index 0000000000000000000000000000000000000000..a45f6fb1f950c35b1bab17021cdd5f8c0e17152d GIT binary patch literal 14923 zcmb`O%WfM<3`J+{uL!iBg-E^UR|W$?v6WbeY$dWBAPD^L)77yh_BoEdnAxejtLwqK zyu4(!eqMd}F#5hdKI{(nqrX1<>@M4l@%eXmwY%BgpLVAo>)lOv`|rLFBdtPUoOU%pR>69jz#GzV|95ln_hnBxQ;O{eZ{iAKdsHm;4v<(qBNS8 z>CQ@ z(q1}HvZ|KXfr*p^q-QDigHM)P?@6R_6pFTZob@%J> z@VyOwIzDdu9$RluS5H@eTs4Hf2e`ZKX>+qVZ3Z(P-EMcEZ`)9#oQ+;4&~47xo62Ut?)rJQ=*5o5?Ze}~t>c%o^$ypKaQHO1)h+CE zv*OLi^~=MH=e2jr4BBNuYX5YM=LNm}^NRu7WwFRBm(_1xdyKK)?(BbjI>DkakDL~N zZ1avOj1tS@a;?RrxMTlDV!9FRV#XGUX;h|aeO7jC*ONjZ?Ya_XyYA39+^oWa?Rf^5 zxkQgq38e3Gi7vA;THomyoq7~nH))#6@BOH>L`0#*zC~sD{)XmN>G{=(#u6KnmEGGb zc#cb8irYQh3cUN@90fz6Z|oSJzI{nY!5UNhPy=dj1LND{^ht`~_pt+MZ1m((6+#!FcdBYn4w#kaQGafkt&j#tpx=q919r5ugtOLoM0M3z|0BSDG{Y< zaIZ*M!7hl06=oS#h4y>L9y0OD0@p!bqa`A^t`#C7uVp%h&P*DYfew~pb3lep07PQC zn=Dw?uR0!XeYr-L29FmihyH+4HzU_ZDsVRs99d$ z0DC4nrL970NeiPjWeUZ27+0c>J=Bb?ts-m2*x$hR$j8An07$H0*jM5!<}6=X!m>g4 zs)=ozGeu$s05V9o+Z)uroHgB5VJODd~!a2s5 zSd1k$8yjP1r&&a;L-I+oIngw19v0@q1`DhxR=6Q0zoLq>FfIhUr=i?fDwd@CD@2T74X*# zi5HGgD}wC}Dt9V-X>GGE;gn;s%5%LB_;W1 zl)+Bjq23VJL06$6q`rkiYS552UI4mmz_=);5*IEJ2ZNc35X8VJB2sE4WXlvZW~y*a zV-X|DQRN)(5e<`87JT_WZJmcxRo)bw#kik`_ z6bcy=;Lk}dOVcJD+}_4@bJjZNa$d=G(P1@-p~EXfBtxJ%V=YyM4o2j8%&cHmqAPfq z6Dx35{cfXSMZsE!vnjhHK+sRg7L1F`OtkfqBxzCuE2>Wdj@bcg5=<5}q|6{yL!F$= z2jG_g56z4fihG7wd#AIQ!2zZELvaEVP>Q}(mq4e=(#mca{!}bwCcwDj!UEA4OcYr+ zlm}=ZdJNsiA5gLGb>W9h&xOrNd6KxXqGGsOY_>V#JONB z=O6GR6$=>{R0^av435DrliI_gnhfL?%wnCDs1N6N@Hx_)%br9tBR7X&9?L)tqIo6% zfVOAQ!w9z;s`ifgI(ZRDMByN@>pslsu;=gqV_QPDCjoCd|E}kbwqS zLIOjkaV?LQ&_Rn%Iv6|Y(Qs&G4{Wb;qKJ$fPF2Iu#ONQ45|q%=)Krd2npEAzs&(4K z!d;NQLj?qut+;IZCWM;8FS$T#pdIPUnln>Lq8@3&yW~Pgo?%G@g4%OHDh?rm37RAc zsRR40;s<<`7E(1-XI-QofmvsIJc^)HWhAmXWE>~EaY%5!tSTZ>+(?Epm2_h9{K;<1 zTh8BAw~NuY$HVdQZhhN*XU=IlHIQU`SJq?8B=clxgi1*+h&@}M!~6bj=EXsWiTPq4M32f0=~ zGR2nP384(ccss+aL{om0j1MP1{IZysIR-ftDykF5MWWnGwsRjw}Rza?LPmJu+xp_mgheQ_IIBD G-1jdAULC9e literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-24T00:37:29.627284000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-24T00:37:29.627284000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json new file mode 100644 index 0000000000000000000000000000000000000000..2f7f45c7000fc3d48baeb69b38e7d3a14437440c GIT binary patch literal 23447 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.629157000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.629157000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json new file mode 100644 index 0000000000000000000000000000000000000000..2f7f45c7000fc3d48baeb69b38e7d3a14437440c GIT binary patch literal 23447 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.651813000Z_IdentityRequest_abf7b19244827334575a04cf67f428f9b6b120d8fa853e3398e1539b8fc54d9b.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.651813000Z_IdentityRequest_abf7b19244827334575a04cf67f428f9b6b120d8fa853e3398e1539b8fc54d9b.json new file mode 100644 index 0000000000000000000000000000000000000000..de49a8398d2e9381909cd23b3851e564edddd7a2 GIT binary patch literal 29547 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-24T00:37:29.650285000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-24T00:37:29.650285000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json new file mode 100644 index 0000000000000000000000000000000000000000..c82ac29784cf7b769bb91db40505e461153d80fe GIT binary patch literal 10892 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 00000000000..ca9f21e7523 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-24T00:37:29.656446000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-24T00:37:29.656446000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json new file mode 100644 index 0000000000000000000000000000000000000000..2d44ba663538639dbce3b0b1c67ec218f6d9e702 GIT binary patch literal 11317 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 Date: Wed, 24 Apr 2024 08:06:18 +0700 Subject: [PATCH 40/65] more updates --- .../document/documents_batch_transition/v0/v0_methods.rs | 5 ++--- packages/rs-drive/tests/query_tests.rs | 6 ++---- packages/rs-drive/tests/query_tests_history.rs | 6 ++---- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index abd5f88d30a..397de6c5e57 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -16,12 +16,11 @@ use crate::state_transition::documents_batch_transition::accessors::DocumentsBat #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentPurchaseTransition, DocumentTransition, DocumentTransitionV0Methods, - DocumentUpdatePriceTransition, + DocumentTransition, DocumentTransitionV0Methods, }; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentReplaceTransition, DocumentTransferTransition, + DocumentReplaceTransition, DocumentTransferTransition, DocumentPurchaseTransition, DocumentUpdatePriceTransition, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 868f9e4b9cf..024be7a873c 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -2304,8 +2304,7 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 60, 109, 98, 63, 192, 76, 21, 51, 95, 13, 145, 173, 155, 30, 5, 194, 221, 33, 152, 195, - 108, 127, 146, 37, 82, 5, 166, 38, 67, 162, 1, 83, + 251, 69, 177, 93, 128, 236, 106, 87, 205, 123, 80, 61, 44, 107, 186, 193, 22, 192, 239, 7, 107, 110, 97, 197, 59, 245, 26, 12, 63, 91, 248, 231, ], ); } @@ -2892,8 +2891,7 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 124, 137, 76, 15, 82, 78, 62, 179, 206, 204, 2, 84, 187, 107, 28, 121, 186, 221, 98, 66, - 187, 78, 66, 70, 54, 10, 193, 108, 39, 59, 195, 209, + 92, 186, 224, 49, 242, 195, 32, 14, 46, 55, 244, 57, 55, 191, 10, 119, 228, 132, 91, 235, 170, 114, 36, 41, 126, 136, 180, 51, 132, 17, 26, 182, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index ef1e5528fee..1320131b52f 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,8 +291,7 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 54, 217, 155, 152, 174, 237, 193, 15, 240, 181, 31, 17, 238, 127, 246, 92, 20, 222, 37, - 39, 104, 146, 240, 98, 159, 130, 29, 227, 5, 94, 69, 207, + 163, 151, 181, 112, 234, 184, 171, 83, 83, 105, 116, 97, 25, 160, 197, 58, 81, 214, 243, 144, 11, 91, 223, 83, 71, 99, 170, 203, 145, 244, 137, 134, ] ); @@ -1655,8 +1654,7 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 117, 239, 44, 103, 118, 107, 30, 109, 225, 15, 234, 90, 59, 0, 22, 79, 32, 4, 94, 225, - 241, 206, 146, 22, 138, 217, 87, 208, 96, 176, 216, 114 + 212, 52, 34, 33, 150, 181, 101, 7, 122, 203, 197, 177, 146, 225, 160, 186, 49, 229, 70, 206, 170, 180, 253, 90, 90, 188, 107, 108, 162, 216, 195, 81 ] ); } From 78a8ce0740f0a69f0fd915b1f8741124f00a5aaf Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 08:32:36 +0700 Subject: [PATCH 41/65] final fixes --- .../src/execution/check_tx/v0/mod.rs | 14 +++---- .../create_genesis_state/v0/mod.rs | 4 +- .../tests/strategy_tests/main.rs | 6 +-- packages/rs-drive/tests/query_tests.rs | 39 ++++++++++++------- .../rs-drive/tests/query_tests_history.rs | 6 ++- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index ee1a279c0d0..a7c6a1739dc 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -434,7 +434,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2985330); let check_result = platform .check_tx( @@ -626,7 +626,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 909510); + assert_eq!(processing_result.aggregated_fees().processing_fee, 909520); let check_result = platform .check_tx( @@ -768,7 +768,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2978520 * 2 + 2985330 * 2 ); let check_result = platform @@ -1006,7 +1006,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2985330); platform .drive @@ -1090,7 +1090,7 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 7098500 + 7125710 ); let check_result = platform @@ -1202,7 +1202,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2985330); platform .drive @@ -1322,7 +1322,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1231120); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1231130); let check_result = platform .check_tx( diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 20a540e4f39..d3f23b70ebb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -317,8 +317,8 @@ mod tests { assert_eq!( root_hash, [ - 123, 106, 97, 8, 95, 223, 24, 44, 147, 229, 106, 103, 31, 32, 29, 97, 198, 204, - 237, 215, 138, 194, 34, 107, 129, 234, 97, 250, 155, 104, 75, 210 + 162, 81, 50, 217, 246, 11, 77, 233, 231, 192, 228, 176, 197, 102, 24, 18, 160, + 5, 182, 75, 119, 174, 75, 155, 86, 92, 88, 197, 201, 60, 60, 157 ] ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index db89ed714c1..812cf5f846f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1088,7 +1088,7 @@ mod tests { .unwrap() .unwrap() ), - "547963a6f85f531173493bc145bdec8796bfd4d61240ef108c3a2644175939eb".to_string() + "3beaf287fb5fb712715e688ef3cf642e3e4042270907ebd022050b06af0cb433".to_string() ) } @@ -1778,7 +1778,7 @@ mod tests { .unwrap() .unwrap() ), - "2609439c79ea50f6f6a2d4e4f357f710097fa2fab8a196e35c176689b2f2687a".to_string() + "c0c1f59b535f358448a33c20b419b93bcfa12b05b221f77a7347892f48ca2f16".to_string() ) } @@ -1903,7 +1903,7 @@ mod tests { .unwrap() .unwrap() ), - "58b927769fb1782259883aa91a91a60c6d451cc5f95d3e0d905abcd9ff61f434".to_string() + "a7be306dcdf58930dc14befa2b78c839d66699cf9d454942ac9c595161ffe99e".to_string() ) } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 024be7a873c..9a0e0333911 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,7 +993,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12 + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2304,7 +2305,8 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 251, 69, 177, 93, 128, 236, 106, 87, 205, 123, 80, 61, 44, 107, 186, 193, 22, 192, 239, 7, 107, 110, 97, 197, 59, 245, 26, 12, 63, 91, 248, 231, + 251, 69, 177, 93, 128, 236, 106, 87, 205, 123, 80, 61, 44, 107, 186, 193, 22, 192, 239, + 7, 107, 110, 97, 197, 59, 245, 26, 12, 63, 91, 248, 231, ], ); } @@ -2450,7 +2452,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12 + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2891,7 +2894,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 92, 186, 224, 49, 242, 195, 32, 14, 46, 55, 244, 57, 55, 191, 10, 119, 228, 132, 91, 235, 170, 114, 36, 41, 126, 136, 180, 51, 132, 17, 26, 182, + 92, 186, 224, 49, 242, 195, 32, 14, 46, 55, 244, 57, 55, 191, 10, 119, 228, 132, 91, 235, + 170, 114, 36, 41, 126, 136, 180, 51, 132, 17, 26, 182, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3013,7 +3017,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12 + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3161,7 +3166,8 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3712,7 +3718,8 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3805,7 +3812,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3898,7 +3906,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3991,7 +4000,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4182,7 +4192,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95 + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, + 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4382,7 +4393,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95 + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, + 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4586,7 +4598,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95 + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, + 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 1320131b52f..d89480eb016 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,7 +291,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 163, 151, 181, 112, 234, 184, 171, 83, 83, 105, 116, 97, 25, 160, 197, 58, 81, 214, 243, 144, 11, 91, 223, 83, 71, 99, 170, 203, 145, 244, 137, 134, + 163, 151, 181, 112, 234, 184, 171, 83, 83, 105, 116, 97, 25, 160, 197, 58, 81, 214, + 243, 144, 11, 91, 223, 83, 71, 99, 170, 203, 145, 244, 137, 134, ] ); @@ -1654,7 +1655,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 212, 52, 34, 33, 150, 181, 101, 7, 122, 203, 197, 177, 146, 225, 160, 186, 49, 229, 70, 206, 170, 180, 253, 90, 90, 188, 107, 108, 162, 216, 195, 81 + 212, 52, 34, 33, 150, 181, 101, 7, 122, 203, 197, 177, 146, 225, 160, 186, 49, 229, 70, + 206, 170, 180, 253, 90, 90, 188, 107, 108, 162, 216, 195, 81 ] ); } From 905ffce1af41f5daba01ce0dba533f9825662d2e Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 11:15:41 +0700 Subject: [PATCH 42/65] fix --- .../wasm-dpp/test/unit/dataContract/DataContract.spec.js | 5 +++-- .../DataContractCreateTransition.spec.js | 2 +- .../DataContractUpdateTransition.spec.js | 2 +- packages/wasm-dpp/test/unit/document/Document.spec.js | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js index 649e61bc986..6aa9d23161d 100644 --- a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js @@ -223,7 +223,7 @@ describe('DataContract', () => { config: { $format_version: '0', canBeDeleted: false, - documentsKeepHistoryContractDefault: false, + documentsKeepHistoryContractDefault: true, documentsMutableContractDefault: true, keepsHistory: false, readonly: false, @@ -252,6 +252,7 @@ describe('DataContract', () => { config: { $format_version: '0', canBeDeleted: false, + documentsCanBeDeletedContractDefault: true, documentsKeepHistoryContractDefault: false, documentsMutableContractDefault: true, keepsHistory: false, @@ -272,7 +273,7 @@ describe('DataContract', () => { it('should return DataContract as a Buffer', () => { const result = dataContract.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(235); + expect(result).to.have.lengthOf(236); }); }); diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js index 973c2f90e31..dc394aee3c6 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js @@ -66,7 +66,7 @@ describe('DataContractCreateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2358); + expect(result).to.have.lengthOf(2359); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js index dd2cda514c3..444f695113c 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js @@ -65,7 +65,7 @@ describe('DataContractUpdateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2358); + expect(result).to.have.lengthOf(2359); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index 8e7f80d90b5..3caa3750ccf 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -424,7 +424,7 @@ describe('Document', () => { it('should return serialized Document', () => { const buffer = document.toBuffer(); expect(buffer).to.be.instanceOf(Buffer); - expect(buffer.length).to.equal(648); + expect(buffer.length).to.equal(649); }); // TODO: remove or replace? From 7115e7d0efceda7fb56279b983268565199c002d Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 11:32:12 +0700 Subject: [PATCH 43/65] fix --- packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js index 6aa9d23161d..4726cb31cd5 100644 --- a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js @@ -223,7 +223,8 @@ describe('DataContract', () => { config: { $format_version: '0', canBeDeleted: false, - documentsKeepHistoryContractDefault: true, + documentsCanBeDeletedContractDefault: true, + documentsKeepHistoryContractDefault: false, documentsMutableContractDefault: true, keepsHistory: false, readonly: false, From a828b3031ebda5c0b9c272009ee2c2e413c69c1a Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 22:14:04 +0700 Subject: [PATCH 44/65] added contract update checks --- .../methods/validate_config_update/v0/mod.rs | 14 + ...incompatible_data_contract_schema_error.rs | 2 +- .../data_contract_update/mod.rs | 174 ++++++++- .../data_contract_update/state/v0/mod.rs | 1 + .../src/rules/rule_set.rs | 351 ++++++++++++++++++ 5 files changed, 540 insertions(+), 2 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs index 0003e220b1b..663ce3777a0 100644 --- a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs @@ -92,6 +92,20 @@ impl DataContractConfig { ); } + // Validate: Documents can be deleted contract default did not change + + if new_config.documents_can_be_deleted_contract_default() + != self.documents_can_be_deleted_contract_default() + { + return SimpleConsensusValidationResult::new_with_error( + DataContractConfigUpdateError::new( + contract_id, + "contract can not change the default of whether documents can be deleted", + ) + .into(), + ); + } + // Validate: Requires identity encryption bounded key did not change if new_config.requires_identity_encryption_bounded_key() diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs index 444662dfd88..9a75c009495 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs @@ -11,7 +11,7 @@ use bincode::{Decode, Encode}; #[derive( Error, Debug, Clone, PartialEq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Data Contract updated schema is not backward compatible with one defined in Data Contract wid id {data_contract_id}. Field: '{field_path}', Operation: '{operation}'" +#[error("Data Contract updated schema is not backward compatible with one defined in Data Contract with id {data_contract_id}. Field: '{field_path}', Operation: '{operation}'" )] #[platform_serialize(unversioned)] pub struct IncompatibleDataContractSchemaError { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index ae9be56b215..5f3f95ad4e3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -52,24 +52,98 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { #[cfg(test)] mod tests { + use std::collections::BTreeMap; + use rand::prelude::StdRng; + use rand::SeedableRng; use crate::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; use dpp::block::block_info::BlockInfo; + use dpp::dash_to_credits; + use dpp::data_contract::accessors::v0::DataContractV0Setters; use dpp::data_contract::DataContract; + use dpp::fee::Credits; + use dpp::identifier::Identifier; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::platform_value::BinaryData; - use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; + use dpp::serialization::PlatformSerializable; + use dpp::state_transition::data_contract_update_transition::{DataContractUpdateTransition, DataContractUpdateTransitionV0}; + use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; use dpp::tests::fixtures::get_data_contract_fixture; + use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; + use drive::drive::flags::StorageFlags; + use simple_signer::signer::SimpleSigner; + use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; struct TestData { data_contract: DataContract, platform: TempPlatform, } + fn setup_identity( + platform: &mut TempPlatform, + seed: u64, + credits: Credits, + ) -> (Identity, SimpleSigner, IdentityPublicKey) { + let platform_version = PlatformVersion::latest(); + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(seed); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key_with_rng( + 0, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key_with_rng( + 1, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(critical_public_key.clone(), private_key.clone()); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key.clone()), + ]), + balance: credits, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + (identity, signer, critical_public_key) + } + fn apply_contract( platform: &TempPlatform, data_contract: &DataContract, @@ -484,4 +558,102 @@ mod tests { ); } } + + #[test] + fn test_data_contract_update_changing_various_document_type_options( + ) { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json"; + + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let mut contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + + contract.set_owner_id(identity.id()); + + platform + .drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + + let updated_card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json"; + + // let's construct the grovedb structure for the card game data contract + let mut contract_not_restricted_to_owner = json_document_to_contract(updated_card_game_path, true, platform_version) + .expect("expected to get data contract"); + + contract_not_restricted_to_owner.set_owner_id(identity.id()); + + contract_not_restricted_to_owner.set_version(2); + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + contract_not_restricted_to_owner, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + // There is no issue because the creator of the contract made the document + + assert_eq!(processing_result.invalid_paid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Data Contract updated schema is not backward compatible with one defined in Data Contract with id 86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e. Field: '/creationRestrictionMode', Operation: 'remove'"); + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index eacae1bdd34..8eb26952765 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -173,6 +173,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr // - Keeps history did not change // - Can be deleted did not change // - Documents keep history did not change + // - Documents can be deleted contract default did not change // - Documents mutable contract default did not change // - Requires identity encryption bounded key did not change // - Requires identity decryption bounded key did not change diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs index f04f513e270..110eae0cb0f 100644 --- a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs +++ b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs @@ -1374,5 +1374,356 @@ pub static KEYWORD_COMPATIBILITY_RULES: Lazy Date: Wed, 24 Apr 2024 22:40:40 +0700 Subject: [PATCH 45/65] update grovedb --- Cargo.lock | 12 ++++++------ packages/rs-drive/Cargo.toml | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bdef2883fd0..0da514223e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1876,7 +1876,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "bincode", "grovedb-costs", @@ -1897,7 +1897,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "integer-encoding", "intmap", @@ -1907,7 +1907,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "blake3", "byteorder", @@ -1930,12 +1930,12 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "blake3", "grovedb-costs", @@ -1954,7 +1954,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?branch=feat/ElementFlagsReplacements#51c9ab455e1b9fd98fa833cd3cec6f20795c8f0b" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "hex", "itertools 0.12.1", diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index dc9a4db779e..dedd0375754 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -45,10 +45,10 @@ enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements", optional = true, default-features = false } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", branch = "feat/ElementFlagsReplacements", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true } [dev-dependencies] criterion = "0.3.5" From e6c6aeaa8a8570bfd27740dafde923448d4949a4 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 24 Apr 2024 23:12:29 +0700 Subject: [PATCH 46/65] fmt --- .../methods/validate_config_update/v0/mod.rs | 2 +- .../data_contract_update/mod.rs | 61 +++++++++---------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs index 663ce3777a0..90cc1ef73cd 100644 --- a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs @@ -102,7 +102,7 @@ impl DataContractConfig { contract_id, "contract can not change the default of whether documents can be deleted", ) - .into(), + .into(), ); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 5f3f95ad4e3..4215a4ce699 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -52,9 +52,6 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { #[cfg(test)] mod tests { - use std::collections::BTreeMap; - use rand::prelude::StdRng; - use rand::SeedableRng; use crate::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::MockCoreRPCLike; @@ -62,24 +59,29 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::dash_to_credits; use dpp::data_contract::accessors::v0::DataContractV0Setters; + use rand::prelude::StdRng; + use rand::SeedableRng; + use std::collections::BTreeMap; use dpp::data_contract::DataContract; use dpp::fee::Credits; use dpp::identifier::Identifier; - use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; use dpp::platform_value::BinaryData; use dpp::serialization::PlatformSerializable; - use dpp::state_transition::data_contract_update_transition::{DataContractUpdateTransition, DataContractUpdateTransitionV0}; use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; + use dpp::state_transition::data_contract_update_transition::{ + DataContractUpdateTransition, DataContractUpdateTransitionV0, + }; + use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use dpp::tests::fixtures::get_data_contract_fixture; use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; use drive::drive::flags::StorageFlags; use simple_signer::signer::SimpleSigner; - use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; struct TestData { data_contract: DataContract, @@ -102,7 +104,7 @@ mod tests { &mut rng, platform_version, ) - .expect("expected to get key pair"); + .expect("expected to get key pair"); signer.add_key(master_key.clone(), master_private_key.clone()); @@ -112,7 +114,7 @@ mod tests { &mut rng, platform_version, ) - .expect("expected to get key pair"); + .expect("expected to get key pair"); signer.add_key(critical_public_key.clone(), private_key.clone()); @@ -125,7 +127,7 @@ mod tests { balance: credits, revision: 0, } - .into(); + .into(); // We just add this identity to the system first @@ -560,8 +562,7 @@ mod tests { } #[test] - fn test_data_contract_update_changing_various_document_type_options( - ) { + fn test_data_contract_update_changing_various_document_type_options() { let mut platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); @@ -596,29 +597,28 @@ mod tests { ) .expect("expected to apply contract successfully"); - let updated_card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json"; // let's construct the grovedb structure for the card game data contract - let mut contract_not_restricted_to_owner = json_document_to_contract(updated_card_game_path, true, platform_version) - .expect("expected to get data contract"); + let mut contract_not_restricted_to_owner = + json_document_to_contract(updated_card_game_path, true, platform_version) + .expect("expected to get data contract"); contract_not_restricted_to_owner.set_owner_id(identity.id()); contract_not_restricted_to_owner.set_version(2); - - let data_contract_update_transition = - DataContractUpdateTransition::new_from_data_contract( - contract_not_restricted_to_owner, - &identity.into_partial_identity_info(), - key.id(), - 2, - 0, - &signer, - platform_version, - None, - ) - .expect("expect to create documents batch transition"); + + let data_contract_update_transition = DataContractUpdateTransition::new_from_data_contract( + contract_not_restricted_to_owner, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); let data_contract_update_serialized_transition = data_contract_update_transition .serialize_to_bytes() @@ -650,10 +650,9 @@ mod tests { let result = processing_result.into_execution_results().remove(0); - let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result - else { - panic!("expected a paid consensus error"); - }; + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result else { + panic!("expected a paid consensus error"); + }; assert_eq!(consensus_error.to_string(), "Data Contract updated schema is not backward compatible with one defined in Data Contract with id 86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e. Field: '/creationRestrictionMode', Operation: 'remove'"); } } From b41ed4cb6d5392b809ec7176eaa5c16ba3be240b Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 25 Apr 2024 01:03:27 +0700 Subject: [PATCH 47/65] fix --- .../src/rules/rule_set.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs index 110eae0cb0f..b037bd1bb74 100644 --- a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs +++ b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs @@ -1670,7 +1670,7 @@ pub static KEYWORD_COMPATIBILITY_RULES: Lazy Date: Thu, 25 Apr 2024 13:27:50 +0700 Subject: [PATCH 48/65] fix --- .../src/rules/rule_set.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs index b037bd1bb74..840614a1e3a 100644 --- a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs +++ b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs @@ -1592,7 +1592,7 @@ pub static KEYWORD_COMPATIBILITY_RULES: Lazy Date: Thu, 25 Apr 2024 13:38:02 +0700 Subject: [PATCH 49/65] fix --- .../src/rules/rule_set.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs index 840614a1e3a..54798669892 100644 --- a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs +++ b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs @@ -1506,7 +1506,7 @@ pub static KEYWORD_COMPATIBILITY_RULES: Lazy Date: Thu, 25 Apr 2024 18:10:26 +0700 Subject: [PATCH 50/65] Update packages/rs-dpp/src/data_contract/config/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/config/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 0bc5c68f6ce..56da21f4be8 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -29,7 +29,7 @@ pub struct DataContractConfigV0 { pub documents_keep_history_contract_default: bool, /// Are documents in the contract mutable? This specifies whether the document can be /// changed. This is a default for all documents in the contract, but can be - /// overridden by the document itself. + /// overridden by the document type config. pub documents_mutable_contract_default: bool, /// Can documents in the contract be deleted? This specifies whether the document can be /// deleted. This is a default for all documents in the contract, but can be From 4a26a01e3ad6a5265fcd6ffa6438d706f53e1566 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:10:42 +0700 Subject: [PATCH 51/65] Update packages/rs-dpp/src/data_contract/config/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/config/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 56da21f4be8..bdf91e15af7 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -27,7 +27,7 @@ pub struct DataContractConfigV0 { /// Do documents in the contract keep history. This is a default for all documents in /// the contract, but can be overridden by the document itself pub documents_keep_history_contract_default: bool, - /// Are documents in the contract mutable? This specifies whether the document can be + /// Are documents in the contract mutable? This specifies whether the documents can be /// changed. This is a default for all documents in the contract, but can be /// overridden by the document type config. pub documents_mutable_contract_default: bool, From 5dedad396cae3413b9ccc0fa6084f304f8d07f89 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:10:55 +0700 Subject: [PATCH 52/65] Update packages/rs-dpp/src/data_contract/config/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/config/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index bdf91e15af7..9385838a29f 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -28,7 +28,7 @@ pub struct DataContractConfigV0 { /// the contract, but can be overridden by the document itself pub documents_keep_history_contract_default: bool, /// Are documents in the contract mutable? This specifies whether the documents can be - /// changed. This is a default for all documents in the contract, but can be + /// changed. This is a default for all document types in the contract, but can be /// overridden by the document type config. pub documents_mutable_contract_default: bool, /// Can documents in the contract be deleted? This specifies whether the document can be From ab6046ad75ccebcb70e30b8f96ebfa13244c45ff Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:11:04 +0700 Subject: [PATCH 53/65] Update packages/rs-dpp/src/document/v0/serialize.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/document/v0/serialize.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 72e8fbd5989..a26879d9ff9 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -615,7 +615,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - // Now we serialize the price which might not be necessary unless called for by the document type + // Now we deserialize the price which might not be necessary unless called for by the document type let price = if document_type.trade_mode().seller_sets_price() { let has_price = buf.read_u8().map_err(|_| { From 6e87d5ec2e116c630b7a9e95c6a0ca04085f18a5 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:11:11 +0700 Subject: [PATCH 54/65] Update packages/rs-dpp/src/nft/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/nft/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/nft/mod.rs b/packages/rs-dpp/src/nft/mod.rs index 386585dc713..884906fb1e8 100644 --- a/packages/rs-dpp/src/nft/mod.rs +++ b/packages/rs-dpp/src/nft/mod.rs @@ -46,7 +46,7 @@ impl TryFrom for TradeMode { // 3 => Ok(Self::PrivateOffer), value => Err(ProtocolError::ConsensusError( ConsensusError::BasicError(BasicError::UnknownTradeModeError( - UnknownTradeModeError::new(vec![0, 1], value.into()), + UnknownTradeModeError::new(vec![0, 1], value), )) .into(), )), From 7ca1cee447a818335dac8c16912edec35c2b2905 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:14:23 +0700 Subject: [PATCH 55/65] Update packages/rs-drive/src/drive/flags.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-drive/src/drive/flags.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index e9ada6f0a79..322e2411f97 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -130,7 +130,7 @@ impl StorageFlags { if our_owner_id != other_owner_id { match merging_owners_strategy { MergingOwnersStrategy::RaiseIssue => { - return Err(Error::StorageFlags( + Err(Error::StorageFlags( StorageFlagsError::MergingStorageFlagsFromDifferentOwners( "can not merge from different owners", ), From 3e6c5aa2f9a2e1edc6f2c1f97e78a293bda2d6e6 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:14:41 +0700 Subject: [PATCH 56/65] Update packages/rs-dpp/src/data_contract/config/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/config/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 9385838a29f..d14aed88ba9 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -31,7 +31,7 @@ pub struct DataContractConfigV0 { /// changed. This is a default for all document types in the contract, but can be /// overridden by the document type config. pub documents_mutable_contract_default: bool, - /// Can documents in the contract be deleted? This specifies whether the document can be + /// Can documents in the contract be deleted? This specifies whether the documents can be /// deleted. This is a default for all documents in the contract, but can be /// overridden by the document itself. pub documents_can_be_deleted_contract_default: bool, From 5fe56a0117ad8a92694948dbd4dcc4caf495549b Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:14:51 +0700 Subject: [PATCH 57/65] Update packages/rs-dpp/src/data_contract/config/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/config/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index d14aed88ba9..2912ccd661d 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -32,7 +32,7 @@ pub struct DataContractConfigV0 { /// overridden by the document type config. pub documents_mutable_contract_default: bool, /// Can documents in the contract be deleted? This specifies whether the documents can be - /// deleted. This is a default for all documents in the contract, but can be + /// deleted. This is a default for all document types in the contract, but can be /// overridden by the document itself. pub documents_can_be_deleted_contract_default: bool, /// Encryption key storage requirements From 7668c853c538be64d9eeabd9eaf91d5514a7bc9c Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:15:02 +0700 Subject: [PATCH 58/65] Update packages/rs-dpp/src/data_contract/config/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- packages/rs-dpp/src/data_contract/config/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 2912ccd661d..329361befe4 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -33,7 +33,7 @@ pub struct DataContractConfigV0 { pub documents_mutable_contract_default: bool, /// Can documents in the contract be deleted? This specifies whether the documents can be /// deleted. This is a default for all document types in the contract, but can be - /// overridden by the document itself. + /// overridden by the document types itself. pub documents_can_be_deleted_contract_default: bool, /// Encryption key storage requirements pub requires_identity_encryption_bounded_key: Option, From 407815909bb43e7104f270fe75b1729403ed5144 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:15:31 +0700 Subject: [PATCH 59/65] Update packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../document_type/class_methods/try_from_schema/v0/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 67f5746dea1..00d16d6fcfa 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -247,7 +247,7 @@ impl DocumentTypeV0 { let trade_mode = documents_trade_mode_u8.try_into()?; - // Are documents of this type transferable? + // What is the creation restriction mode of this document type? let documents_creation_restriction_mode_u8: u8 = Value::inner_optional_integer_value(schema_map, CREATION_RESTRICTION_MODE) .map_err(consensus_or_protocol_value_error)? From d8ede399aeb037ba59b6b1910f23da63c8accc0f Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 18:15:48 +0700 Subject: [PATCH 60/65] Update packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> --- .../src/data_contract/document_type/restricted_creation/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs index 41e5286fe31..c0df033e0c2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs @@ -36,7 +36,7 @@ impl TryFrom for CreationRestrictionMode { BasicError::UnknownDocumentCreationRestrictionModeError( UnknownDocumentCreationRestrictionModeError::new( vec![0, 1, 2], - value.into(), + value, ), ), ) From 428bb1b0dc2d8ab13a207261a5191d1bda82ab84 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 25 Apr 2024 18:17:55 +0700 Subject: [PATCH 61/65] fixes --- .../schema/meta_schemas/document/v0/document-meta.json | 4 +--- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index b256f4fcf39..e25b17af3d8 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -505,9 +505,7 @@ "type": "integer", "enum": [ 0, - 1, - 2, - 3 + 1 ], "description": "Built in marketplace system. 0 - None, 1 - Direct purchase (The user can buy the item without the need for an approval)" }, diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 4286143d5e9..1a703b6b4b9 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -208,7 +208,7 @@ impl Drive { DocumentTransition::UpdatePrice(update_price_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; let new_document_price : Credits = document.properties().get_integer(PRICE).map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; - if new_document_price == update_price_transition.price() { + if new_document_price != update_price_transition.price() { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); } Ok(( diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs index f39550affd2..6054d09f9b8 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -31,15 +31,15 @@ impl DocumentUpdatePriceTransitionActionV0 { modified_document.bump_revision(); - if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { + if base.document_type_field_is_required(property_names::UPDATED_AT)? { modified_document.set_updated_at(Some(block_info.time_ms)); } - if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { + if base.document_type_field_is_required(property_names::UPDATED_AT_BLOCK_HEIGHT)? { modified_document.set_updated_at_block_height(Some(block_info.height)); } - if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { + if base.document_type_field_is_required(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT)? { modified_document.set_updated_at_core_block_height(Some(block_info.core_height)); } From 331aa8b9462bf0ed704f4a5788770506ed26f05a Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 25 Apr 2024 18:18:24 +0700 Subject: [PATCH 62/65] fmt --- .../data_contract/document_type/restricted_creation/mod.rs | 5 +---- packages/rs-drive/src/drive/flags.rs | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs index c0df033e0c2..81194382f46 100644 --- a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs @@ -34,10 +34,7 @@ impl TryFrom for CreationRestrictionMode { value => Err(ProtocolError::ConsensusError( ConsensusError::BasicError( BasicError::UnknownDocumentCreationRestrictionModeError( - UnknownDocumentCreationRestrictionModeError::new( - vec![0, 1, 2], - value, - ), + UnknownDocumentCreationRestrictionModeError::new(vec![0, 1, 2], value), ), ) .into(), diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index 322e2411f97..cab6c0ab4f8 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -130,7 +130,7 @@ impl StorageFlags { if our_owner_id != other_owner_id { match merging_owners_strategy { MergingOwnersStrategy::RaiseIssue => { - Err(Error::StorageFlags( + Err(Error::StorageFlags( StorageFlagsError::MergingStorageFlagsFromDifferentOwners( "can not merge from different owners", ), From 97a54f86bdcde222af589f3da90424267f5d30a6 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 25 Apr 2024 18:37:55 +0700 Subject: [PATCH 63/65] fix --- packages/rs-drive/src/drive/flags.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index cab6c0ab4f8..3fb50cbd71d 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -134,8 +134,8 @@ impl StorageFlags { StorageFlagsError::MergingStorageFlagsFromDifferentOwners( "can not merge from different owners", ), - )); - } + )) + }, MergingOwnersStrategy::UseOurs => Ok(Some(our_owner_id)), MergingOwnersStrategy::UseTheirs => Ok(Some(other_owner_id)), } From 42a2884161bdd9ba67cb9f2e8fdb563c724e796a Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 25 Apr 2024 18:40:14 +0700 Subject: [PATCH 64/65] fix --- packages/rs-drive/src/drive/flags.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index 3fb50cbd71d..d456346943c 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -129,13 +129,11 @@ impl StorageFlags { if let Some(other_owner_id) = rhs.owner_id() { if our_owner_id != other_owner_id { match merging_owners_strategy { - MergingOwnersStrategy::RaiseIssue => { - Err(Error::StorageFlags( - StorageFlagsError::MergingStorageFlagsFromDifferentOwners( - "can not merge from different owners", - ), - )) - }, + MergingOwnersStrategy::RaiseIssue => Err(Error::StorageFlags( + StorageFlagsError::MergingStorageFlagsFromDifferentOwners( + "can not merge from different owners", + ), + )), MergingOwnersStrategy::UseOurs => Ok(Some(our_owner_id)), MergingOwnersStrategy::UseTheirs => Ok(Some(other_owner_id)), } From c0a98eff85f4e155b83a2747df8ef707d62ee9de Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 25 Apr 2024 19:12:16 +0700 Subject: [PATCH 65/65] fix --- .../state_transitions/documents_batch/mod.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index f011cda9588..4926564cbbe 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -3145,7 +3145,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6822950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); let query_sender_results = platform .drive @@ -3387,7 +3387,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().storage_fee, 756000); // we added 28 bytes, // todo: investigate why + assert_eq!(processing_result.aggregated_fees().storage_fee, 216000); // we added 8 bytes for the price assert_eq!( processing_result @@ -3397,7 +3397,7 @@ mod tests { None ); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6822950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); let seller_balance = platform .drive @@ -3408,7 +3408,7 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.1) - 6822950 - 756000 - original_creation_cost + dash_to_credits!(0.1) - 6814950 - 216000 - original_creation_cost ); let query_sender_results = platform @@ -3503,7 +3503,7 @@ mod tests { assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10897700); + assert_eq!(processing_result.aggregated_fees().processing_fee, 10873700); assert_eq!( processing_result @@ -3537,7 +3537,7 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.2) - 6822950 - 756000 - original_creation_cost + 22704503 + dash_to_credits!(0.2) - 6814950 - 216000 - original_creation_cost + 22704503 ); let buyers_balance = platform @@ -3547,7 +3547,7 @@ mod tests { .expect("expected that purchaser exists"); // the buyer payed 0.1, but also storage and processing fees - assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10897700 - 64611000); + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10873700 - 64611000); } #[test] @@ -4413,7 +4413,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6822950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); let query_sender_results = platform .drive