diff --git a/packages/rs-dpp/src/block_time_window/validate_time_in_block_time_window.rs b/packages/rs-dpp/src/block_time_window/validate_time_in_block_time_window.rs index 65f18fcd3ac..e482049a35b 100644 --- a/packages/rs-dpp/src/block_time_window/validate_time_in_block_time_window.rs +++ b/packages/rs-dpp/src/block_time_window/validate_time_in_block_time_window.rs @@ -3,17 +3,22 @@ use crate::prelude::TimestampMillis; use super::validation_result::TimeWindowValidationResult; pub const BLOCK_TIME_WINDOW_MINUTES: u64 = 5; -pub const BLOCK_TIME_WINDOW_MILLIS: u64 = BLOCK_TIME_WINDOW_MINUTES * 60 * 1000; +pub const BLOCK_TIME_WINDOW_MILLIS: TimestampMillis = BLOCK_TIME_WINDOW_MINUTES * 60 * 1000; pub fn validate_time_in_block_time_window( last_block_header_time_millis: TimestampMillis, time_to_check_millis: TimestampMillis, ) -> TimeWindowValidationResult { - let time_window_start = last_block_header_time_millis - BLOCK_TIME_WINDOW_MILLIS; - let time_window_end = last_block_header_time_millis + BLOCK_TIME_WINDOW_MILLIS; + let maybe_time_window_start = + last_block_header_time_millis.checked_sub(BLOCK_TIME_WINDOW_MILLIS); + let maybe_time_window_end = last_block_header_time_millis.checked_add(BLOCK_TIME_WINDOW_MILLIS); - let valid = - time_to_check_millis >= time_window_start && time_to_check_millis <= time_window_end; + let time_window_start = maybe_time_window_start.unwrap_or(TimestampMillis::MIN); + let time_window_end = maybe_time_window_end.unwrap_or(TimestampMillis::MAX); + + let valid = maybe_time_window_start.is_some() + && maybe_time_window_end.is_some() + && (time_to_check_millis >= time_window_start && time_to_check_millis <= time_window_end); TimeWindowValidationResult { time_window_start, diff --git a/packages/rs-dpp/src/dash_platform_protocol.rs b/packages/rs-dpp/src/dash_platform_protocol.rs index e701005d0c6..198d9a9032e 100644 --- a/packages/rs-dpp/src/dash_platform_protocol.rs +++ b/packages/rs-dpp/src/dash_platform_protocol.rs @@ -1,3 +1,4 @@ +use crate::prelude::ProtocolVersion; use crate::BlsModule; use std::sync::Arc; @@ -8,7 +9,7 @@ use crate::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION pub struct DashPlatformProtocol { /// Version of protocol - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, /// Public facing facades to interact with the library pub identities: IdentityFacade, /// State Repository provides the access to the stateful validation @@ -51,5 +52,5 @@ impl DashPlatformProtocol { #[derive(Default)] pub struct DPPOptions { - pub current_protocol_version: Option, + pub current_protocol_version: Option, } diff --git a/packages/rs-dpp/src/data_contract/data_contract.rs b/packages/rs-dpp/src/data_contract/data_contract.rs index 3d00fbd2791..80f8cae3f41 100644 --- a/packages/rs-dpp/src/data_contract/data_contract.rs +++ b/packages/rs-dpp/src/data_contract/data_contract.rs @@ -19,6 +19,7 @@ use crate::data_contract::contract_config::{ }; use crate::data_contract::get_binary_properties_from_schema::get_binary_properties; +use crate::prelude::{DataContractVersion, ProtocolVersion}; use crate::util::cbor_value::CborCanonicalMap; use crate::util::deserializer; use crate::util::deserializer::SplitProtocolVersionOutcome; @@ -80,12 +81,12 @@ impl Convertible for DataContract { #[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq)] #[serde(rename_all = "camelCase")] pub struct DataContract { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "$id")] pub id: Identifier, #[serde(rename = "$schema")] pub schema: String, - pub version: u32, + pub version: DataContractVersion, pub owner_id: Identifier, #[serde(rename = "documents")] diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index 6abea896230..392958bee70 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -4,7 +4,7 @@ use crate::data_contract::state_transition::{ use crate::data_contract::validation::data_contract_validator::DataContractValidator; use crate::data_contract::{DataContract, DataContractFactory}; use crate::document::document_transition::document_base_transition::JsonValue; -use crate::prelude::{Identifier, ValidationResult}; +use crate::prelude::{Identifier, ProtocolVersion, ValidationResult}; use crate::version::ProtocolVersionValidator; use crate::ProtocolError; use std::sync::Arc; @@ -16,7 +16,7 @@ pub struct DataContractFacade { impl DataContractFacade { pub fn new( - protocol_version: u32, + protocol_version: ProtocolVersion, protocol_version_validator: Arc, ) -> Self { let validator = Arc::new(DataContractValidator::new(protocol_version_validator)); diff --git a/packages/rs-dpp/src/data_contract/data_contract_factory.rs b/packages/rs-dpp/src/data_contract/data_contract_factory.rs index a3f0baccb07..b849d8bd570 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_factory.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_factory.rs @@ -6,6 +6,7 @@ use data_contract::state_transition::property_names as st_prop; use crate::data_contract::errors::InvalidDataContractError; use crate::data_contract::property_names; +use crate::prelude::ProtocolVersion; use crate::util::serializer::value_to_cbor; use crate::{ data_contract::{self, generate_data_contract_id}, @@ -35,13 +36,16 @@ impl EntropyGenerator for DefaultEntropyGenerator { } pub struct DataContractFactory { - protocol_version: u32, + protocol_version: ProtocolVersion, validate_data_contract: Arc, entropy_generator: Box, } impl DataContractFactory { - pub fn new(protocol_version: u32, validate_data_contract: Arc) -> Self { + pub fn new( + protocol_version: ProtocolVersion, + validate_data_contract: Arc, + ) -> Self { Self { protocol_version, validate_data_contract, @@ -50,7 +54,7 @@ impl DataContractFactory { } pub fn new_with_entropy_generator( - protocol_version: u32, + protocol_version: ProtocolVersion, validate_data_contract: Arc, entropy_generator: Box, ) -> Self { diff --git a/packages/rs-dpp/src/data_contract/document_type/document_type.rs b/packages/rs-dpp/src/data_contract/document_type/document_type.rs index b58ffdcbc18..c613acca60e 100644 --- a/packages/rs-dpp/src/data_contract/document_type/document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/document_type.rs @@ -8,12 +8,13 @@ use super::{ use crate::data_contract::document_type::{property_names, ArrayFieldType}; use crate::data_contract::errors::{DataContractError, StructureError}; +use crate::prelude::ProtocolVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::Value; use serde::{Deserialize, Serialize}; -pub const PROTOCOL_VERSION: u32 = 1; +pub const PROTOCOL_VERSION: ProtocolVersion = 1; pub const CONTRACT_DOCUMENTS_PATH_HEIGHT: u16 = 4; pub const BASE_CONTRACT_ROOT_PATH_SIZE: usize = 33; // 1 + 32 pub const BASE_CONTRACT_KEEPING_HISTORY_STORAGE_PATH_SIZE: usize = 34; // 1 + 32 + 1 diff --git a/packages/rs-dpp/src/data_contract/extra/common.rs b/packages/rs-dpp/src/data_contract/extra/common.rs index cfda86df36b..b7698206f67 100644 --- a/packages/rs-dpp/src/data_contract/extra/common.rs +++ b/packages/rs-dpp/src/data_contract/extra/common.rs @@ -1,4 +1,5 @@ use crate::data_contract::errors::StructureError; +use crate::prelude::ProtocolVersion; use crate::util::cbor_value::cbor_value_into_json_value; use crate::util::serializer::value_to_cbor; use crate::ProtocolError; @@ -273,14 +274,14 @@ pub fn json_document_to_value(path: impl AsRef) -> Result, - protocol_version: Option, + protocol_version: Option, ) -> Result, ProtocolError> { let json = json_document_to_value(path)?; value_to_cbor(json, protocol_version) } /// Make sure the protocol version is correct. -pub const fn check_protocol_version(_version: u32) -> bool { +pub const fn check_protocol_version(_version: ProtocolVersion) -> bool { // Temporary disabled due protocol version is dynamic and goes from consensus params true } diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index bd3d647b4df..e99859d35dd 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -7,7 +7,7 @@ use serde_json::Value as JsonValue; use crate::{ data_contract::DataContract, identity::KeyID, - prelude::Identifier, + prelude::{Identifier, ProtocolVersion}, state_transition::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransitionConvert, StateTransitionIdentitySigned, StateTransitionLike, @@ -25,7 +25,7 @@ pub mod validation; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DataContractCreateTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "type")] pub transition_type: StateTransitionType, // we want to skip serialization of transitions, as we does it manually in `to_object()` and `to_json()` @@ -57,7 +57,7 @@ impl DataContractCreateTransition { mut raw_data_contract_update_transition: JsonValue, ) -> Result { Ok(DataContractCreateTransition { - protocol_version: raw_data_contract_update_transition.get_u64(PROTOCOL_VERSION)? as u32, + protocol_version: raw_data_contract_update_transition.get_u32(PROTOCOL_VERSION)?, signature: raw_data_contract_update_transition .remove_into(SIGNATURE) .unwrap_or_default(), @@ -80,7 +80,7 @@ impl DataContractCreateTransition { &self.data_contract } - pub fn get_protocol_version(&self) -> u32 { + pub fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } @@ -114,7 +114,7 @@ impl StateTransitionIdentitySigned for DataContractCreateTransition { } impl StateTransitionLike for DataContractCreateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } /// returns the type of State Transition @@ -268,8 +268,8 @@ mod test { assert_eq!( version::LATEST_VERSION, json_object - .get_u64(PROTOCOL_VERSION) - .expect("the protocol version should be present") as u32 + .get_u32(PROTOCOL_VERSION) + .expect("the protocol version should be present") ); assert_eq!( diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 6392a036a0b..426a23a89b1 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -4,7 +4,7 @@ use serde_json::Value as JsonValue; use crate::{ data_contract::DataContract, identity::KeyID, - prelude::Identifier, + prelude::{Identifier, ProtocolVersion}, state_transition::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransitionConvert, StateTransitionIdentitySigned, StateTransitionLike, @@ -22,7 +22,7 @@ pub mod validation; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DataContractUpdateTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "type")] pub transition_type: StateTransitionType, // we want to skip serialization of transitions, as we does it manually in `to_object()` and `to_json()` @@ -52,7 +52,7 @@ impl DataContractUpdateTransition { mut raw_data_contract_update_transition: JsonValue, ) -> Result { Ok(DataContractUpdateTransition { - protocol_version: raw_data_contract_update_transition.get_u64(PROTOCOL_VERSION)? as u32, + protocol_version: raw_data_contract_update_transition.get_u32(PROTOCOL_VERSION)?, signature: raw_data_contract_update_transition .remove_into(SIGNATURE) .unwrap_or_default(), @@ -96,7 +96,7 @@ impl StateTransitionIdentitySigned for DataContractUpdateTransition { } impl StateTransitionLike for DataContractUpdateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } /// returns the type of State Transition @@ -249,8 +249,8 @@ mod test { assert_eq!( version::LATEST_VERSION, json_object - .get_u64(PROTOCOL_VERSION) - .expect("the protocol version should be present") as u32 + .get_u32(PROTOCOL_VERSION) + .expect("the protocol version should be present") ); assert_eq!( diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs index e7a37e4b683..d4ab58057f7 100644 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs +++ b/packages/rs-dpp/src/data_contract/state_transition/data_contract_update_transition/validation/basic/validate_data_contract_update_transition_basic.rs @@ -6,6 +6,7 @@ use crate::consensus::basic::data_contract::{ use crate::consensus::basic::decode::ProtocolVersionParsingError; use crate::consensus::basic::invalid_data_contract_version_error::InvalidDataContractVersionError; use crate::consensus::ConsensusError; +use crate::prelude::ProtocolVersion; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use crate::{ consensus::basic::BasicError, @@ -128,9 +129,13 @@ where } }; - let new_version = raw_data_contract.get_u64(contract_property_names::VERSION)? as u32; + let new_version = raw_data_contract.get_u32(contract_property_names::VERSION)?; let old_version = existing_data_contract.version; - if (new_version - old_version) != 1 { + if (new_version + .checked_sub(old_version) + .unwrap_or(ProtocolVersion::MAX)) + != 1 + { validation_result.add_error(BasicError::InvalidDataContractVersionError( InvalidDataContractVersionError::new(old_version + 1, new_version), )) diff --git a/packages/rs-dpp/src/document/document_factory.rs b/packages/rs-dpp/src/document/document_factory.rs index 6ff48f4dec2..a12ff934d54 100644 --- a/packages/rs-dpp/src/document/document_factory.rs +++ b/packages/rs-dpp/src/document/document_factory.rs @@ -8,7 +8,7 @@ use crate::consensus::basic::document::InvalidDocumentTypeError; use crate::{ data_contract::{errors::DataContractError, DataContract}, decode_protocol_entity_factory::DecodeProtocolEntity, - prelude::Identifier, + prelude::{Identifier, ProtocolVersion}, state_repository::StateRepositoryLike, util::entropy_generator, util::{json_schema::JsonSchemaExt, json_value::JsonValueExt}, @@ -58,7 +58,7 @@ const DOCUMENT_REPLACE_KEYS_TO_STAY: [&str; 5] = [ /// Factory for creating documents pub struct DocumentFactory { - protocol_version: u32, + protocol_version: ProtocolVersion, document_validator: DocumentValidator, data_contract_fetcher_and_validator: DataContractFetcherAndValidator, } @@ -77,7 +77,7 @@ where ST: StateRepositoryLike, { pub fn new( - protocol_version: u32, + protocol_version: ProtocolVersion, validate_document: DocumentValidator, data_contract_fetcher_and_validator: DataContractFetcherAndValidator, ) -> Self { @@ -333,7 +333,9 @@ where PROPERTY_ACTION.to_string(), serde_json::to_value(Action::Replace)?, ); - let new_revision = document_revision + 1; + let new_revision = document_revision + .checked_add(1) + .ok_or(ProtocolError::Overflow("max revision reached"))?; map.insert(PROPERTY_REVISION.to_string(), json!(new_revision)); // If document have an originally set `updatedAt` diff --git a/packages/rs-dpp/src/document/document_validator.rs b/packages/rs-dpp/src/document/document_validator.rs index 68bf2340b0e..39e49e527b1 100644 --- a/packages/rs-dpp/src/document/document_validator.rs +++ b/packages/rs-dpp/src/document/document_validator.rs @@ -91,7 +91,7 @@ impl DocumentValidator { return Ok(result); } - let protocol_version = raw_document.get_u64(PROPERTY_PROTOCOL_VERSION)? as u32; + let protocol_version = raw_document.get_u32(PROPERTY_PROTOCOL_VERSION)?; result.merge(self.protocol_version_validator.validate(protocol_version)?); Ok(result) diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index 0fb16e6aef9..9cfa6bc8015 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -14,6 +14,9 @@ use crate::data_contract::DataContract; use crate::errors::ProtocolError; use crate::identifier::Identifier; use crate::metadata::Metadata; +use crate::prelude::ProtocolVersion; +use crate::prelude::Revision; +use crate::prelude::TimestampMillis; use crate::util::cbor_value::CborCanonicalMap; use crate::util::cbor_value::FieldType; use crate::util::deserializer::SplitProtocolVersionOutcome; @@ -52,23 +55,22 @@ pub const IDENTIFIER_FIELDS: [&str; 3] = [ #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct Document { #[serde(rename = "$protocolVersion")] - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "$id")] pub id: Identifier, #[serde(rename = "$type")] /// TODO: Why not &str? pub document_type: String, #[serde(rename = "$revision")] - pub revision: u32, + pub revision: Revision, #[serde(rename = "$dataContractId")] pub data_contract_id: Identifier, #[serde(rename = "$ownerId")] pub owner_id: Identifier, #[serde(rename = "$createdAt", skip_serializing_if = "Option::is_none")] - // TODO: Must be TimestampMillis - pub created_at: Option, + pub created_at: Option, #[serde(rename = "$updatedAt", skip_serializing_if = "Option::is_none")] - pub updated_at: Option, + pub updated_at: Option, // the serde_json::Value preserves the order (see .toml file) #[serde(flatten)] pub data: JsonValue, diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs index 4d61b571d7a..476ecbb9f8a 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/apply_documents_batch_transition_factory.rs @@ -4,7 +4,7 @@ use serde_json::Value; use crate::{ document::{errors::DocumentError, Document}, - prelude::Identifier, + prelude::{Identifier, TimestampMillis}, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, ProtocolError, @@ -141,7 +141,7 @@ fn document_from_transition_create( fn document_from_transition_replace( document_replace_transition: &DocumentReplaceTransition, state_transition: &DocumentsBatchTransition, - created_at: u64, + created_at: TimestampMillis, ) -> Document { // TODO cloning is costly. Probably the [`Document`] should have properties of type `Cov<'a, K>` Document { @@ -157,7 +157,7 @@ fn document_from_transition_replace( .clone(), updated_at: document_replace_transition.updated_at, revision: document_replace_transition.revision, - created_at: Some(created_at as i64), + created_at: Some(created_at), metadata: None, //? In the JS implementation the `data_contract` and `entropy` properties are completely omitted, what suggest we should make diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_create_transition.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_create_transition.rs index f09baaadcf0..c9327890e42 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_create_transition.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_create_transition.rs @@ -2,6 +2,7 @@ use itertools::Itertools; use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; +use crate::prelude::{Revision, TimestampMillis}; use crate::{ data_contract::DataContract, document::document_transition::Action, errors::ProtocolError, util::json_value::JsonValueExt, util::json_value::ReplaceWith, @@ -30,16 +31,16 @@ pub struct DocumentCreateTransition { pub entropy: [u8; 32], #[serde(rename = "$createdAt", skip_serializing_if = "Option::is_none")] - pub created_at: Option, + pub created_at: Option, #[serde(rename = "$updatedAt", skip_serializing_if = "Option::is_none")] - pub updated_at: Option, + pub updated_at: Option, #[serde(flatten, skip_serializing_if = "Option::is_none")] pub data: Option, } impl DocumentCreateTransition { - pub fn get_revision(&self) -> u32 { + pub fn get_revision(&self) -> Revision { INITIAL_REVISION } diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_replace_transition.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_replace_transition.rs index 834305c649f..4eef057aaf0 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_replace_transition.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/document_replace_transition.rs @@ -4,6 +4,7 @@ use serde_json::Value as JsonValue; use crate::{ data_contract::DataContract, errors::ProtocolError, + prelude::{Revision, TimestampMillis}, util::json_value::{JsonValueExt, ReplaceWith}, }; @@ -21,15 +22,15 @@ pub struct DocumentReplaceTransition { #[serde(flatten)] pub base: DocumentBaseTransition, #[serde(rename = "$revision")] - pub revision: u32, + pub revision: Revision, #[serde(skip_serializing_if = "Option::is_none", rename = "$updatedAt")] - pub updated_at: Option, + pub updated_at: Option, #[serde(flatten, skip_serializing_if = "Option::is_none")] pub data: Option, } impl DocumentReplaceTransition { - pub fn get_revision(&self) -> u32 { + pub fn get_revision(&self) -> Revision { self.revision } } diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs index c1cfec6b789..dca548457be 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/document_transition/mod.rs @@ -5,7 +5,10 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use crate::{ - data_contract::DataContract, prelude::Identifier, util::json_value::JsonValueExt, ProtocolError, + data_contract::DataContract, + prelude::{Identifier, Revision, TimestampMillis}, + util::json_value::JsonValueExt, + ProtocolError, }; use document_base_transition::DocumentBaseTransition; @@ -20,18 +23,18 @@ pub use document_delete_transition::DocumentDeleteTransition; pub use document_replace_transition::DocumentReplaceTransition; /// the initial revision of newly created document -pub const INITIAL_REVISION: u32 = 1; +pub const INITIAL_REVISION: Revision = 1; pub const PROPERTY_ACTION: &str = "$action"; pub trait DocumentTransitionExt { /// returns the creation timestamp (in milliseconds) if it exists for given type of document transition - fn get_created_at(&self) -> Option; + fn get_created_at(&self) -> Option; /// returns the update timestamp (in milliseconds) if it exists for given type of document transition - fn get_updated_at(&self) -> Option; + fn get_updated_at(&self) -> Option; /// set the created_at (in milliseconds) if it exists - fn set_created_at(&mut self, timestamp_millis: Option); + fn set_created_at(&mut self, timestamp_millis: Option); /// set the updated_at (in milliseconds) if it exists - fn set_updated_at(&mut self, timestamp_millis: Option); + fn set_updated_at(&mut self, timestamp_millis: Option); /// returns the value of dynamic property. The dynamic property is a property that is not specified in protocol /// the `path` supports dot-syntax: i.e: property.internal_property fn get_dynamic_property(&self, path: &str) -> Option<&Value>; @@ -48,7 +51,7 @@ pub trait DocumentTransitionExt { /// get the data of the transition if exits fn get_data(&self) -> Option<&Value>; /// get the revision of transition if exits - fn get_revision(&self) -> Option; + fn get_revision(&self) -> Option; #[cfg(test)] /// Inserts the dynamic property into the document fn insert_dynamic_property(&mut self, property_name: String, value: Value); @@ -204,7 +207,7 @@ impl DocumentTransitionExt for DocumentTransition { &self.base().data_contract_id } - fn get_updated_at(&self) -> Option { + fn get_updated_at(&self) -> Option { match self { DocumentTransition::Create(t) => t.updated_at, DocumentTransition::Replace(t) => t.updated_at, @@ -212,7 +215,7 @@ impl DocumentTransitionExt for DocumentTransition { } } - fn set_updated_at(&mut self, timestamp_millis: Option) { + fn set_updated_at(&mut self, timestamp_millis: Option) { match self { DocumentTransition::Create(ref mut t) => t.updated_at = timestamp_millis, DocumentTransition::Replace(ref mut t) => t.updated_at = timestamp_millis, @@ -220,7 +223,7 @@ impl DocumentTransitionExt for DocumentTransition { } } - fn get_created_at(&self) -> Option { + fn get_created_at(&self) -> Option { match self { DocumentTransition::Create(t) => t.created_at, DocumentTransition::Replace(_) => None, @@ -228,7 +231,7 @@ impl DocumentTransitionExt for DocumentTransition { } } - fn set_created_at(&mut self, timestamp_millis: Option) { + fn set_created_at(&mut self, timestamp_millis: Option) { match self { DocumentTransition::Create(ref mut t) => t.created_at = timestamp_millis, DocumentTransition::Replace(_) => {} @@ -264,7 +267,7 @@ impl DocumentTransitionExt for DocumentTransition { } } - fn get_revision(&self) -> Option { + fn get_revision(&self) -> Option { match self { DocumentTransition::Create(t) => Some(t.get_revision()), DocumentTransition::Replace(t) => Some(t.get_revision()), diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs index 0656b64672f..cfa726b770b 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/mod.rs @@ -9,7 +9,7 @@ use serde_json::Value as JsonValue; use crate::data_contract::DataContract; use crate::document::document_transition::DocumentTransitionObjectLike; -use crate::prelude::{DocumentTransition, Identifier}; +use crate::prelude::{DocumentTransition, Identifier, ProtocolVersion}; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use crate::util::cbor_value::{CborCanonicalMap, FieldType, ReplacePaths, ValuesCollection}; use crate::util::json_value::{JsonValueExt, ReplaceWith}; @@ -48,7 +48,7 @@ const EMPTY_VEC: Vec = vec![]; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct DocumentsBatchTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "type")] pub transition_type: StateTransitionType, pub owner_id: Identifier, @@ -96,9 +96,9 @@ impl DocumentsBatchTransition { let mut batch_transitions = DocumentsBatchTransition { protocol_version: json_value - .get_u64(property_names::PROTOCOL_VERSION) + .get_u32(property_names::PROTOCOL_VERSION) // js-dpp allows `protocolVersion` to be undefined - .unwrap_or(LATEST_VERSION as u64) as u32, + .unwrap_or(LATEST_VERSION), signature, signature_public_key_id: json_value .get_u64(property_names::SIGNATURE_PUBLIC_KEY_ID) @@ -150,9 +150,9 @@ impl DocumentsBatchTransition { ) -> Result { let mut batch_transitions = DocumentsBatchTransition { protocol_version: raw_object - .get_u64(property_names::PROTOCOL_VERSION) + .get_u32(property_names::PROTOCOL_VERSION) // js-dpp allows `protocolVersion` to be undefined - .unwrap_or(LATEST_VERSION as u64) as u32, + .unwrap_or(LATEST_VERSION), signature: raw_object.get_bytes(property_names::SIGNATURE).ok(), signature_public_key_id: raw_object .get_u64(property_names::SIGNATURE_PUBLIC_KEY_ID) @@ -368,7 +368,7 @@ impl StateTransitionConvert for DocumentsBatchTransition { } impl StateTransitionLike for DocumentsBatchTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs index dc9a9946428..89cb2df39bb 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs @@ -81,7 +81,7 @@ pub async fn validate_documents_batch_transition_basic( return Ok(result); } - let protocol_version = raw_state_transition.get_u64("protocolVersion")? as u32; + let protocol_version = raw_state_transition.get_u32("protocolVersion")?; let validation_result = protocol_version_validator.validate(protocol_version)?; result.merge(validation_result); if !result.is_valid() { diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs index 111c1348f55..1f0e2f5b8bd 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/state/validate_documents_batch_transition_state.rs @@ -242,12 +242,13 @@ fn check_revision( Some(d) => d.revision, None => return result, }; - let expected_revision = fetched_document.revision + 1; + // TODO should overflow? + let expected_revision = fetched_document.revision.saturating_add(1); if revision != expected_revision { result.add_error(ConsensusError::StateError(Box::new( StateError::InvalidDocumentRevisionError { document_id: document_transition.base().id.clone(), - current_revision: fetched_document.revision as Revision, + current_revision: fetched_document.revision, }, ))) } @@ -316,17 +317,17 @@ fn check_created_inside_time_window( let created_at = match document_transition.get_created_at() { Some(t) => t, None => return result, - } as u64; + }; let window_validation = validate_time_in_block_time_window(last_block_ts_millis, created_at); if !window_validation.is_valid() { result.add_error(ConsensusError::StateError(Box::new( StateError::DocumentTimestampWindowViolationError { timestamp_name: String::from("createdAt"), - document_id: document_transition.base().id.clone(), - timestamp: created_at as i64, - time_window_start: window_validation.time_window_start as i64, - time_window_end: window_validation.time_window_end as i64, + document_id: document_transition.base().id, + timestamp: created_at, + time_window_start: window_validation.time_window_start, + time_window_end: window_validation.time_window_end, }, ))); } @@ -341,7 +342,7 @@ fn check_updated_inside_time_window( let updated_at = match document_transition.get_updated_at() { Some(t) => t, None => return result, - } as u64; + }; let window_validation = validate_time_in_block_time_window(last_block_ts_millis, updated_at); if !window_validation.is_valid() { @@ -349,9 +350,9 @@ fn check_updated_inside_time_window( StateError::DocumentTimestampWindowViolationError { timestamp_name: String::from("updatedAt"), document_id: document_transition.base().id.clone(), - timestamp: updated_at as i64, - time_window_start: window_validation.time_window_start as i64, - time_window_end: window_validation.time_window_end as i64, + timestamp: updated_at, + time_window_start: window_validation.time_window_start, + time_window_end: window_validation.time_window_end, }, ))); } diff --git a/packages/rs-dpp/src/errors/abstract_state_error.rs b/packages/rs-dpp/src/errors/abstract_state_error.rs index 1754aca942a..cb2eca22b71 100644 --- a/packages/rs-dpp/src/errors/abstract_state_error.rs +++ b/packages/rs-dpp/src/errors/abstract_state_error.rs @@ -1,6 +1,6 @@ use thiserror::Error; -use crate::prelude::Revision; +use crate::prelude::{Revision, TimestampMillis}; use crate::{identity::KeyID, prelude::Identifier}; use super::DataTriggerError; @@ -28,9 +28,9 @@ pub enum StateError { DocumentTimestampWindowViolationError { timestamp_name: String, document_id: Identifier, - timestamp: i64, - time_window_start: i64, - time_window_end: i64, + timestamp: TimestampMillis, + time_window_start: TimestampMillis, + time_window_end: TimestampMillis, }, #[error("Document {document_id} has duplicate unique properties {duplicating_properties:?} with other documents")] @@ -71,9 +71,9 @@ pub enum StateError { #[error("Identity public keys disabled time ({disabled_at}) is out of block time window from {time_window_start} and {time_window_end}" )] IdentityPublicKeyDisabledAtWindowViolationError { - disabled_at: u64, - time_window_start: u64, - time_window_end: u64, + disabled_at: TimestampMillis, + time_window_start: TimestampMillis, + time_window_end: TimestampMillis, }, #[error("Identity Public Key #{public_key_index} is read only")] diff --git a/packages/rs-dpp/src/errors/compatible_protocol_version_is_not_defined_error.rs b/packages/rs-dpp/src/errors/compatible_protocol_version_is_not_defined_error.rs index 8bd39c19c78..a1518decc7d 100644 --- a/packages/rs-dpp/src/errors/compatible_protocol_version_is_not_defined_error.rs +++ b/packages/rs-dpp/src/errors/compatible_protocol_version_is_not_defined_error.rs @@ -1,13 +1,15 @@ use thiserror::Error; +use crate::prelude::ProtocolVersion; + #[derive(Error, Debug, Clone, PartialEq, Eq)] #[error("Compatible version is not defined for protocol version {current_protocol_version}")] pub struct CompatibleProtocolVersionIsNotDefinedError { - current_protocol_version: u32, + current_protocol_version: ProtocolVersion, } impl CompatibleProtocolVersionIsNotDefinedError { - pub fn new(current_protocol_version: u32) -> Self { + pub fn new(current_protocol_version: ProtocolVersion) -> Self { Self { current_protocol_version, } diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_credit_withdrawal_transition_core_fee_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_credit_withdrawal_transition_core_fee_error.rs index 2255397688d..8d9030ebf9a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_credit_withdrawal_transition_core_fee_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_credit_withdrawal_transition_core_fee_error.rs @@ -1,19 +1,19 @@ use thiserror::Error; -use crate::consensus::ConsensusError; +use crate::{consensus::ConsensusError, prelude::Fee}; #[derive(Error, Debug, Clone, PartialEq, Eq)] #[error("Core fee per byte {core_fee_per_byte:?} must be part of fibonacci sequence")] pub struct InvalidIdentityCreditWithdrawalTransitionCoreFeeError { - core_fee_per_byte: u32, + core_fee_per_byte: Fee, } impl InvalidIdentityCreditWithdrawalTransitionCoreFeeError { - pub fn new(core_fee_per_byte: u32) -> Self { + pub fn new(core_fee_per_byte: Fee) -> Self { Self { core_fee_per_byte } } - pub fn core_fee_per_byte(&self) -> u32 { + pub fn core_fee_per_byte(&self) -> Fee { self.core_fee_per_byte } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs b/packages/rs-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs index 80184b07adf..3afff0dff67 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs @@ -1,25 +1,30 @@ use thiserror::Error; +use crate::prelude::ProtocolVersion; + #[derive(Error, Debug, Clone, PartialEq, Eq)] #[error("Protocol version {parsed_protocol_version:?} is not supported. Minimal supported protocol version is {minimal_protocol_version:?}")] pub struct IncompatibleProtocolVersionError { - parsed_protocol_version: u32, - minimal_protocol_version: u32, + parsed_protocol_version: ProtocolVersion, + minimal_protocol_version: ProtocolVersion, } impl IncompatibleProtocolVersionError { - pub fn new(parsed_protocol_version: u32, minimal_protocol_version: u32) -> Self { + pub fn new( + parsed_protocol_version: ProtocolVersion, + minimal_protocol_version: ProtocolVersion, + ) -> Self { Self { parsed_protocol_version, minimal_protocol_version, } } - pub fn parsed_protocol_version(&self) -> u32 { + pub fn parsed_protocol_version(&self) -> ProtocolVersion { self.parsed_protocol_version } - pub fn minimal_protocol_version(&self) -> u32 { + pub fn minimal_protocol_version(&self) -> ProtocolVersion { self.minimal_protocol_version } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/invalid_data_contract_version_error.rs b/packages/rs-dpp/src/errors/consensus/basic/invalid_data_contract_version_error.rs index 427a480eeec..49b7389335c 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/invalid_data_contract_version_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/invalid_data_contract_version_error.rs @@ -1,26 +1,26 @@ -use crate::consensus::basic::BasicError; +use crate::{consensus::basic::BasicError, prelude::DataContractVersion}; use thiserror::Error; #[derive(Error, Debug, Clone, PartialEq, Eq)] #[error("Data Contract version must be {expected_version}, go {version}")] pub struct InvalidDataContractVersionError { - expected_version: u32, - version: u32, + expected_version: DataContractVersion, + version: DataContractVersion, } impl InvalidDataContractVersionError { - pub fn new(expected_version: u32, version: u32) -> Self { + pub fn new(expected_version: DataContractVersion, version: DataContractVersion) -> Self { Self { expected_version, version, } } - pub fn expected_version(&self) -> u32 { + pub fn expected_version(&self) -> DataContractVersion { self.expected_version } - pub fn version(&self) -> u32 { + pub fn version(&self) -> DataContractVersion { self.version } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs b/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs index af7159e9898..31e33c326d8 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs @@ -1,25 +1,27 @@ use thiserror::Error; +use crate::prelude::ProtocolVersion; + #[derive(Error, Debug, Clone, PartialEq, Eq)] #[error("Protocol version {parsed_protocol_version:?} is not supported. Latest supported version is {latest_version:?}")] pub struct UnsupportedProtocolVersionError { - parsed_protocol_version: u32, - latest_version: u32, + parsed_protocol_version: ProtocolVersion, + latest_version: ProtocolVersion, } impl UnsupportedProtocolVersionError { - pub fn new(parsed_protocol_version: u32, latest_version: u32) -> Self { + pub fn new(parsed_protocol_version: ProtocolVersion, latest_version: ProtocolVersion) -> Self { Self { parsed_protocol_version, latest_version, } } - pub fn parsed_protocol_version(&self) -> u32 { + pub fn parsed_protocol_version(&self) -> ProtocolVersion { self.parsed_protocol_version } - pub fn latest_version(&self) -> u32 { + pub fn latest_version(&self) -> ProtocolVersion { self.latest_version } } diff --git a/packages/rs-dpp/src/errors/consensus/fee.rs b/packages/rs-dpp/src/errors/consensus/fee.rs index 8ac40f0e920..19267a01e80 100644 --- a/packages/rs-dpp/src/errors/consensus/fee.rs +++ b/packages/rs-dpp/src/errors/consensus/fee.rs @@ -1,7 +1,9 @@ use thiserror::Error; +use crate::prelude::{Balance, Fee}; + #[derive(Error, Debug)] pub enum FeeError { #[error("Current credits balance {balance} is not enough to pay {fee} fee")] - BalanceIsNotEnoughError { balance: u64, fee: i64 }, + BalanceIsNotEnoughError { balance: Balance, fee: Fee }, } diff --git a/packages/rs-dpp/src/identity/factory.rs b/packages/rs-dpp/src/identity/factory.rs index f55ed5ba588..5cc8a4fd4a4 100644 --- a/packages/rs-dpp/src/identity/factory.rs +++ b/packages/rs-dpp/src/identity/factory.rs @@ -9,8 +9,9 @@ use crate::identity::state_transition::identity_public_key_transitions::Identity use crate::identity::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::identity::state_transition::identity_update_transition::identity_update_transition::IdentityUpdateTransition; use crate::identity::validation::{IdentityValidator, PublicKeysValidator}; -use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; +use crate::identity::{Identity, IdentityPublicKey, KeyID}; +use crate::prelude::{ProtocolVersion, TimestampMillis}; use crate::{BlsModule, ProtocolError}; use anyhow::anyhow; use dashcore::{InstantLock, Transaction}; @@ -81,7 +82,7 @@ impl Identity { #[derive(Clone)] pub struct IdentityFactory { - protocol_version: u32, + protocol_version: ProtocolVersion, identity_validator: Arc>>, } @@ -90,7 +91,7 @@ where T: BlsModule, { pub fn new( - protocol_version: u32, + protocol_version: ProtocolVersion, identity_validator: Arc>>, ) -> Self { IdentityFactory { diff --git a/packages/rs-dpp/src/identity/identity.rs b/packages/rs-dpp/src/identity/identity.rs index 8bc3c0b9c87..80e8d30d94e 100644 --- a/packages/rs-dpp/src/identity/identity.rs +++ b/packages/rs-dpp/src/identity/identity.rs @@ -7,7 +7,7 @@ use serde_json::{Value as JsonValue, Value}; use crate::identity::identity_public_key; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; -use crate::prelude::Revision; +use crate::prelude::{ProtocolVersion, Revision}; use crate::util::cbor_value::{CborBTreeMapHelper, CborCanonicalMap}; use crate::util::deserializer; use crate::util::deserializer::SplitProtocolVersionOutcome; @@ -33,7 +33,7 @@ pub const IDENTIFIER_FIELDS_RAW_OBJECT: [&str; 1] = [property_names::ID_RAW_OBJE #[derive(Default, Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] #[serde(rename_all = "camelCase")] pub struct Identity { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub id: Identifier, #[serde(with = "public_key_serialization")] pub public_keys: BTreeMap, @@ -88,7 +88,7 @@ mod public_key_serialization { impl Identity { /// Get Identity protocol version - pub fn get_protocol_version(&self) -> u32 { + pub fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 4dc9b92bf44..f123763d56d 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -12,8 +12,9 @@ use crate::identity::state_transition::identity_public_key_transitions::Identity use crate::identity::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::identity::state_transition::identity_update_transition::identity_update_transition::IdentityUpdateTransition; use crate::identity::validation::{IdentityValidator, PublicKeysValidator}; -use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; +use crate::identity::{Identity, IdentityPublicKey, KeyID}; +use crate::prelude::{ProtocolVersion, TimestampMillis}; use crate::validation::ValidationResult; use crate::version::ProtocolVersionValidator; use crate::{BlsModule, DashPlatformProtocolInitError, NonConsensusError, ProtocolError}; @@ -29,7 +30,7 @@ where T: BlsModule, { pub fn new( - protocol_version: u32, + protocol_version: ProtocolVersion, protocol_version_validator: Arc, public_keys_validator: Arc>, ) -> Result { diff --git a/packages/rs-dpp/src/identity/identity_public_key/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/mod.rs index a0215e6ed2b..e44ab770b6b 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/mod.rs @@ -18,6 +18,7 @@ use crate::errors::{InvalidVectorSizeError, ProtocolError}; pub use crate::identity::key_type::KeyType; pub use crate::identity::purpose::Purpose; pub use crate::identity::security_level::SecurityLevel; +use crate::prelude::TimestampMillis; use crate::util::cbor_value::{CborCanonicalMap, CborMapExtension}; use crate::util::hash::ripemd160_sha256; use crate::util::json_value::{JsonValueExt, ReplaceWith}; @@ -27,7 +28,6 @@ use crate::SerdeParsingError; use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransition; pub type KeyID = u32; -pub type TimestampMillis = u64; pub const BINARY_DATA_FIELDS: [&str; 1] = ["data"]; @@ -61,7 +61,7 @@ impl Into for &IdentityPublicKey { impl IdentityPublicKey { /// Set disabledAt - pub fn set_disabled_at(&mut self, timestamp_millis: u64) { + pub fn set_disabled_at(&mut self, timestamp_millis: TimestampMillis) { self.disabled_at = Some(timestamp_millis); } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 236e5d7a23a..792a3a66aae 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -7,7 +7,7 @@ use serde_json::Value as JsonValue; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransition; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, ProtocolVersion}; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use crate::state_transition::{ StateTransition, StateTransitionConvert, StateTransitionLike, StateTransitionType, @@ -38,7 +38,7 @@ pub struct IdentityCreateTransition { pub asset_lock_proof: AssetLockProof, pub identity_id: Identifier, // Generic identity ST fields - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub transition_type: StateTransitionType, pub signature: Vec, pub execution_context: StateTransitionExecutionContext, @@ -242,7 +242,7 @@ impl IdentityCreateTransition { vec![self.get_identity_id()] } - pub fn set_protocol_version(&mut self, protocol_version: u32) { + pub fn set_protocol_version(&mut self, protocol_version: ProtocolVersion) { self.protocol_version = protocol_version; } } @@ -321,7 +321,7 @@ impl StateTransitionConvert for IdentityCreateTransition { } impl StateTransitionLike for IdentityCreateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } /// returns the type of State Transition diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs index 00ee2b59354..fbc0c27a78f 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs @@ -8,8 +8,8 @@ use serde_json::json; use crate::{ contracts::withdrawals_contract, data_contract::DataContract, document::generate_document_id, document::Document, identity::state_transition::identity_credit_withdrawal_transition::Pooling, - state_repository::StateRepositoryLike, state_transition::StateTransitionLike, - util::entropy_generator::generate, + prelude::TimestampMillis, state_repository::StateRepositoryLike, + state_transition::StateTransitionLike, util::entropy_generator::generate, }; use super::IdentityCreditWithdrawalTransition; @@ -58,7 +58,8 @@ where consensus::deserialize(&latest_platform_block_header_bytes)?; let document_type = String::from(withdrawals_contract::document_types::WITHDRAWAL); - let document_created_at_millis: i64 = latest_platform_block_header.time as i64 * 1000i64; + let document_created_at_millis = + latest_platform_block_header.time as TimestampMillis * 1000; let document_data = json!({ withdrawals_contract::property_names::AMOUNT: state_transition.amount, diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs index 04972f7f0b8..faa634ccb6c 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; use serde_repr::{Deserialize_repr, Serialize_repr}; +use crate::prelude::{Fee, ProtocolVersion}; use crate::version::LATEST_VERSION; use crate::{ identity::{core_script::CoreScript, KeyID}, @@ -44,12 +45,12 @@ impl std::default::Default for Pooling { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IdentityCreditWithdrawalTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "type")] pub transition_type: StateTransitionType, pub identity_id: Identifier, pub amount: u64, - pub core_fee_per_byte: u32, + pub core_fee_per_byte: Fee, pub pooling: Pooling, pub output_script: CoreScript, pub revision: Revision, @@ -141,7 +142,7 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransition { } impl StateTransitionLike for IdentityCreditWithdrawalTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs index 34ccf4c9525..94f6039e520 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/basic/validate_identity_credit_withdrawal_transition_basic.rs @@ -89,9 +89,9 @@ impl IdentityCreditWithdrawalTransitionBasicValidator { // validate core_fee is in fibonacci sequence let core_fee_per_byte = - transition_json.get_u32(withdrawals_contract::property_names::CORE_FEE_PER_BYTE)?; + transition_json.get_i64(withdrawals_contract::property_names::CORE_FEE_PER_BYTE)?; - if !is_fibonacci_number(core_fee_per_byte) { + if !is_fibonacci_number(core_fee_per_byte as u32) { result.add_error(InvalidIdentityCreditWithdrawalTransitionCoreFeeError::new( core_fee_per_byte, )); diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index 4e5be8f1d87..f607000395b 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -7,7 +7,7 @@ use serde_json::Value as JsonValue; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; use crate::identity::state_transition::identity_create_transition::SerializationOptions; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, ProtocolVersion}; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use crate::state_transition::{ StateTransition, StateTransitionConvert, StateTransitionLike, StateTransitionType, @@ -31,7 +31,7 @@ pub struct IdentityTopUpTransition { pub asset_lock_proof: AssetLockProof, pub identity_id: Identifier, // Generic identity ST fields - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub transition_type: StateTransitionType, pub signature: Vec, pub execution_context: StateTransitionExecutionContext, @@ -90,8 +90,8 @@ impl IdentityTopUpTransition { raw_object: JsonValue, ) -> Result { let protocol_version = raw_object - .get_u64(property_names::PROTOCOL_VERSION) - .unwrap_or(LATEST_VERSION as u64) as u32; + .get_u32(property_names::PROTOCOL_VERSION) + .unwrap_or(LATEST_VERSION); let signature = raw_object .get_bytes(property_names::SIGNATURE) .unwrap_or_default(); @@ -194,7 +194,7 @@ impl IdentityTopUpTransition { Ok(json_map) } - pub fn set_protocol_version(&mut self, protocol_version: u32) { + pub fn set_protocol_version(&mut self, protocol_version: ProtocolVersion) { self.protocol_version = protocol_version; } @@ -252,7 +252,7 @@ impl StateTransitionConvert for IdentityTopUpTransition { } impl StateTransitionLike for IdentityTopUpTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } /// returns the type of State Transition diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index c04b570807b..dbefac48eaf 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransition; +use crate::prelude::ProtocolVersion; use crate::{ identity::{KeyID, SecurityLevel}, prelude::{Identifier, Revision, TimestampMillis}, @@ -31,7 +32,7 @@ pub mod property_names { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct IdentityUpdateTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, #[serde(rename = "type")] pub transition_type: StateTransitionType, @@ -183,7 +184,7 @@ impl IdentityUpdateTransition { vec![self.get_identity_id()] } - pub fn set_protocol_version(&mut self, protocol_version: u32) { + pub fn set_protocol_version(&mut self, protocol_version: ProtocolVersion) { self.protocol_version = protocol_version; } } @@ -295,7 +296,7 @@ impl StateTransitionConvert for IdentityUpdateTransition { } impl StateTransitionLike for IdentityUpdateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs index c078da110b0..26146940ca6 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs @@ -1,9 +1,10 @@ -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use serde_json::Value; use std::convert::TryInto; use std::sync::Arc; use crate::consensus::signature::{IdentityNotFoundError, SignatureError}; +use crate::ProtocolError; use crate::{ block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window, identity::validation::{RequiredPurposeAndSecurityLevelValidator, TPublicKeysValidator}, @@ -66,9 +67,13 @@ where // copy identity let mut identity = stored_identity.clone(); + let previous_revision = state_transition + .get_revision() + .checked_sub(1) + .context("the previous revision of transition cannot be negative")?; // Check revision - if identity.get_revision() != (state_transition.get_revision() - 1) { + if identity.get_revision() != previous_revision { validation_result.add_error(StateError::InvalidIdentityRevisionError { identity_id: state_transition.get_identity_id().to_owned(), current_revision: identity.get_revision(), diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index f48f551c993..e1e792c2192 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -57,8 +57,14 @@ pub mod prelude { pub use crate::validation::ValidationResult; pub use super::convertible::Convertible; + + pub type ProtocolVersion = u32; pub type TimestampMillis = u64; pub type Revision = u64; + pub type DataContractVersion = u32; + + pub type Balance = u64; + pub type Fee = i64; } pub use jsonschema; diff --git a/packages/rs-dpp/src/metadata.rs b/packages/rs-dpp/src/metadata.rs index 2881ee490cf..9306d5d0564 100644 --- a/packages/rs-dpp/src/metadata.rs +++ b/packages/rs-dpp/src/metadata.rs @@ -1,6 +1,9 @@ use serde::{Deserialize, Serialize}; -use crate::{errors::ProtocolError, prelude::TimestampMillis, util::deserializer::ProtocolVersion}; +use crate::{ + errors::ProtocolError, + prelude::{ProtocolVersion, TimestampMillis}, +}; #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, PartialOrd, Eq)] #[serde(rename_all = "camelCase")] diff --git a/packages/rs-dpp/src/mocks.rs b/packages/rs-dpp/src/mocks.rs index 26cd400fa73..d548b43f434 100644 --- a/packages/rs-dpp/src/mocks.rs +++ b/packages/rs-dpp/src/mocks.rs @@ -3,6 +3,8 @@ use anyhow::Result as AnyResult; use serde::{Deserialize, Serialize}; +use crate::prelude::ProtocolVersion; + #[derive(Debug, Clone)] pub struct DashPlatformProtocol { pub state_repository: SR, @@ -12,7 +14,7 @@ impl DashPlatformProtocol { DashPlatformProtocol { state_repository } } - pub fn get_protocol_version(&self) -> u32 { + pub fn get_protocol_version(&self) -> ProtocolVersion { 1 } diff --git a/packages/rs-dpp/src/state_transition/abstract_state_transition.rs b/packages/rs-dpp/src/state_transition/abstract_state_transition.rs index 9fdc182c0db..d1d06667b8b 100644 --- a/packages/rs-dpp/src/state_transition/abstract_state_transition.rs +++ b/packages/rs-dpp/src/state_transition/abstract_state_transition.rs @@ -9,7 +9,7 @@ use crate::state_transition::errors::{ }; use crate::{ identity::KeyType, - prelude::ProtocolError, + prelude::{ProtocolError, ProtocolVersion}, util::{ hash, json_value::{JsonValueExt, ReplaceWith}, @@ -47,7 +47,7 @@ pub trait StateTransitionLike: StateTransitionConvert + Clone + Debug + Into { /// returns the protocol version - fn get_protocol_version(&self) -> u32; + fn get_protocol_version(&self) -> ProtocolVersion; /// returns the type of State Transition fn get_type(&self) -> StateTransitionType; /// returns the signature as a byte-array diff --git a/packages/rs-dpp/src/state_transition/abstract_state_transition_identity_signed.rs b/packages/rs-dpp/src/state_transition/abstract_state_transition_identity_signed.rs index 77c85d3a2ab..59aeb2762f6 100644 --- a/packages/rs-dpp/src/state_transition/abstract_state_transition_identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/abstract_state_transition_identity_signed.rs @@ -206,7 +206,7 @@ mod test { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct ExampleStateTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub signature: Vec, pub signature_public_key_id: KeyID, pub transition_type: StateTransitionType, @@ -235,7 +235,7 @@ mod test { } impl StateTransitionLike for ExampleStateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { 1 } fn get_type(&self) -> StateTransitionType { diff --git a/packages/rs-dpp/src/state_transition/example.rs b/packages/rs-dpp/src/state_transition/example.rs index 60f942f2c57..9767ed18521 100644 --- a/packages/rs-dpp/src/state_transition/example.rs +++ b/packages/rs-dpp/src/state_transition/example.rs @@ -1,5 +1,7 @@ use serde::{Deserialize, Serialize}; +use crate::prelude::ProtocolVersion; + use super::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransition, StateTransitionConvert, StateTransitionLike, StateTransitionType, @@ -12,7 +14,7 @@ const PROPERTY_PROTOCOL_VERSION: &str = "protocolVersion"; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct ExampleStateTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub signature: Vec, pub transition_type: StateTransitionType, #[serde(skip)] @@ -26,7 +28,7 @@ impl From for StateTransition { } impl StateTransitionLike for ExampleStateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { self.protocol_version } diff --git a/packages/rs-dpp/src/state_transition/fee/calculate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/fee/calculate_state_transition_fee.rs index 28f34992cd6..3f303b4bc92 100644 --- a/packages/rs-dpp/src/state_transition/fee/calculate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/fee/calculate_state_transition_fee.rs @@ -9,7 +9,10 @@ pub fn calculate_state_transition_fee(state_transition: &impl StateTransitionLik // Is not implemented yet let storage_refund = 0; - (fee.storage + fee.processing) + DEFAULT_USER_TIP - storage_refund + fee.storage + .saturating_add(fee.processing) + .saturating_add(DEFAULT_USER_TIP) + .saturating_sub(storage_refund) } #[cfg(test)] diff --git a/packages/rs-dpp/src/state_transition/fee/constants.rs b/packages/rs-dpp/src/state_transition/fee/constants.rs index 4ee78de7830..efe1ffa7b9c 100644 --- a/packages/rs-dpp/src/state_transition/fee/constants.rs +++ b/packages/rs-dpp/src/state_transition/fee/constants.rs @@ -1,15 +1,15 @@ -use crate::identity::KeyType; +use crate::{identity::KeyType, prelude::Fee}; -pub const BASE_ST_PROCESSING_FEE: i64 = 10000; // 84000 -pub const FEE_MULTIPLIER: i64 = 2; -pub const DEFAULT_USER_TIP: i64 = 0; -pub const STORAGE_CREDIT_PER_BYTE: i64 = 5000; -pub const PROCESSING_CREDIT_PER_BYTE: i64 = 12; -pub const DELETE_BASE_PROCESSING_COST: i64 = 2000; // 20000 -pub const READ_BASE_PROCESSING_COST: i64 = 8400; // 8400 -pub const WRITE_BASE_PROCESSING_COST: i64 = 6000; // 60000 +pub const BASE_ST_PROCESSING_FEE: Fee = 10000; // 84000 +pub const FEE_MULTIPLIER: Fee = 2; +pub const DEFAULT_USER_TIP: Fee = 0; +pub const STORAGE_CREDIT_PER_BYTE: Fee = 5000; +pub const PROCESSING_CREDIT_PER_BYTE: Fee = 12; +pub const DELETE_BASE_PROCESSING_COST: Fee = 2000; // 20000 +pub const READ_BASE_PROCESSING_COST: Fee = 8400; // 8400 +pub const WRITE_BASE_PROCESSING_COST: Fee = 6000; // 60000 -pub const fn signature_verify_cost(key_type: KeyType) -> i64 { +pub const fn signature_verify_cost(key_type: KeyType) -> Fee { match key_type { KeyType::ECDSA_SECP256K1 => 3000, KeyType::BLS12_381 => 6000, diff --git a/packages/rs-dpp/src/state_transition/fee/mod.rs b/packages/rs-dpp/src/state_transition/fee/mod.rs index eac889b595d..ad666ed6b98 100644 --- a/packages/rs-dpp/src/state_transition/fee/mod.rs +++ b/packages/rs-dpp/src/state_transition/fee/mod.rs @@ -1,5 +1,7 @@ use std::borrow::Borrow; +use crate::prelude::Fee; + use self::{ constants::FEE_MULTIPLIER, operations::{Operation, OperationLike}, @@ -11,8 +13,8 @@ pub mod operations; #[derive(Default)] pub struct Fees { - storage: i64, - processing: i64, + storage: Fee, + processing: Fee, } pub fn calculate_operations_fees( diff --git a/packages/rs-dpp/src/state_transition/fee/operations/delete_operation.rs b/packages/rs-dpp/src/state_transition/fee/operations/delete_operation.rs index 214c19dffc5..cc23b845f4b 100644 --- a/packages/rs-dpp/src/state_transition/fee/operations/delete_operation.rs +++ b/packages/rs-dpp/src/state_transition/fee/operations/delete_operation.rs @@ -1,8 +1,11 @@ use serde::{Deserialize, Serialize}; use super::OperationLike; -use crate::state_transition::fee::constants::{ - DELETE_BASE_PROCESSING_COST, PROCESSING_CREDIT_PER_BYTE, STORAGE_CREDIT_PER_BYTE, +use crate::{ + prelude::Fee, + state_transition::fee::constants::{ + DELETE_BASE_PROCESSING_COST, PROCESSING_CREDIT_PER_BYTE, STORAGE_CREDIT_PER_BYTE, + }, }; #[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] @@ -22,12 +25,15 @@ impl DeleteOperation { } impl OperationLike for DeleteOperation { - fn get_processing_cost(&self) -> i64 { - DELETE_BASE_PROCESSING_COST - + ((self.key_size as i64 + self.value_size as i64) * PROCESSING_CREDIT_PER_BYTE) + fn get_processing_cost(&self) -> Fee { + let current_cost = (self.key_size.saturating_add(self.value_size) as Fee) + .saturating_mul(PROCESSING_CREDIT_PER_BYTE); + + DELETE_BASE_PROCESSING_COST.saturating_add(current_cost) } - fn get_storage_cost(&self) -> i64 { - -((self.key_size + self.value_size) as i64 * STORAGE_CREDIT_PER_BYTE) + fn get_storage_cost(&self) -> Fee { + -(self.key_size.saturating_add(self.value_size) as Fee) + .saturating_mul(STORAGE_CREDIT_PER_BYTE) } } diff --git a/packages/rs-dpp/src/state_transition/fee/operations/read_operation.rs b/packages/rs-dpp/src/state_transition/fee/operations/read_operation.rs index 5f54ad1a681..36ff3dcd281 100644 --- a/packages/rs-dpp/src/state_transition/fee/operations/read_operation.rs +++ b/packages/rs-dpp/src/state_transition/fee/operations/read_operation.rs @@ -2,8 +2,9 @@ use serde::{Deserialize, Serialize}; use super::OperationLike; -use crate::state_transition::fee::constants::{ - PROCESSING_CREDIT_PER_BYTE, READ_BASE_PROCESSING_COST, +use crate::{ + prelude::Fee, + state_transition::fee::constants::{PROCESSING_CREDIT_PER_BYTE, READ_BASE_PROCESSING_COST}, }; #[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] @@ -19,11 +20,12 @@ impl ReadOperation { } impl OperationLike for ReadOperation { - fn get_processing_cost(&self) -> i64 { - READ_BASE_PROCESSING_COST + (self.value_size as i64 * PROCESSING_CREDIT_PER_BYTE) + fn get_processing_cost(&self) -> Fee { + READ_BASE_PROCESSING_COST + .saturating_add((self.value_size as Fee).saturating_mul(PROCESSING_CREDIT_PER_BYTE)) } - fn get_storage_cost(&self) -> i64 { + fn get_storage_cost(&self) -> Fee { 0 } } diff --git a/packages/rs-dpp/src/state_transition/fee/operations/write_operation.rs b/packages/rs-dpp/src/state_transition/fee/operations/write_operation.rs index 65b2088e576..960fa006791 100644 --- a/packages/rs-dpp/src/state_transition/fee/operations/write_operation.rs +++ b/packages/rs-dpp/src/state_transition/fee/operations/write_operation.rs @@ -1,8 +1,11 @@ use serde::{Deserialize, Serialize}; use super::OperationLike; -use crate::state_transition::fee::constants::{ - PROCESSING_CREDIT_PER_BYTE, STORAGE_CREDIT_PER_BYTE, WRITE_BASE_PROCESSING_COST, +use crate::{ + prelude::Fee, + state_transition::fee::constants::{ + PROCESSING_CREDIT_PER_BYTE, STORAGE_CREDIT_PER_BYTE, WRITE_BASE_PROCESSING_COST, + }, }; #[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] @@ -24,10 +27,10 @@ impl WriteOperation { impl OperationLike for WriteOperation { fn get_processing_cost(&self) -> i64 { WRITE_BASE_PROCESSING_COST - + ((self.key_size + self.value_size) as i64 * PROCESSING_CREDIT_PER_BYTE) + + ((self.key_size.saturating_add(self.value_size)) as Fee * PROCESSING_CREDIT_PER_BYTE) } - fn get_storage_cost(&self) -> i64 { - (self.key_size + self.value_size) as i64 * STORAGE_CREDIT_PER_BYTE + fn get_storage_cost(&self) -> Fee { + self.key_size.saturating_add(self.value_size) as Fee * STORAGE_CREDIT_PER_BYTE } } diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 2bfecce8310..86044dcb22b 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -15,6 +15,7 @@ use crate::identity::state_transition::identity_create_transition::IdentityCreat use crate::identity::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::identity::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::identity::state_transition::identity_update_transition::identity_update_transition::IdentityUpdateTransition; +use crate::prelude::ProtocolVersion; mod abstract_state_transition; mod abstract_state_transition_identity_signed; @@ -128,7 +129,7 @@ impl StateTransitionConvert for StateTransition { } impl StateTransitionLike for StateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { call_method!(self, get_protocol_version) } /// returns the type of State Transition diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index 1b77b2183cc..dc5a1e89657 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -85,7 +85,7 @@ where if execution_context.is_dry_run() { return Ok(result); } - balance + identity.get_balance() + balance.saturating_add(identity.get_balance()) } StateTransition::DataContractCreate(st) => { let balance = self.get_identity_owner_balance(st).await?; diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs index cb414c28c99..94986c347d2 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs @@ -10,6 +10,7 @@ use crate::consensus::signature::{ use crate::{ consensus::{signature::SignatureError, ConsensusError}, identity::KeyType, + prelude::Identity, state_repository::StateRepositoryLike, state_transition::{ fee::operations::{Operation, SignatureVerificationOperation}, @@ -43,7 +44,7 @@ pub async fn validate_state_transition_identity_signature( let tmp_execution_context = StateTransitionExecutionContext::default(); // Owner must exist - let maybe_identity = state_repository + let maybe_identity: Option = state_repository .fetch_identity(state_transition.get_owner_id(), &tmp_execution_context) .await? .map(TryInto::try_into) @@ -150,7 +151,7 @@ mod test { use crate::{ document::DocumentsBatchTransition, identity::{KeyID, Purpose, SecurityLevel}, - prelude::{Identifier, Identity, IdentityPublicKey}, + prelude::{Identifier, Identity, IdentityPublicKey, ProtocolVersion}, state_repository::MockStateRepositoryLike, state_transition::{ state_transition_execution_context::StateTransitionExecutionContext, StateTransition, @@ -167,7 +168,7 @@ mod test { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct ExampleStateTransition { - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub signature: Vec, pub signature_public_key_id: KeyID, pub transition_type: StateTransitionType, @@ -198,7 +199,7 @@ mod test { } impl StateTransitionLike for ExampleStateTransition { - fn get_protocol_version(&self) -> u32 { + fn get_protocol_version(&self) -> ProtocolVersion { 1 } fn get_type(&self) -> StateTransitionType { diff --git a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs index 762ddeea054..1d2725d3d66 100644 --- a/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/document/state_transitions/validation/validate_documents_batch_transition_state_spec.rs @@ -12,7 +12,7 @@ use crate::{ document_transition::{Action, DocumentTransition, DocumentTransitionObjectLike}, DocumentsBatchTransition, state_transition::documents_batch_transition::validation::state::validate_documents_batch_transition_state::*, }, - prelude::Identifier, + prelude::{Identifier, TimestampMillis}, prelude::ProtocolError, state_repository::MockStateRepositoryLike, StateError, @@ -96,7 +96,7 @@ fn get_state_error(result: &ValidationResult<()>, error_number: usize) -> &State } } -fn set_updated_at(dt: &mut DocumentTransition, ts: Option) { +fn set_updated_at(dt: &mut DocumentTransition, ts: Option) { match dt { DocumentTransition::Create(ref mut t) => t.updated_at = ts, DocumentTransition::Replace(ref mut t) => t.updated_at = ts, @@ -104,7 +104,7 @@ fn set_updated_at(dt: &mut DocumentTransition, ts: Option) { } } -fn set_created_at(dt: &mut DocumentTransition, ts: Option) { +fn set_created_at(dt: &mut DocumentTransition, ts: Option) { match dt { DocumentTransition::Create(ref mut t) => t.created_at = ts, DocumentTransition::Replace(ref mut _t) => {} @@ -346,7 +346,7 @@ async fn should_return_invalid_result_if_timestamps_mismatch() { ) .expect("documents batch state transition should be created"); - let now_ts = Utc::now().timestamp_millis(); + let now_ts = Utc::now().timestamp_millis() as TimestampMillis; state_transition .transitions .iter_mut() @@ -397,8 +397,8 @@ async fn should_return_invalid_result_if_crated_at_has_violated_time_window() { ) .expect("documents batch state transition should be created"); - let now_ts_minus_6_mins = - Utc::now().timestamp_millis() - Duration::from_secs(60 * 6).as_millis() as i64; + let now_ts_minus_6_mins = (Utc::now().timestamp_millis() as u128 + - Duration::from_secs(60 * 6).as_millis()) as TimestampMillis; state_transition .transitions .iter_mut() @@ -450,8 +450,9 @@ async fn should_not_validate_time_in_block_window_on_dry_run() { .expect("documents batch state transition should be created"); state_transition.get_execution_context().enable_dry_run(); - let now_ts_minus_6_mins = - Utc::now().timestamp_millis() - Duration::from_secs(60 * 6).as_millis() as i64; + let now_ts_minus_6_mins = (Utc::now().timestamp_millis() + - Duration::from_secs(60 * 6).as_millis() as i64) + as TimestampMillis; state_transition .transitions .iter_mut() @@ -495,8 +496,8 @@ async fn should_return_invalid_result_if_updated_at_has_violated_time_window() { ) .expect("documents batch state transition should be created"); - let now_ts_minus_6_mins = - Utc::now().timestamp_millis() - Duration::from_secs(60 * 6).as_millis() as i64; + let now_ts_minus_6_mins = (Utc::now().timestamp_millis() as u128 + - Duration::from_secs(60 * 6).as_millis()) as TimestampMillis; state_transition.transitions.iter_mut().for_each(|t| { set_updated_at(t, Some(now_ts_minus_6_mins)); set_created_at(t, None); diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs index f9ff5a10790..100fa4cd1c2 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs @@ -10,6 +10,7 @@ mod apply_identity_credit_withdrawal_transition_factory { apply_identity_credit_withdrawal_transition_factory::ApplyIdentityCreditWithdrawalTransition, IdentityCreditWithdrawalTransition, Pooling, }, + prelude::TimestampMillis, state_repository::MockStateRepositoryLike, tests::fixtures::get_data_contract_fixture, }; @@ -45,7 +46,7 @@ mod apply_identity_credit_withdrawal_transition_factory { #[tokio::test] async fn should_create_withdrawal_and_reduce_balance() { - let block_time_seconds = 1675709306; + let block_time_seconds: TimestampMillis = 1675709306; let state_transition = IdentityCreditWithdrawalTransition { amount: 10, @@ -68,7 +69,7 @@ mod apply_identity_credit_withdrawal_transition_factory { .times(1) .returning(move || { let header = BlockHeader { - time: block_time_seconds, + time: block_time_seconds as u32, version: 1, prev_blockhash: Default::default(), merkle_root: Default::default(), @@ -83,8 +84,8 @@ mod apply_identity_credit_withdrawal_transition_factory { .expect_create_document() .times(1) .withf(move |doc, _| { - let created_at_match = doc.created_at == Some(block_time_seconds as i64 * 1000); - let updated_at_match = doc.created_at == Some(block_time_seconds as i64 * 1000); + let created_at_match = doc.created_at == Some(block_time_seconds * 1000); + let updated_at_match = doc.created_at == Some(block_time_seconds * 1000); let document_data_match = doc.data == json!({ diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs index 5d9365d135e..3174bcdf938 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs @@ -13,7 +13,7 @@ use crate::{ validation::MockTPublicKeysValidator, Purpose, SecurityLevel, }, - prelude::Identity, + prelude::{Identity, TimestampMillis}, state_repository::MockStateRepositoryLike, state_transition::StateTransitionLike, tests::{ @@ -191,7 +191,7 @@ async fn should_return_invalid_result_if_disabled_at_has_violated_time_window() } = setup_test(); state_transition.set_public_key_ids_to_disable(vec![1]); state_transition.set_public_keys_disabled_at(Some( - Utc::now().timestamp_millis() as u64 - (BLOCK_TIME_WINDOW_MILLIS * 2), + Utc::now().timestamp_millis() as TimestampMillis - (BLOCK_TIME_WINDOW_MILLIS * 2), )); let validator = IdentityUpdateTransitionStateValidator::new( diff --git a/packages/rs-dpp/src/util/cbor_value/mod.rs b/packages/rs-dpp/src/util/cbor_value/mod.rs index beb783c934f..36a12f7cb94 100644 --- a/packages/rs-dpp/src/util/cbor_value/mod.rs +++ b/packages/rs-dpp/src/util/cbor_value/mod.rs @@ -1,6 +1,6 @@ -use std::convert::TryInto; +use std::convert::{TryFrom, TryInto}; -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use ciborium::value::Value as CborValue; use serde_json::{Map, Value as JsonValue}; @@ -118,7 +118,9 @@ impl CborMapExtension for &Vec<(CborValue, CborValue)> { let key_value = get_key_from_cbor_map(self, key) .ok_or_else(|| ProtocolError::DecodingError(String::from(error_message)))?; if let CborValue::Integer(integer_value) = key_value { - return Ok(i128::from(*integer_value) as u64); + return Ok( + u64::try_from(i128::from(*integer_value)).context("unable convert i128 to u64")? + ); } Err(ProtocolError::DecodingError(String::from(error_message))) } diff --git a/packages/rs-dpp/src/util/deserializer.rs b/packages/rs-dpp/src/util/deserializer.rs index 6061e5fe05f..1a2898bbf54 100644 --- a/packages/rs-dpp/src/util/deserializer.rs +++ b/packages/rs-dpp/src/util/deserializer.rs @@ -5,6 +5,7 @@ use serde_json::{Map, Number, Value as JsonValue}; use crate::consensus::basic::decode::ProtocolVersionParsingError; use crate::data_contract::errors::StructureError; use crate::data_contract::extra::common::check_protocol_version; +use crate::prelude::ProtocolVersion; use crate::{errors::consensus::ConsensusError, errors::ProtocolError}; pub fn parse_protocol_version( @@ -20,9 +21,6 @@ pub fn parse_protocol_version( Ok(()) } -/// A protocol version -pub type ProtocolVersion = u32; - pub fn get_protocol_version(version_bytes: &[u8]) -> Result { u32::decode_var(version_bytes) .ok_or_else(|| { diff --git a/packages/rs-dpp/src/util/json_value/mod.rs b/packages/rs-dpp/src/util/json_value/mod.rs index 30a360b824b..ce7069848ed 100644 --- a/packages/rs-dpp/src/util/json_value/mod.rs +++ b/packages/rs-dpp/src/util/json_value/mod.rs @@ -1,4 +1,7 @@ -use std::{collections::BTreeMap, convert::TryInto}; +use std::{ + collections::BTreeMap, + convert::{TryFrom, TryInto}, +}; use anyhow::{anyhow, bail}; use log::trace; @@ -8,6 +11,7 @@ use serde_json::{Number, Value as JsonValue}; use crate::{ errors::ProtocolError, identifier::{self, Identifier}, + prelude::ProtocolVersion, }; use super::{ @@ -80,7 +84,7 @@ pub trait JsonValueExt { fn add_protocol_version( &mut self, property_name: &str, - protocol_version: u32, + protocol_version: ProtocolVersion, ) -> Result<(), ProtocolError>; /// Insert value under the path. Path is dot-separated string. i.e `properties[0].id`. If parents don't @@ -408,14 +412,15 @@ impl JsonValueExt for JsonValue { fn remove_u32(&mut self, property_name: &str) -> Result { match self { - JsonValue::Object(ref mut m) => match m.remove(property_name) { - Some(JsonValue::Number(number)) => Ok(number.as_u64().ok_or_else(|| { - anyhow!("unable to convert '{}' into unsigned integer", number) - })? as u32), - _ => { + JsonValue::Object(ref mut m) => { + if let Some(JsonValue::Number(number)) = m.remove(property_name) { + Ok(u32::try_from(number.as_u64().ok_or_else(|| { + anyhow!("unable to convert '{}' into unsigned integer", number) + })?)?) + } else { bail!("Unable to find '{}' in '{}'", property_name, self) } - }, + } _ => bail!("the Json Value isn't a map: {:?}", self), } } diff --git a/packages/rs-dpp/src/util/serializer.rs b/packages/rs-dpp/src/util/serializer.rs index a933710207e..e64752a06b3 100644 --- a/packages/rs-dpp/src/util/serializer.rs +++ b/packages/rs-dpp/src/util/serializer.rs @@ -1,6 +1,6 @@ use integer_encoding::VarIntWriter; -use crate::errors::ProtocolError; +use crate::{errors::ProtocolError, prelude::ProtocolVersion}; // ciborium::value @@ -8,7 +8,7 @@ pub const MAX_ENCODED_KBYTE_LENGTH: usize = 16; pub fn value_to_cbor( value: serde_json::Value, - protocol_version: Option, + protocol_version: Option, ) -> Result, ProtocolError> { let mut buffer: Vec = Vec::new(); if let Some(protocol_version) = protocol_version { diff --git a/packages/rs-dpp/src/version/mod.rs b/packages/rs-dpp/src/version/mod.rs index 69125c3a043..dd1503e6634 100644 --- a/packages/rs-dpp/src/version/mod.rs +++ b/packages/rs-dpp/src/version/mod.rs @@ -4,9 +4,11 @@ use lazy_static::lazy_static; pub use protocol_version_validator::ProtocolVersionValidator; +use crate::prelude::ProtocolVersion; + mod protocol_version_validator; -pub const LATEST_VERSION: u32 = 1; +pub const LATEST_VERSION: ProtocolVersion = 1; lazy_static! { pub static ref COMPATIBILITY_MAP: HashMap = { diff --git a/packages/rs-dpp/src/version/protocol_version_validator.rs b/packages/rs-dpp/src/version/protocol_version_validator.rs index 9fbefb45e25..1d1c5ceedef 100644 --- a/packages/rs-dpp/src/version/protocol_version_validator.rs +++ b/packages/rs-dpp/src/version/protocol_version_validator.rs @@ -7,14 +7,15 @@ use crate::errors::consensus::basic::{ IncompatibleProtocolVersionError, UnsupportedProtocolVersionError, }; use crate::errors::CompatibleProtocolVersionIsNotDefinedError; +use crate::prelude::ProtocolVersion; use crate::validation::DataValidator; use crate::validation::ValidationResult; use crate::version::{COMPATIBILITY_MAP, LATEST_VERSION}; #[derive(Clone)] pub struct ProtocolVersionValidator { - current_protocol_version: u32, - latest_protocol_version: u32, + current_protocol_version: ProtocolVersion, + latest_protocol_version: ProtocolVersion, compatibility_map: HashMap, } @@ -44,8 +45,8 @@ impl DataValidator for ProtocolVersionValidator { impl ProtocolVersionValidator { pub fn new( - current_protocol_version: u32, - latest_protocol_version: u32, + current_protocol_version: ProtocolVersion, + latest_protocol_version: ProtocolVersion, compatibility_map: HashMap, ) -> Self { Self { @@ -57,7 +58,7 @@ impl ProtocolVersionValidator { pub fn validate( &self, - protocol_version: u32, + protocol_version: ProtocolVersion, ) -> Result, CompatibleProtocolVersionIsNotDefinedError> { let mut result = ValidationResult::new(None); diff --git a/packages/rs-drive-abci/src/abci/messages.rs b/packages/rs-drive-abci/src/abci/messages.rs index 26912da7cb5..63e40c617c7 100644 --- a/packages/rs-drive-abci/src/abci/messages.rs +++ b/packages/rs-drive-abci/src/abci/messages.rs @@ -38,8 +38,8 @@ use crate::error::Error; use crate::execution::fee_pools::epoch::EpochInfo; use crate::execution::fee_pools::fee_distribution::FeesInPools; use crate::execution::fee_pools::process_block_fees::ProcessedBlockFeesOutcome; -use drive::dpp::identity::TimestampMillis; -use drive::dpp::util::deserializer::ProtocolVersion; +use dpp::prelude::ProtocolVersion; +use drive::dpp::prelude::TimestampMillis; use drive::fee::epoch::CreditsPerEpoch; use drive::fee::result::FeeResult; use serde::{de::DeserializeOwned, Deserialize, Serialize}; diff --git a/packages/rs-drive-abci/src/execution/engine.rs b/packages/rs-drive-abci/src/execution/engine.rs index 941a60d57fb..517cf6af986 100644 --- a/packages/rs-drive-abci/src/execution/engine.rs +++ b/packages/rs-drive-abci/src/execution/engine.rs @@ -5,8 +5,8 @@ use crate::abci::messages::{ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform::Platform; +use dpp::prelude::ProtocolVersion; use drive::dpp::identity::PartialIdentity; -use drive::dpp::util::deserializer::ProtocolVersion; use drive::drive::batch::DriveOperationType; use drive::drive::block_info::BlockInfo; use drive::error::Error::GroveDB; diff --git a/packages/rs-drive-abci/src/execution/protocol_upgrade.rs b/packages/rs-drive-abci/src/execution/protocol_upgrade.rs index bd1cf672e91..6b240791b5e 100644 --- a/packages/rs-drive-abci/src/execution/protocol_upgrade.rs +++ b/packages/rs-drive-abci/src/execution/protocol_upgrade.rs @@ -2,7 +2,7 @@ use crate::constants::PROTOCOL_VERSION_UPGRADE_PERCENTAGE_NEEDED; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform::Platform; -use drive::dpp::util::deserializer::ProtocolVersion; +use dpp::prelude::ProtocolVersion; use drive::grovedb::TransactionArg; impl Platform { diff --git a/packages/rs-drive-abci/src/state/genesis.rs b/packages/rs-drive-abci/src/state/genesis.rs index bf868a39bd0..396ceb75bf2 100644 --- a/packages/rs-drive-abci/src/state/genesis.rs +++ b/packages/rs-drive-abci/src/state/genesis.rs @@ -32,13 +32,12 @@ use crate::error::Error; use crate::platform::Platform; use ciborium::{cbor, Value as CborValue}; use dpp::platform_value::Value; +use dpp::prelude::TimestampMillis; use dpp::ProtocolError; use drive::contract::DataContract; use drive::dpp::data_contract::DriveContractExt; use drive::dpp::document::document_stub::DocumentStub; -use drive::dpp::identity::{ - Identity, IdentityPublicKey, KeyType, Purpose, SecurityLevel, TimestampMillis, -}; +use drive::dpp::identity::{Identity, IdentityPublicKey, KeyType, Purpose, SecurityLevel}; use drive::dpp::prelude::{Document, Identifier}; use drive::dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use drive::dpp::util::string_encoding::{encode, Encoding}; diff --git a/packages/rs-drive-abci/src/state/mod.rs b/packages/rs-drive-abci/src/state/mod.rs index 6c98f23e40a..1faae17ad4d 100644 --- a/packages/rs-drive-abci/src/state/mod.rs +++ b/packages/rs-drive-abci/src/state/mod.rs @@ -1,4 +1,4 @@ -use drive::dpp::util::deserializer::ProtocolVersion; +use dpp::prelude::ProtocolVersion; use drive::drive::block_info::BlockInfo; mod genesis; diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 1307aab75f1..274d015d86f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -31,11 +31,11 @@ //! use crate::DocumentAction::{DocumentActionDelete, DocumentActionInsert}; +use dpp::prelude::ProtocolVersion; use drive::common::helpers::identities::create_test_masternode_identities_with_rng; use drive::contract::{Contract, CreateRandomDocument, DocumentType}; use drive::dpp::document::document_stub::DocumentStub; use drive::dpp::identity::{Identity, KeyID, PartialIdentity}; -use drive::dpp::util::deserializer::ProtocolVersion; use drive::drive::batch::{ ContractOperationType, DocumentOperationType, DriveOperationType, IdentityOperationType, SystemOperationType, diff --git a/packages/rs-drive-nodejs/src/lib.rs b/packages/rs-drive-nodejs/src/lib.rs index 07bc33ef6b0..a2b4f4f609d 100644 --- a/packages/rs-drive-nodejs/src/lib.rs +++ b/packages/rs-drive-nodejs/src/lib.rs @@ -10,8 +10,8 @@ use std::{option::Option::None, path::Path, sync::mpsc, thread}; use crate::converter::js_object_to_fee_refunds; use crate::fee::result::FeeResultWrapper; -use drive::dpp::identity::{KeyID, TimestampMillis}; -use drive::dpp::prelude::Revision; +use drive::dpp::identity::KeyID; +use drive::dpp::prelude::{Revision, TimestampMillis}; use drive::drive::flags::StorageFlags; use drive::drive::query::QueryDocumentsOutcome; use drive::error::Error; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs index 5bc9bbb73a0..e9f37d3f131 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs @@ -3,8 +3,8 @@ use crate::drive::block_info::BlockInfo; use crate::drive::Drive; use crate::error::Error; use crate::fee::op::DriveOperation; -use dpp::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; -use dpp::prelude::Revision; +use dpp::identity::{Identity, IdentityPublicKey, KeyID}; +use dpp::prelude::{Revision, TimestampMillis}; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; use std::collections::HashMap; diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 890fc17050b..f60c560c7b1 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,9 +1,9 @@ #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::contract::ContractFetchInfo; #[cfg(any(feature = "full", feature = "verify"))] -use dpp::identity::TimestampMillis; +use dpp::prelude::ProtocolVersion; #[cfg(any(feature = "full", feature = "verify"))] -use dpp::util::deserializer::ProtocolVersion; +use dpp::prelude::TimestampMillis; #[cfg(any(feature = "full", feature = "verify"))] use moka::sync::Cache; #[cfg(any(feature = "full", feature = "verify"))] diff --git a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs index c33fa857af5..585af28d007 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs @@ -9,7 +9,7 @@ use crate::error::Error; use crate::error::Error::GroveDB; use crate::fee::op::DriveOperation; use crate::query::QueryItem; -use dpp::util::deserializer::ProtocolVersion; +use dpp::prelude::ProtocolVersion; use grovedb::query_result_type::QueryResultType; use grovedb::{Element, PathQuery, Query, TransactionArg}; use integer_encoding::VarInt; diff --git a/packages/rs-drive/src/drive/system/protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version.rs index 801d1a43358..27844dbc44b 100644 --- a/packages/rs-drive/src/drive/system/protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version.rs @@ -9,7 +9,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fee::op::DriveOperation; -use dpp::util::deserializer::ProtocolVersion; +use dpp::prelude::ProtocolVersion; use grovedb::{Element, TransactionArg}; use integer_encoding::VarInt; diff --git a/packages/wasm-dpp/lib/test/.eslintrc b/packages/wasm-dpp/lib/test/.eslintrc index 4c2b11fe817..8908307b573 100644 --- a/packages/wasm-dpp/lib/test/.eslintrc +++ b/packages/wasm-dpp/lib/test/.eslintrc @@ -1,5 +1,6 @@ { "env": { + "es2020": true, "node": true, "mocha": true }, diff --git a/packages/wasm-dpp/src/document/mod.rs b/packages/wasm-dpp/src/document/mod.rs index cdab208fd96..eca0b5a7db5 100644 --- a/packages/wasm-dpp/src/document/mod.rs +++ b/packages/wasm-dpp/src/document/mod.rs @@ -1,5 +1,5 @@ use dpp::dashcore::anyhow::Context; -use dpp::prelude::{DataContract, Identifier}; +use dpp::prelude::{DataContract, Identifier, Revision}; use dpp::util::json_schema::JsonSchemaExt; use dpp::util::json_value::{JsonValueExt, ReplaceWith}; use dpp::util::string_encoding::Encoding; @@ -14,7 +14,10 @@ use crate::buffer::Buffer; use crate::errors::RustConversionError; use crate::identifier::{identifier_from_js_value, IdentifierWrapper}; use crate::lodash::lodash_set; -use crate::utils::{replace_identifiers_with_bytes_without_failing, Inner, ToSerdeJSONExt}; +use crate::utils::{ + replace_identifiers_with_bytes_without_failing, timestamp_millis_to_js_date, Inner, + ToSerdeJSONExt, +}; use crate::utils::{try_to_u64, WithJsError}; use crate::with_js_error; use crate::{DataContractWasm, MetadataWasm}; @@ -112,14 +115,16 @@ impl DocumentWasm { self.0.owner_id.into() } + /// set the revision. Accepts BigInt or Number #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, rev: u32) { - self.0.revision = rev + pub fn set_revision(&mut self, revision: JsValue) -> Result<(), JsValue> { + self.0.revision = try_to_u64(revision).with_js_error()?; + Ok(()) } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> u32 { - self.0.revision + pub fn get_revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(self.0.revision) } #[wasm_bindgen(js_name=setEntropy)] @@ -257,7 +262,7 @@ impl DocumentWasm { let ts = try_to_u64(number) .context("setting createdAt in Document") .with_js_error()?; - self.0.created_at = Some(ts as i64); + self.0.created_at = Some(ts); Ok(()) } @@ -266,18 +271,18 @@ impl DocumentWasm { let ts = try_to_u64(number) .context("setting updatedAt in Document") .with_js_error()?; - self.0.updated_at = Some(ts as i64); + self.0.updated_at = Some(ts); Ok(()) } #[wasm_bindgen(js_name=getCreatedAt)] - pub fn get_created_at(&self) -> Option { - self.0.created_at.map(|v| v as f64) + pub fn get_created_at(&self) -> Option { + self.0.created_at.map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=getUpdatedAt)] - pub fn get_updated_at(&self) -> Option { - self.0.updated_at.map(|v| v as f64) + pub fn get_updated_at(&self) -> Option { + self.0.updated_at.map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=getMetadata)] diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs index de895bf55ce..ecbc309bf5c 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs @@ -3,6 +3,7 @@ use std::convert; use dpp::{ document::document_transition::{ self, document_create_transition, DocumentCreateTransition, DocumentTransitionObjectLike, + INITIAL_REVISION, }, prelude::{DataContract, Identifier}, util::{json_schema::JsonSchemaExt, json_value::JsonValueExt}, @@ -16,7 +17,10 @@ use crate::{ document_batch_transition::document_transition::to_object, identifier::IdentifierWrapper, lodash::lodash_set, - utils::{replace_identifiers_with_bytes_without_failing, ToSerdeJSONExt, WithJsError}, + utils::{ + replace_identifiers_with_bytes_without_failing, timestamp_millis_to_js_date, + ToSerdeJSONExt, WithJsError, + }, BinaryType, DataContractWasm, }; @@ -73,24 +77,24 @@ impl DocumentCreateTransitionWasm { } #[wasm_bindgen(js_name=getCreatedAt)] - pub fn created_at(&self) -> Option { - self.inner.created_at + pub fn created_at(&self) -> Option { + self.inner.created_at.map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=getUpdatedAt)] - pub fn updated_at(&self) -> Option { - self.inner.updated_at + pub fn updated_at(&self) -> Option { + self.inner.updated_at.map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=getRevision)] - pub fn revision(&self) -> u32 { - document_transition::INITIAL_REVISION + pub fn revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(document_transition::INITIAL_REVISION) } // AbstractDocumentTransitionMethods #[wasm_bindgen(js_name=getId)] pub fn id(&self) -> IdentifierWrapper { - self.inner.base.id.clone().into() + self.inner.base.id.into() } #[wasm_bindgen(js_name=getType)] @@ -251,6 +255,11 @@ impl DocumentCreateTransitionWasm { Ok(js_value) } + + #[wasm_bindgen(getter, js_name = INITIAL_REVISION)] + pub fn initial_revision() -> js_sys::BigInt { + js_sys::BigInt::from(INITIAL_REVISION) + } } impl DocumentCreateTransitionWasm { diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs index 0c0bee54282..2b640b1d769 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs @@ -8,7 +8,7 @@ use dpp::{ DocumentTransitionObjectLike, }, }, - prelude::{DataContract, Identifier}, + prelude::{DataContract, Identifier, Revision, TimestampMillis}, util::{json_schema::JsonSchemaExt, json_value::JsonValueExt}, }; use serde::Serialize; @@ -19,7 +19,10 @@ use crate::{ document_batch_transition::document_transition::to_object, identifier::IdentifierWrapper, lodash::lodash_set, - utils::{replace_identifiers_with_bytes_without_failing, ToSerdeJSONExt, WithJsError}, + utils::{ + replace_identifiers_with_bytes_without_failing, timestamp_millis_to_js_date, + ToSerdeJSONExt, WithJsError, + }, BinaryType, DataContractWasm, }; @@ -75,13 +78,13 @@ impl DocumentReplaceTransitionWasm { } #[wasm_bindgen(js_name=getRevision)] - pub fn revision(&self) -> u32 { - self.inner.revision + pub fn revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(self.inner.revision) } #[wasm_bindgen(js_name=getUpdatedAt)] - pub fn updated_at(&self) -> Option { - self.inner.updated_at + pub fn updated_at(&self) -> Option { + self.inner.updated_at.map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=toObject)] diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs index 1cfa8d103d2..128170e36fe 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs @@ -23,7 +23,7 @@ use crate::{ buffer::Buffer, identifier::{identifier_from_js_value, IdentifierWrapper}, lodash::lodash_set, - utils::{try_to_u64, Inner, ToSerdeJSONExt, WithJsError}, + utils::{timestamp_millis_to_js_date, try_to_u64, Inner, ToSerdeJSONExt, WithJsError}, with_js_error, BinaryType, ConversionOptions, DataContractWasm, }; @@ -68,27 +68,20 @@ impl DocumentTransitionWasm { #[wasm_bindgen(js_name=getRevision)] pub fn get_revision(&self) -> JsValue { if let Some(revision) = self.0.get_revision() { - (revision as f64).into() + js_sys::BigInt::from(revision).into() } else { JsValue::NULL } } #[wasm_bindgen(js_name=getCreatedAt)] - pub fn get_created_at(&self) -> JsValue { - if let Some(created_at) = self.0.get_created_at() { - (created_at as f64).into() - } else { - JsValue::NULL - } + pub fn get_created_at(&self) -> Option { + self.0.get_created_at().map(timestamp_millis_to_js_date) } + #[wasm_bindgen(js_name=getUpdatedAt)] - pub fn get_updated_at(&self) -> JsValue { - if let Some(updated_at) = self.0.get_updated_at() { - (updated_at as f64).into() - } else { - JsValue::NULL - } + pub fn get_updated_at(&self) -> Option { + self.0.get_updated_at().map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=setUpdatedAt)] @@ -100,7 +93,7 @@ impl DocumentTransitionWasm { let timestamp_millis = try_to_u64(js_timestamp_millis) .context("setting updatedAt in DocumentsBatchTransition") .with_js_error()?; - self.0.set_updated_at(Some(timestamp_millis as i64)); + self.0.set_updated_at(Some(timestamp_millis)); Ok(()) } @@ -114,7 +107,7 @@ impl DocumentTransitionWasm { let timestamp_millis = try_to_u64(js_timestamp_millis) .context("setting createdAt in DocumentsBatchTransition") .with_js_error()?; - self.0.set_created_at(Some(timestamp_millis as i64)); + self.0.set_created_at(Some(timestamp_millis)); Ok(()) } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs index bb2cfa55528..81e1c49788c 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs @@ -1,5 +1,6 @@ use dpp::consensus::basic::identity::InvalidIdentityCreditWithdrawalTransitionCoreFeeError; use dpp::consensus::ConsensusError; +use dpp::prelude::Fee; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityCreditWithdrawalTransitionCoreFeeError)] @@ -18,7 +19,7 @@ impl From<&InvalidIdentityCreditWithdrawalTransitionCoreFeeError> #[wasm_bindgen(js_class=InvalidIdentityCreditWithdrawalTransitionCoreFeeError)] impl InvalidIdentityCreditWithdrawalTransitionCoreFeeErrorWasm { #[wasm_bindgen(js_name=getCoreFee)] - pub fn core_fee_per_byte(&self) -> u32 { + pub fn core_fee_per_byte(&self) -> Fee { self.inner.core_fee_per_byte() } diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs index 335e74cf76c..cf4b602286c 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs @@ -1,14 +1,14 @@ -use crate::buffer::Buffer; -use dpp::identifier::Identifier; +use crate::{buffer::Buffer, utils::timestamp_millis_to_js_date}; +use dpp::{identifier::Identifier, prelude::TimestampMillis}; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentTimestampWindowViolationError)] pub struct DocumentTimestampWindowViolationErrorWasm { timestamp_name: String, document_id: Identifier, - timestamp: i64, - time_window_start: i64, - time_window_end: i64, + timestamp: TimestampMillis, + time_window_start: TimestampMillis, + time_window_end: TimestampMillis, code: u32, } @@ -26,23 +26,17 @@ impl DocumentTimestampWindowViolationErrorWasm { #[wasm_bindgen(js_name=getTimestamp)] pub fn timestamp(&self) -> js_sys::Date { - let date = js_sys::Date::new_0(); - date.set_time(self.timestamp as f64); - date + timestamp_millis_to_js_date(self.timestamp) } #[wasm_bindgen(js_name=getTimeWindowStart)] pub fn time_window_start(&self) -> js_sys::Date { - let date = js_sys::Date::new_0(); - date.set_time(self.time_window_start as f64); - date + timestamp_millis_to_js_date(self.time_window_start) } #[wasm_bindgen(js_name=getTimeWindowEnd)] pub fn time_window_end(&self) -> js_sys::Date { - let date = js_sys::Date::new_0(); - date.set_time(self.time_window_end as f64); - date + timestamp_millis_to_js_date(self.time_window_end) } #[wasm_bindgen(js_name=getCode)] @@ -55,9 +49,9 @@ impl DocumentTimestampWindowViolationErrorWasm { pub fn new( timestamp_name: String, document_id: Identifier, - timestamp: i64, - time_window_start: i64, - time_window_end: i64, + timestamp: TimestampMillis, + time_window_start: TimestampMillis, + time_window_end: TimestampMillis, code: u32, ) -> Self { Self { diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs index 43af8cd40de..a0c42e30aa1 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs @@ -17,8 +17,8 @@ impl InvalidDocumentRevisionErrorWasm { } #[wasm_bindgen(js_name=getCurrentRevision)] - pub fn current_revision(&self) -> Revision { - self.current_revision + pub fn current_revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(self.current_revision) } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs index c2eedb4328e..9dbbe62c4a6 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs @@ -1,11 +1,13 @@ -use dpp::identity::TimestampMillis; +use dpp::prelude::TimestampMillis; use wasm_bindgen::prelude::*; +use crate::utils::timestamp_millis_to_js_date; + #[wasm_bindgen(js_name=IdentityPublicKeyDisabledAtWindowViolationError)] pub struct IdentityPublicKeyDisabledAtWindowViolationErrorWasm { - disabled_at: u64, - time_window_start: u64, - time_window_end: u64, + disabled_at: TimestampMillis, + time_window_start: TimestampMillis, + time_window_end: TimestampMillis, code: u32, } @@ -14,19 +16,19 @@ impl IdentityPublicKeyDisabledAtWindowViolationErrorWasm { #[wasm_bindgen(js_name=getDisabledAt)] pub fn disabled_at(&self) -> js_sys::Date { // TODO: Figure out how to match rust timestamps with JS timestamps - js_sys::Date::new(&JsValue::from_f64(self.disabled_at as f64)) + timestamp_millis_to_js_date(self.disabled_at) } #[wasm_bindgen(js_name=getTimeWindowStart)] pub fn time_window_start(&self) -> js_sys::Date { // TODO: Figure out how to match rust timestamps with JS timestamps - js_sys::Date::new(&JsValue::from_f64(self.time_window_start as f64)) + timestamp_millis_to_js_date(self.time_window_start) } #[wasm_bindgen(js_name=getTimeWindowEnd)] pub fn time_window_end(&self) -> js_sys::Date { // TODO: Figure out how to match rust timestamps with JS timestamps - js_sys::Date::new(&JsValue::from_f64(self.time_window_end as f64)) + timestamp_millis_to_js_date(self.time_window_end) } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs index 81662f5f72a..0e4be4b78ca 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs @@ -19,9 +19,8 @@ impl InvalidIdentityRevisionErrorWasm { } #[wasm_bindgen(js_name=getCurrentRevision)] - pub fn current_revision(&self) -> Number { - // It might be overflow - Number::from(self.current_revision as f64) + pub fn current_revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(self.current_revision) } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 8d89c60995a..c2825f16b3a 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -2,6 +2,7 @@ use std::convert::TryInto; use std::sync::Arc; +use dpp::prelude::TimestampMillis; use wasm_bindgen::prelude::*; use dpp::identity::validation::PublicKeysValidator; @@ -199,7 +200,7 @@ impl IdentityFacadeWasm { ) -> Result { let (add_public_keys, disable_public_keys) = super::factory_utils::parse_create_identity_update_transition_keys(public_keys)?; - let now = js_sys::Date::now() as u64; + let now = js_sys::Date::now() as TimestampMillis; self.0 .create_identity_update_transition( diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 64c062e1e7b..9beb3a00f96 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -1,10 +1,11 @@ use dpp::dashcore::anyhow; +use js_sys::BigInt; pub use serde::{Deserialize, Serialize}; use std::convert::{TryFrom, TryInto}; use wasm_bindgen::prelude::*; use crate::errors::from_dpp_err; -use crate::utils::Inner; +use crate::utils::{try_to_u64, Inner, WithJsError}; use crate::{buffer::Buffer, utils}; use dpp::identity::{IdentityPublicKey, KeyID}; @@ -104,14 +105,15 @@ impl IdentityPublicKeyWasm { } #[wasm_bindgen(js_name=setDisabledAt)] - pub fn set_disabled_at(&mut self, timestamp: u32) { - // TODO: It's not gonna work, must be BigInt - self.0.set_disabled_at(timestamp as u64); + pub fn set_disabled_at(&mut self, timestamp: JsValue) -> Result<(), JsValue> { + self.0 + .set_disabled_at(try_to_u64(timestamp).with_js_error()?); + Ok(()) } #[wasm_bindgen(js_name=getDisabledAt)] - pub fn get_disabled_at(&self) -> Option { - self.0.disabled_at.map(|timestamp| timestamp as f64) + pub fn get_disabled_at(&self) -> Option { + self.0.disabled_at.map(BigInt::from) } #[wasm_bindgen(js_name=hash)] diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index 5574a9aef7b..15e3137dffb 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -16,8 +16,8 @@ use dpp::{ProtocolError, SerdeParsingError}; use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; -use crate::utils; -use crate::utils::to_vec_of_serde_values; +use crate::utils::{self, try_to_u64}; +use crate::utils::{to_vec_of_serde_values, WithJsError}; use crate::MetadataWasm; pub use identity_public_key::*; @@ -138,13 +138,14 @@ impl IdentityWasm { } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: f64) { - self.0.set_revision(revision as u64); + pub fn set_revision(&mut self, revision: JsValue) -> Result<(), JsValue> { + self.0.set_revision(try_to_u64(revision).with_js_error()?); + Ok(()) } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> f64 { - self.0.get_revision() as f64 + pub fn get_revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(self.0.get_revision()) } #[wasm_bindgen(js_name=setMetadata)] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index d052b7e10ce..df4c23fd5c1 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -16,10 +16,10 @@ use crate::{ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; use crate::errors::from_dpp_err; -use crate::utils::generic_of_js_val; +use crate::utils::{generic_of_js_val, timestamp_millis_to_js_date, try_to_u64, WithJsError}; use dpp::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransition; -use dpp::identity::{KeyID, TimestampMillis}; -use dpp::prelude::Revision; +use dpp::identity::KeyID; +use dpp::prelude::{ProtocolVersion, Revision, TimestampMillis}; use dpp::state_transition::StateTransitionIdentitySigned; use dpp::{ identifier::Identifier, @@ -35,7 +35,7 @@ pub struct IdentityUpdateTransitionWasm(IdentityUpdateTransition); #[serde(rename_all = "camelCase")] struct IdentityUpdateTransitionParams { signature: Option>, - protocol_version: u32, + protocol_version: ProtocolVersion, identity_id: Vec, revision: Revision, add_public_keys: Option>, @@ -135,7 +135,7 @@ impl IdentityUpdateTransitionWasm { pub fn get_public_keys_disabled_at(&self) -> Option { self.0 .get_public_keys_disabled_at() - .map(|timestamp| js_sys::Date::new(&JsValue::from_f64(timestamp as f64))) + .map(timestamp_millis_to_js_date) } #[wasm_bindgen(js_name=setPublicKeysDisabledAt)] @@ -420,13 +420,14 @@ impl IdentityUpdateTransitionWasm { } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> u32 { - self.0.get_revision() as u32 + pub fn get_revision(&self) -> js_sys::BigInt { + js_sys::BigInt::from(self.0.get_revision()) } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: u32) { - self.0.set_revision(revision as u64) + pub fn set_revision(&mut self, revision: JsValue) -> Result<(), JsValue> { + self.0.set_revision(try_to_u64(revision).with_js_error()?); + Ok(()) } #[wasm_bindgen] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs index bc2c03d3e98..eb9fdfc6dbe 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs @@ -1,4 +1,5 @@ use dpp::identity::KeyID; +use dpp::prelude::{ProtocolVersion, Revision, TimestampMillis}; use dpp::state_transition::StateTransitionIdentitySigned; use dpp::{ identifier::Identifier, @@ -18,11 +19,11 @@ pub struct ToObjectOptions { #[derive(Default)] pub struct ToObject { pub transition_type: u8, - pub protocol_version: u32, + pub protocol_version: ProtocolVersion, pub revision: u32, pub signature: Option>, pub signature_public_key_id: Option, - pub public_keys_disabled_at: Option, + pub public_keys_disabled_at: Option, pub public_keys_to_add: Option>, pub public_key_ids_to_disable: Option>, pub identity_id: Identifier, diff --git a/packages/wasm-dpp/src/metadata.rs b/packages/wasm-dpp/src/metadata.rs index e0e62ab7c56..b07bb0eef78 100644 --- a/packages/wasm-dpp/src/metadata.rs +++ b/packages/wasm-dpp/src/metadata.rs @@ -1,11 +1,11 @@ #![allow(clippy::from_over_into)] +use dpp::prelude::{ProtocolVersion, TimestampMillis}; pub use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use crate::utils::ToSerdeJSONExt; use dpp::metadata::Metadata; -use dpp::util::deserializer::ProtocolVersion; use dpp::util::json_value::JsonValueExt; #[wasm_bindgen(js_name=Metadata)] @@ -52,7 +52,7 @@ impl MetadataWasm { let inner = Metadata { block_height: block_height as u64, core_chain_locked_height: core_chain_locked_height as u64, - time_ms: time_ms as u64, + time_ms: time_ms as TimestampMillis, protocol_version: protocol_version as u64 as ProtocolVersion, }; Ok(inner.into()) diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 31774661635..efbb747b4cb 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -19,8 +19,8 @@ use dpp::{ }, state_transition::state_transition_execution_context::StateTransitionExecutionContext, }; -use js_sys::Uint8Array; use js_sys::{Array, Number}; +use js_sys::{BigInt, Uint8Array}; use wasm_bindgen::__rt::Ref; use wasm_bindgen::prelude::*; @@ -119,7 +119,7 @@ extern "C" { pub async fn update_identity_revision( this: &ExternalStateRepositoryLike, identity_id: IdentifierWrapper, - revision: Number, + revision: BigInt, execution_context: StateTransitionExecutionContextWasm, ) -> Result<(), JsValue>; @@ -478,7 +478,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { self.0 .update_identity_revision( (*identity_id).into(), - Number::from(revision as f64), // TODO: We should use BigInt + js_sys::BigInt::from(revision), execution_context.clone().into(), ) .await diff --git a/packages/wasm-dpp/src/utils.rs b/packages/wasm-dpp/src/utils.rs index c984819f714..09b866f9315 100644 --- a/packages/wasm-dpp/src/utils.rs +++ b/packages/wasm-dpp/src/utils.rs @@ -3,6 +3,7 @@ use std::convert::TryInto; use anyhow::{anyhow, bail}; use dpp::{ dashcore::{anyhow, anyhow::Context}, + prelude::TimestampMillis, util::json_value::{JsonValueExt, ReplaceWith}, ProtocolError, }; @@ -203,7 +204,7 @@ pub fn get_class_name(value: &JsValue) -> String { } pub fn try_to_u64(value: JsValue) -> Result { - let result = if value.is_bigint() { + if value.is_bigint() { js_sys::BigInt::new(&value) .map_err(|e| anyhow!("unable to create bigInt: {}", e.to_string()))? .try_into() @@ -213,9 +214,7 @@ pub fn try_to_u64(value: JsValue) -> Result { convert_number_to_u64(number) } else { bail!("supported types are Number or BigInt") - }; - - result + } } pub fn convert_number_to_u64(js_number: js_sys::Number) -> Result { @@ -259,3 +258,11 @@ pub(crate) trait Inner { fn inner(&self) -> &Self::InnerItem; fn inner_mut(&mut self) -> &mut Self::InnerItem; } + +pub(crate) fn timestamp_millis_to_js_date(timestamp_millis: TimestampMillis) -> js_sys::Date { + let date = js_sys::Date::new_0(); + // u64(TimestampMillis) ans JS Date are not compatible. Its impossible to create a `Date` + // object from number that has precision of u64 + date.set_time(timestamp_millis as f64); + date +} diff --git a/packages/wasm-dpp/test/.eslintrc b/packages/wasm-dpp/test/.eslintrc index 720ced73852..3636b0316a2 100644 --- a/packages/wasm-dpp/test/.eslintrc +++ b/packages/wasm-dpp/test/.eslintrc @@ -1,5 +1,6 @@ { "env": { + "es2020": true, "node": true, "mocha": true }, diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index d28b68f8bbb..4bfce5fd9da 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -93,7 +93,7 @@ describe('Document', () => { expect(result.$ownerId.toBuffer()).to.deep.equal(getDocumentsFixture.ownerId.toBuffer()); expect(result.identifierField.toBuffer()).to.deep.equal(document.get('identifierField').toBuffer()); expect(result.$protocolVersion).to.deep.equal(document.getProtocolVersion()); - expect(result.$revision).to.deep.equal(document.getRevision()); + expect(BigInt(result.$revision)).to.deep.equal(document.getRevision()); expect(result.$type).to.deep.equal(document.getType()); expect(result.byteArrayField).to.deep.equal(document.get('byteArrayField')); }); diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index 3c02d58e542..c8ed9318564 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -200,7 +200,7 @@ describe('IdentityFacade', () => { expect(stateTransition.getIdentityId().toBuffer()) .to.be.deep.equal(identity.getId().toBuffer()); expect(stateTransition.getRevision()).to.equal( - identity.getRevision() + 1, + identity.getRevision() + BigInt(1), ); expect( stateTransition.getPublicKeysToAdd().map((pk) => pk.toObject()), diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js index c1ef4d0deee..0ac7629d94a 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js @@ -72,7 +72,7 @@ describe('validateIdentityUpdateTransitionStateFactory', () => { getIdentityUpdateTransitionFixture().toObject(), ); - stateTransition.setRevision(identity.getRevision() + 1); + stateTransition.setRevision(identity.getRevision() + BigInt(1)); stateTransition.setPublicKeyIdsToDisable(undefined); stateTransition.setPublicKeysDisabledAt(undefined); @@ -96,7 +96,7 @@ describe('validateIdentityUpdateTransitionStateFactory', () => { const [error] = result.getErrors(); expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId().toBuffer()); - expect(error.getCurrentRevision()).to.equal(rawIdentity.revision); + expect(error.getCurrentRevision()).to.equal(BigInt(rawIdentity.revision)); }); it('should return IdentityPublicKeyIsReadOnlyError if disabling public key is readOnly', async () => { diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index 2d28c6f4bd0..cd7972840bf 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -201,7 +201,7 @@ describe('Document', () => { document = new Document(rawDocument, dataContract); - expect(document.getRevision()).to.equal(rawDocument.$revision); + expect(document.getRevision()).to.equal(BigInt(rawDocument.$revision)); }); it('should create Document with $createdAt and data if present', async () => { @@ -219,7 +219,7 @@ describe('Document', () => { document = new Document(rawDocument, dataContract); - expect(document.getCreatedAt()).to.equal(rawDocument.$createdAt); + expect(document.getCreatedAt().getTime()).to.equal(rawDocument.$createdAt); }); it('should create Document with $updatedAt and data if present', async () => { @@ -237,7 +237,7 @@ describe('Document', () => { document = new Document(rawDocument, dataContract); - expect(document.getUpdatedAt()).to.equal(rawDocument.$updatedAt); + expect(document.getUpdatedAt().getTime()).to.equal(rawDocument.$updatedAt); }); }); @@ -273,7 +273,7 @@ describe('Document', () => { describe('#setRevision/#getRevision', () => { it('should set $revision and get $revision', () => { - const revision = 5; + const revision = BigInt(5); document.setRevision(revision); @@ -400,7 +400,7 @@ describe('Document', () => { document.setCreatedAt(time); - expect(document.getCreatedAt()).to.equal(time); + expect(document.getCreatedAt().getTime()).to.equal(time); }); }); @@ -410,7 +410,7 @@ describe('Document', () => { document.setCreatedAt(time); - expect(document.getCreatedAt()).to.equal(time); + expect(document.getCreatedAt().getTime()).to.equal(time); }); }); @@ -420,7 +420,7 @@ describe('Document', () => { document.setUpdatedAt(time); - expect(document.getUpdatedAt()).to.equal(time); + expect(document.getUpdatedAt().getTime()).to.equal(time); }); }); @@ -430,7 +430,7 @@ describe('Document', () => { document.setUpdatedAt(time); - expect(document.getUpdatedAt()).to.equal(time); + expect(document.getUpdatedAt().getTime()).to.equal(time); }); }); }); diff --git a/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js b/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js index e72053c32ad..e7a19fc7e51 100644 --- a/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js @@ -1,6 +1,6 @@ const bs58 = require('bs58'); const DocumentJs = require('@dashevo/dpp/lib/document/Document'); -const DocumentCreateTransition = require('@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/documentTransition/DocumentCreateTransition'); +const DocumentCreateTransitionJs = require('@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/documentTransition/DocumentCreateTransition'); const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); const getDocumentTransitionsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture'); @@ -29,6 +29,7 @@ let DocumentFactory; let DataContract; let Document; let DocumentValidator; +let DocumentCreateTransition; let ProtocolVersionValidator; let InvalidDocumentTypeInDataContractError; @@ -64,7 +65,7 @@ describe('DocumentFactory', () => { beforeEach(async () => { ({ Identifier, ProtocolVersionValidator, DocumentValidator, DocumentFactory, - DataContract, Document, + DataContract, Document, DocumentCreateTransition, // Errors: InvalidDocumentTypeInDataContractError, InvalidDocumentError, @@ -182,7 +183,7 @@ describe('DocumentFactory', () => { expect(generateEntropyMock).to.have.been.calledOnce(); expect(newDocumentJs.getEntropy()).to.deep.equal(entropy); - expect(newDocumentJs.getRevision()).to.equal(DocumentCreateTransition.INITIAL_REVISION); + expect(newDocumentJs.getRevision()).to.equal(DocumentCreateTransitionJs.INITIAL_REVISION); expect(newDocument.getRevision()).to.equal(DocumentCreateTransition.INITIAL_REVISION); expect(newDocumentJs.getId()).to.deep.equal(bs58.decode('E9QpjZMD7CPAGa7x2ABuLFPvBLZjhPji4TMrUfSP3Hk9')); @@ -193,7 +194,7 @@ describe('DocumentFactory', () => { expect(newDocument.getEntropy()).not.to.deep.be.equal(Buffer.alloc(32)); expect(newDocumentJs.getCreatedAt().getTime()).to.be.equal(fakeTimeDate.getTime()); - expect(newDocument.getCreatedAt()).to.be.an('number'); + expect(newDocument.getCreatedAt()).to.be.an('Date'); }); it('should throw an error if type is not defined', () => { diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js index c2eb3febefc..8341acf99fd 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js @@ -248,7 +248,7 @@ describe('applyDocumentsBatchTransitionFactory', () => { newDocument.setRevision(documentTransition.getRevision()); newDocument.setData(documentTransition.getData()); - newDocument.setUpdatedAt(documentTransition.getUpdatedAt()); + newDocument.setUpdatedAt(documentTransition.getUpdatedAt().getTime()); expect(stateRepositoryMock.updateDocument).to.have.been.called.calledOnce(); const [updateDocument] = stateRepositoryMock.updateDocument.getCall(0).args; diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js index adda6ac6533..735507b69f0 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js @@ -244,7 +244,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { expect(error.getCode()).to.equal(4010); expect(error.getDocumentId()).to.deep.equal(documentTransitionsJs[0].getId().toBuffer()); - expect(Number(error.getCurrentRevision())).to.deep.equal(documents[0].getRevision()); + expect(error.getCurrentRevision()).to.equal(documents[0].getRevision()); expect(stateRepositoryMock.fetchDataContract).to.have.been.calledOnce(); const [fetchDataContractId] = stateRepositoryMock.fetchDataContract.getCall(0).args; @@ -375,7 +375,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => { const transitions = stateTransition.getTransitions(); transitions.forEach((t) => { - const createdAtMinus6Mins = t.getCreatedAt() - (6 * 60 * 1000); + const createdAtMinus6Mins = t.getCreatedAt().getTime() - (6 * 60 * 1000); t.setCreatedAt(createdAtMinus6Mins); t.setUpdatedAt(undefined); }); diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js index a3db9bb7d1e..0e277d195e0 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js @@ -294,8 +294,8 @@ describe('validateDocumentsUniquenessByIndices', () => { uniqueDatesDocumentJs.getType(), { where: [ - ['$createdAt', '==', uniqueDatesDocument.getCreatedAt()], - ['$updatedAt', '==', uniqueDatesDocument.getUpdatedAt()], + ['$createdAt', '==', uniqueDatesDocument.getCreatedAt().getTime()], + ['$updatedAt', '==', uniqueDatesDocument.getUpdatedAt().getTime()], ], }, ) diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index 3a1e8ba3e1d..5303bbdc700 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -233,7 +233,7 @@ describe('IdentityFactory', () => { describe('createIdentityUpdateTransition', () => { it('should create IdentityUpdateTransition', () => { - const revision = 1; + const revision = BigInt(1); const disablePublicKeys = [identity.getPublicKeyById(0)]; const addPublicKeys = [new IdentityPublicKeyCreateTransition({ id: 0, diff --git a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js index 5652950a6ef..4f9f3c59993 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js @@ -121,7 +121,7 @@ describe('IdentityPublicKey', () => { it('should set disabledAt', () => { publicKey.setDisabledAt(123); - expect(publicKey.getDisabledAt()).to.equal(123); + expect(publicKey.getDisabledAt()).to.equal(BigInt(123)); }); }); @@ -129,7 +129,7 @@ describe('IdentityPublicKey', () => { it('should return disabledAt', () => { publicKey.setDisabledAt(42); - expect(publicKey.getDisabledAt()).to.equal(42); + expect(publicKey.getDisabledAt()).to.equal(BigInt(42)); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js index 8ed78740189..185501766b2 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js @@ -60,15 +60,15 @@ describe('IdentityUpdateTransition', () => { describe('#getRevision', () => { it('should return revision', () => { - expect(stateTransition.getRevision()).to.equal(rawStateTransition.revision); + expect(stateTransition.getRevision()).to.equal(BigInt(rawStateTransition.revision)); }); }); describe('#setRevision', () => { it('should set revision', () => { - stateTransition.setRevision(42); + stateTransition.setRevision(BigInt(42)); - expect(stateTransition.getRevision()).to.equal(42); + expect(stateTransition.getRevision()).to.equal(BigInt(42)); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js index b9c5b0ad2d3..667e619be66 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js @@ -26,7 +26,7 @@ describe('applyIdentityUpdateTransition', () => { stateTransition = new IdentityUpdateTransition( getIdentityUpdateTransitionFixture().toObject(), ); - stateTransition.setRevision(stateTransition.getRevision() + 1); + stateTransition.setRevision(stateTransition.getRevision() + BigInt(1)); executionContext = new StateTransitionExecutionContext(); stateTransition.setExecutionContext(executionContext);