diff --git a/Cargo.lock b/Cargo.lock index fb03b941466..c7ff029c4a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1060,7 +1060,9 @@ name = "dashpay-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1072,7 +1074,9 @@ dependencies = [ "feature-flags-contract", "masternode-reward-shares-contract", "platform-value", + "platform-version", "serde_json", + "thiserror", "withdrawals-contract", ] @@ -1159,7 +1163,9 @@ name = "dpns-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1507,7 +1513,9 @@ name = "feature-flags-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -2364,7 +2372,9 @@ name = "masternode-reward-shares-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -5087,9 +5097,11 @@ version = "1.0.0-dev.3" dependencies = [ "num_enum", "platform-value", + "platform-version", "serde", "serde_json", "serde_repr", + "thiserror", ] [[package]] diff --git a/packages/bench-suite/benchmarks/basicValidation.js b/packages/bench-suite/benchmarks/basicValidation.js index cc1eb900d57..40c0944241c 100644 --- a/packages/bench-suite/benchmarks/basicValidation.js +++ b/packages/bench-suite/benchmarks/basicValidation.js @@ -1,6 +1,6 @@ const { PrivateKey } = require('@dashevo/dashcore-lib'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/dpns-contract-documents'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v1/dpns-contract-documents.json'); // const { DashPlatformProtocol, Identity, Identifier, default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/bench-suite/benchmarks/documents/dpns.js b/packages/bench-suite/benchmarks/documents/dpns.js index 605862943ca..a1062007b1b 100644 --- a/packages/bench-suite/benchmarks/documents/dpns.js +++ b/packages/bench-suite/benchmarks/documents/dpns.js @@ -1,6 +1,6 @@ const crypto = require('crypto'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/dpns-contract-documents'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v1/dpns-contract-documents.json'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index ea69f871c89..6a57b5a220e 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +platform-version = { path = "../rs-platform-version" } +thiserror = "1.0.56" serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/dashpay-contract/schema/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json similarity index 100% rename from packages/dashpay-contract/schema/dashpay.schema.json rename to packages/dashpay-contract/schema/v1/dashpay.schema.json diff --git a/packages/dashpay-contract/src/error.rs b/packages/dashpay-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/dashpay-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/dashpay-contract/src/lib.rs b/packages/dashpay-contract/src/lib.rs index 737eba57c6f..8d443aeaa0a 100644 --- a/packages/dashpay-contract/src/lib.rs +++ b/packages/dashpay-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -12,21 +16,26 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 215, 90, 101, 229, 15, 115, 5, 44, 117, 182, 217, ]; -pub mod document_types { - pub mod contact_request { - pub const NAME: &str = "contactRequest"; - - pub mod properties { - pub const TO_USER_ID: &str = "toUserId"; - pub const CORE_HEIGHT_CREATED_AT: &str = "coreHeightCreatedAt"; - pub const CORE_CHAIN_LOCKED_HEIGHT: &str = "coreChainLockedHeight"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/dashpay.schema.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.dashpay { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "dashpay_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.dashpay { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "dashpay_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/dashpay-contract/src/v1/mod.rs b/packages/dashpay-contract/src/v1/mod.rs new file mode 100644 index 00000000000..051b0819aca --- /dev/null +++ b/packages/dashpay-contract/src/v1/mod.rs @@ -0,0 +1,19 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod contact_request { + pub const NAME: &str = "contactRequest"; + + pub mod properties { + pub const TO_USER_ID: &str = "toUserId"; + pub const CORE_HEIGHT_CREATED_AT: &str = "coreHeightCreatedAt"; + pub const CORE_CHAIN_LOCKED_HEIGHT: &str = "coreChainLockedHeight"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/dashpay.schema.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/dashpay-contract/test/unit/schema.spec.js b/packages/dashpay-contract/test/unit/schema.spec.js index a5407a94b1b..1d7523d2964 100644 --- a/packages/dashpay-contract/test/unit/schema.spec.js +++ b/packages/dashpay-contract/test/unit/schema.spec.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const crypto = require('crypto'); const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const schema = require('../../schema/dashpay.schema.json'); +const schema = require('../../schema/v1/dashpay.schema.json'); const whitepaperMasternodeText = 'Full nodes are servers running on a P2P network that allow peers to use them to receive updates about the events on the network. These nodes utilize significant amounts of traffic and other resources that incur a substantial cost. As a result, a steady decrease in the amount of these nodes has been observed for some time on the Bitcoin network and as a result, block propagation times have been upwards of 40 seconds. Many solutions have been proposed such as a new reward scheme by Microsoft Research and the Bitnodes incentive program'; const encoded32Chars = '4fafc98bbfe597f7ba2c9f767d52036d'; diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 9ca1fc9250c..ccf596d97b3 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -7,6 +7,8 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } withdrawals-contract = { path = "../withdrawals-contract" } masternode-reward-shares-contract = { path = "../masternode-reward-shares-contract" } diff --git a/packages/data-contracts/src/error.rs b/packages/data-contracts/src/error.rs new file mode 100644 index 00000000000..b9a5dd5d244 --- /dev/null +++ b/packages/data-contracts/src/error.rs @@ -0,0 +1,104 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} + +impl From for Error { + fn from(e: withdrawals_contract::Error) -> Self { + match e { + withdrawals_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + withdrawals_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: dashpay_contract::Error) -> Self { + match e { + dashpay_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + dashpay_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: dpns_contract::Error) -> Self { + match e { + dpns_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + dpns_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: masternode_reward_shares_contract::Error) -> Self { + match e { + masternode_reward_shares_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + masternode_reward_shares_contract::Error::InvalidSchemaJson(e) => { + Error::InvalidSchemaJson(e) + } + } + } +} + +impl From for Error { + fn from(e: feature_flags_contract::Error) -> Self { + match e { + feature_flags_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + feature_flags_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} diff --git a/packages/data-contracts/src/lib.rs b/packages/data-contracts/src/lib.rs index 460233bb221..f6761d1eb8c 100644 --- a/packages/data-contracts/src/lib.rs +++ b/packages/data-contracts/src/lib.rs @@ -1,14 +1,18 @@ -use serde_json::{Error, Value}; +mod error; +use serde_json::Value; + +use crate::error::Error; pub use dashpay_contract; pub use dpns_contract; pub use feature_flags_contract; pub use masternode_reward_shares_contract; use platform_value::Identifier; +use platform_version::version::PlatformVersion; pub use withdrawals_contract; #[repr(u8)] -#[derive(PartialEq, Eq, Clone, Copy, Debug, Ord, PartialOrd)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Ord, PartialOrd, Hash)] pub enum SystemDataContract { Withdrawals = 0, MasternodeRewards = 1, @@ -20,6 +24,7 @@ pub enum SystemDataContract { pub struct DataContractSource { pub id_bytes: [u8; 32], pub owner_id_bytes: [u8; 32], + pub version: u32, pub definitions: Option, pub document_schemas: Value, } @@ -36,37 +41,46 @@ impl SystemDataContract { Identifier::new(bytes) } /// Returns [DataContractSource] - pub fn source(self) -> Result { + pub fn source(self, platform_version: &PlatformVersion) -> Result { let data = match self { SystemDataContract::Withdrawals => DataContractSource { id_bytes: withdrawals_contract::ID_BYTES, owner_id_bytes: withdrawals_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: withdrawals_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.withdrawals as u32, + definitions: withdrawals_contract::load_definitions(platform_version)?, + document_schemas: withdrawals_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::MasternodeRewards => DataContractSource { id_bytes: masternode_reward_shares_contract::ID_BYTES, owner_id_bytes: masternode_reward_shares_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: masternode_reward_shares_contract::load_documents_schemas()?, + version: platform_version + .system_data_contracts + .masternode_reward_shares as u32, + definitions: withdrawals_contract::load_definitions(platform_version)?, + document_schemas: masternode_reward_shares_contract::load_documents_schemas( + platform_version, + )?, }, SystemDataContract::FeatureFlags => DataContractSource { id_bytes: feature_flags_contract::ID_BYTES, owner_id_bytes: feature_flags_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: feature_flags_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.feature_flags as u32, + definitions: feature_flags_contract::load_definitions(platform_version)?, + document_schemas: feature_flags_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::DPNS => DataContractSource { id_bytes: dpns_contract::ID_BYTES, owner_id_bytes: dpns_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: dpns_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.dpns as u32, + definitions: dpns_contract::load_definitions(platform_version)?, + document_schemas: dpns_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::Dashpay => DataContractSource { id_bytes: dashpay_contract::ID_BYTES, owner_id_bytes: dashpay_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: dashpay_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.dashpay as u32, + definitions: dashpay_contract::load_definitions(platform_version)?, + document_schemas: dashpay_contract::load_documents_schemas(platform_version)?, }, }; diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 4b1156421ae..0ab6051c1e6 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/dpns-contract/schema/dpns-contract-documents.json b/packages/dpns-contract/schema/v1/dpns-contract-documents.json similarity index 100% rename from packages/dpns-contract/schema/dpns-contract-documents.json rename to packages/dpns-contract/schema/v1/dpns-contract-documents.json diff --git a/packages/dpns-contract/src/error.rs b/packages/dpns-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/dpns-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/dpns-contract/src/lib.rs b/packages/dpns-contract/src/lib.rs index 0321c3823c9..6c379e90249 100644 --- a/packages/dpns-contract/src/lib.rs +++ b/packages/dpns-contract/src/lib.rs @@ -1,5 +1,10 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::{Error, Value}; +use platform_version::version::PlatformVersion; +use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ 230, 104, 198, 89, 175, 102, 174, 225, 231, 44, 24, 109, 222, 123, 91, 126, 10, 29, 113, 42, 9, @@ -11,27 +16,25 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 67, 4, 181, 246, 153, 65, 68, 40, 110, 253, 172, ]; -pub mod document_types { - pub mod domain { - pub const NAME: &str = "domain"; - - pub mod properties { - pub const LABEL: &str = "label"; - pub const NORMALIZED_LABEL: &str = "normalizedLabel"; - pub const PARENT_DOMAIN_NAME: &str = "parentDomainName"; - pub const NORMALIZED_PARENT_DOMAIN_NAME: &str = "normalizedParentDomainName"; - pub const PREORDER_SALT: &str = "preorderSalt"; - pub const ALLOW_SUBDOMAINS: &str = "subdomainRules.allowSubdomains"; - pub const RECORDS: &str = "records"; - pub const DASH_UNIQUE_IDENTITY_ID: &str = "dashUniqueIdentityId"; - pub const DASH_ALIAS_IDENTITY_ID: &str = "dashAliasIdentityId"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/dpns-contract-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "dpns_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "dpns_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/dpns-contract/src/v1/mod.rs b/packages/dpns-contract/src/v1/mod.rs new file mode 100644 index 00000000000..fb2117245e0 --- /dev/null +++ b/packages/dpns-contract/src/v1/mod.rs @@ -0,0 +1,25 @@ +use crate::Error; +use serde_json::Value; + +pub mod document_types { + pub mod domain { + pub const NAME: &str = "domain"; + + pub mod properties { + pub const LABEL: &str = "label"; + pub const NORMALIZED_LABEL: &str = "normalizedLabel"; + pub const PARENT_DOMAIN_NAME: &str = "parentDomainName"; + pub const NORMALIZED_PARENT_DOMAIN_NAME: &str = "normalizedParentDomainName"; + pub const PREORDER_SALT: &str = "preorderSalt"; + pub const ALLOW_SUBDOMAINS: &str = "subdomainRules.allowSubdomains"; + pub const RECORDS: &str = "records"; + pub const DASH_UNIQUE_IDENTITY_ID: &str = "dashUniqueIdentityId"; + pub const DASH_ALIAS_IDENTITY_ID: &str = "dashAliasIdentityId"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/dpns-contract-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/dpns-contract/test/unit/dpnsContract.spec.js b/packages/dpns-contract/test/unit/dpnsContract.spec.js index 148d79f51c2..e0b4c46f555 100644 --- a/packages/dpns-contract/test/unit/dpnsContract.spec.js +++ b/packages/dpns-contract/test/unit/dpnsContract.spec.js @@ -6,7 +6,7 @@ const { const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const { expect } = require('chai'); -const dpnsContractDocumentsSchema = require('../../schema/dpns-contract-documents.json'); +const dpnsContractDocumentsSchema = require('../../schema/v1/dpns-contract-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index d7fc4fcabf7..1114df3030f 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/feature-flags-contract/schema/feature-flags-documents.json b/packages/feature-flags-contract/schema/v1/feature-flags-documents.json similarity index 100% rename from packages/feature-flags-contract/schema/feature-flags-documents.json rename to packages/feature-flags-contract/schema/v1/feature-flags-documents.json diff --git a/packages/feature-flags-contract/src/error.rs b/packages/feature-flags-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/feature-flags-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/feature-flags-contract/src/lib.rs b/packages/feature-flags-contract/src/lib.rs index 50264845dfc..a509ebc2e05 100644 --- a/packages/feature-flags-contract/src/lib.rs +++ b/packages/feature-flags-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -12,20 +16,26 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 154, 191, 43, 51, 101, 131, 190, 89, 135, 167, 21, ]; -pub mod document_types { - pub mod update_consensus_params { - pub const NAME: &str = "updateConsensusParams"; - - pub mod properties { - pub const PROPERTY_BLOCK_HEIGHT: &str = "height"; - pub const PROPERTY_ENABLE_AT_HEIGHT: &str = "enableAtHeight"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/feature-flags-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "feature_flags_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "feature_flags_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/feature-flags-contract/src/v1/mod.rs b/packages/feature-flags-contract/src/v1/mod.rs new file mode 100644 index 00000000000..43ccaf608a4 --- /dev/null +++ b/packages/feature-flags-contract/src/v1/mod.rs @@ -0,0 +1,18 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod update_consensus_params { + pub const NAME: &str = "updateConsensusParams"; + + pub mod properties { + pub const PROPERTY_BLOCK_HEIGHT: &str = "height"; + pub const PROPERTY_ENABLE_AT_HEIGHT: &str = "enableAtHeight"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/feature-flags-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js index f06deea8d41..217a5122b5d 100644 --- a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js +++ b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const featureFlagsContractDocumentsSchema = require('../../schema/feature-flags-documents.json'); +const featureFlagsContractDocumentsSchema = require('../../schema/v1/feature-flags-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 29a0bc18512..c2863a4a4e1 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json b/packages/masternode-reward-shares-contract/schema/v1/masternode-reward-shares-documents.json similarity index 100% rename from packages/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json rename to packages/masternode-reward-shares-contract/schema/v1/masternode-reward-shares-documents.json diff --git a/packages/masternode-reward-shares-contract/src/error.rs b/packages/masternode-reward-shares-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/masternode-reward-shares-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/masternode-reward-shares-contract/src/lib.rs b/packages/masternode-reward-shares-contract/src/lib.rs index 5d9a0fe4004..124f0e66278 100644 --- a/packages/masternode-reward-shares-contract/src/lib.rs +++ b/packages/masternode-reward-shares-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -15,19 +19,23 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub mod document_types { - pub mod reward_share { - pub const NAME: &str = "rewardShare"; - - pub mod properties { - pub const PAY_TO_ID: &str = "payToId"; - pub const PERCENTAGE: &str = "percentage"; - } +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 0 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "masternode_reward_shares_contract::load_definitions".to_string(), + known_versions: vec![0], + received: version, + }), } } - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!( - "../schema/masternode-reward-shares-documents.json" - )) +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "masternode_reward_shares_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/masternode-reward-shares-contract/src/v1/mod.rs b/packages/masternode-reward-shares-contract/src/v1/mod.rs new file mode 100644 index 00000000000..0af222aa0b7 --- /dev/null +++ b/packages/masternode-reward-shares-contract/src/v1/mod.rs @@ -0,0 +1,20 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod reward_share { + pub const NAME: &str = "rewardShare"; + + pub mod properties { + pub const PAY_TO_ID: &str = "payToId"; + pub const PERCENTAGE: &str = "percentage"; + } + } +} + +pub(super) fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!( + "../../schema/v1/masternode-reward-shares-documents.json" + )) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js index 704249bc68a..adac76bbe92 100644 --- a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js +++ b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const rewardSharingContractSchema = require('../../schema/masternode-reward-shares-documents.json'); +const rewardSharingContractSchema = require('../../schema/v1/masternode-reward-shares-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index 83536ce7b41..d6572b53db6 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -264,7 +264,7 @@ mod tests { #[test] fn test_contract_serialization() { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract(Dashpay, platform_version.protocol_version) + let data_contract = load_system_data_contract(Dashpay, platform_version) .expect("expected dashpay contract"); let platform_version = PlatformVersion::latest(); let serialized = data_contract diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index fe16af61183..393430ac621 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -410,8 +410,7 @@ mod test { fn test_document_json_deserialize() -> Result<()> { init(); let platform_version = PlatformVersion::latest(); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version)?; + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version)?; let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; let doc = ExtendedDocument::from_json_string(&document_json, dpns_contract, platform_version)?; @@ -489,11 +488,8 @@ mod test { #[test] fn test_to_object() { init(); - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - ) - .unwrap(); + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION).unwrap(); let document_json = get_data_from_file("src/tests/payloads/document_dpns.json").unwrap(); let document = ExtendedDocument::from_json_string( &document_json, @@ -517,10 +513,8 @@ mod test { fn test_json_serialize() -> Result<()> { init(); - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - )?; + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION)?; let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; let document = ExtendedDocument::from_json_string( &document_json, @@ -542,11 +536,8 @@ mod test { init(); let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - ) - .unwrap(); + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION).unwrap(); ExtendedDocument::from_json_string(&document_json, dpns_contract, LATEST_PLATFORM_VERSION) .expect("expected extended document"); Ok(()) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index c7b052160e2..87786d4a3ea 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -18,7 +18,7 @@ use crate::state_transition::StateTransitionFieldTypes; use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; -use data_contracts::withdrawals_contract::document_types::withdrawal::properties::OUTPUT_SCRIPT; +use data_contracts::withdrawals_contract::v1::document_types::withdrawal::properties::OUTPUT_SCRIPT; use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; diff --git a/packages/rs-dpp/src/system_data_contracts.rs b/packages/rs-dpp/src/system_data_contracts.rs index 7857cf112a1..3007df8bc41 100644 --- a/packages/rs-dpp/src/system_data_contracts.rs +++ b/packages/rs-dpp/src/system_data_contracts.rs @@ -5,18 +5,21 @@ use std::collections::{BTreeMap, BTreeSet}; use crate::data_contract::accessors::v0::DataContractV0Setters; pub use data_contracts::*; +use platform_version::version::PlatformVersion; fn create_data_contract( factory: &DataContractFactory, system_contract: SystemDataContract, + platform_version: &PlatformVersion, ) -> Result { let DataContractSource { id_bytes, owner_id_bytes, + version, definitions, document_schemas, } = system_contract - .source() + .source(platform_version) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let id = Identifier::from(id_bytes); @@ -30,29 +33,30 @@ fn create_data_contract( )?; data_contract.data_contract_mut().set_id(id); + data_contract.data_contract_mut().set_version(version); Ok(data_contract.data_contract_owned()) } pub fn load_system_data_contract( system_contract: SystemDataContract, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let factory = DataContractFactory::new(protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version, None)?; - create_data_contract(&factory, system_contract) + create_data_contract(&factory, system_contract, platform_version) } pub fn load_system_data_contracts( system_contracts: BTreeSet, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result, ProtocolError> { - let factory = DataContractFactory::new(protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version, None)?; system_contracts .into_iter() .map(|system_contract| { - let data_contract = create_data_contract(&factory, system_contract)?; + let data_contract = create_data_contract(&factory, system_contract, platform_version)?; Ok((system_contract, data_contract)) }) diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs index 078d486e86e..8f0866fe09b 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs @@ -5,6 +5,7 @@ use crate::{ use crate::data_contract::created_data_contract::CreatedDataContract; use data_contracts::SystemDataContract; +use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_fixture( owner_id: Option, @@ -12,8 +13,11 @@ pub fn get_dashpay_contract_fixture( ) -> CreatedDataContract { let factory = DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let dpns_schema = SystemDataContract::Dashpay - .source() + .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs index 61d3ac61732..9d58df2e70c 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs @@ -7,6 +7,7 @@ use crate::data_contract::config::v0::DataContractConfigV0; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use data_contracts::SystemDataContract; +use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( owner_id: Option, @@ -14,8 +15,11 @@ pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( ) -> CreatedDataContract { let factory = DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let dpns_schema = SystemDataContract::Dashpay - .source() + .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); diff --git a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs index 8af470b1487..ed44af2ffaf 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs @@ -198,7 +198,7 @@ pub fn get_withdrawal_document_fixture( }; let document_type = data_contract.document_type_for_name( - data_contracts::withdrawals_contract::document_types::withdrawal::NAME, + data_contracts::withdrawals_contract::v1::document_types::withdrawal::NAME, )?; let properties = data diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs index 46edce16604..77e14679737 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs @@ -1,4 +1,5 @@ use data_contracts::{DataContractSource, SystemDataContract}; +use platform_version::version::PlatformVersion; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::DataContractFactory; @@ -14,10 +15,13 @@ pub fn get_dpns_data_contract_fixture( let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); + let DataContractSource { document_schemas, .. } = SystemDataContract::DPNS - .source() + .source(platform_version) .expect("should return DPNS data contract source"); //Todo create config diff --git a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs index 66b50f6df10..b6f0ae7cefa 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs @@ -8,14 +8,19 @@ use crate::{ }; use data_contracts::SystemDataContract; use platform_value::platform_value; +use platform_version::version::PlatformVersion; pub fn get_masternode_reward_shares_documents_fixture( protocol_version: u32, ) -> (Vec, DataContract) { let owner_id = generate_random_identifier_struct(); let pay_to_id = generate_random_identifier_struct(); + + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); + let data_contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract"); let factory = DocumentFactory::new(protocol_version).expect("expected to make factory"); @@ -37,7 +42,9 @@ pub fn get_masternode_reward_shares_documents_fixture( } pub fn get_masternode_reward_shares_data_contract_fixture(protocol_version: u32) -> DataContract { - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract") } @@ -45,10 +52,12 @@ pub fn get_masternode_reward_shares_data_contract_fixture(protocol_version: u32) pub fn get_masternode_reward_shares_extended_documents_fixture( protocol_version: u32, ) -> (Vec, DataContract) { + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let owner_id = generate_random_identifier_struct(); let pay_to_id = generate_random_identifier_struct(); let data_contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract"); let factory = DocumentFactory::new(protocol_version).expect("expected to make factory"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs index 6dd0da06831..213b9ac0dad 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs @@ -20,11 +20,9 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> DataContract { - let contract = load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version.protocol_version, - ) - .expect("should load masternode reward contract"); + let contract = + load_system_data_contract(SystemDataContract::MasternodeRewards, &platform_version) + .expect("should load masternode reward contract"); let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index 6f84e0799f6..010c5e7f777 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -21,6 +21,7 @@ use dpp::version::PlatformVersion; use drive::drive::document::query::{QueryDocumentsOutcomeV0Methods}; use std::collections::BTreeMap; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::SystemDataContract; use crate::execution::platform_events::fee_pool_outwards_distribution::fetch_reward_shares_list_for_masternode::MN_REWARD_SHARES_DOCUMENT_TYPE; impl Platform { @@ -31,14 +32,15 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let document_type = self - .drive - .system_contracts - .masternode_rewards - .document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; + let cache = self.drive.cache.read().unwrap(); + + let masternode_rewards_contract = &cache.system_data_contracts.masternode_reward_shares; + + let document_type = + masternode_rewards_contract.document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; let drive_query = DriveQuery { - contract: &self.drive.system_contracts.masternode_rewards, + contract: masternode_rewards_contract, document_type, internal_clauses: InternalClauses { primary_key_in_clause: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs index 09b1c48c78f..e69975245d3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs @@ -9,7 +9,7 @@ use dashcore_rpc::dashcore::{ }; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::dpp::identifier::Identifier; use drive::dpp::identity::convert_credits_to_duffs; @@ -125,7 +125,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; use dpp::prelude::Identifier; @@ -148,11 +148,9 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs index f388172b268..8a218da798d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::document::{Document, DocumentV0Setters}; use dpp::version::PlatformVersion; use drive::dpp::system_data_contracts::withdrawals_contract; -use drive::dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use drive::dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::dpp::util::hash; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs index 5e17d00ffcc..5778cc00b95 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -10,7 +10,7 @@ use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; use drive::grovedb::Transaction; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_execution_context::BlockExecutionContext; @@ -221,11 +221,9 @@ mod tests { .into(), ); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs index 5a8c4e13e14..83d3cec0232 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs @@ -6,7 +6,7 @@ use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use std::collections::BTreeMap; @@ -220,7 +220,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; use dpp::{ @@ -358,11 +358,9 @@ mod tests { proposer_results: None, }; - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index ba2a1044d6b..8c034f320a6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -44,7 +44,7 @@ use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; use dpp::identity::IdentityV0; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; -use drive::dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use drive::dpp::system_data_contracts::SystemDataContract; use drive::drive::batch::{ DataContractOperationType, DocumentOperationType, DriveOperation, IdentityOperationType, }; @@ -81,24 +81,22 @@ impl Platform { // Create system identities and contracts - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version)?; + let cache = self.drive.cache.read().unwrap(); + + let dpns_data_contract = cache.system_data_contracts.dpns.clone(); let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, ( - dpns_contract.clone(), + cache.system_data_contracts.dpns.clone(), system_identity_public_keys.dpns_contract_owner(), ), ), ( SystemDataContract::Withdrawals, ( - load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - )?, + cache.system_data_contracts.withdrawals.clone(), system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -116,25 +114,21 @@ impl Platform { ( SystemDataContract::Dashpay, ( - load_system_data_contract( - SystemDataContract::Dashpay, - platform_version.protocol_version, - )?, + cache.system_data_contracts.dashpay.clone(), system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version.protocol_version, - )?, + cache.system_data_contracts.masternode_reward_shares.clone(), system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), ]); + drop(cache); + for (_, (data_contract, identity_public_keys_set)) in system_data_contract_types { let public_keys = [ ( @@ -184,7 +178,7 @@ impl Platform { self.register_system_identity_operations(identity, &mut operations); } - self.register_dpns_top_level_domain_operations(&dpns_contract, &mut operations)?; + self.register_dpns_top_level_domain_operations(&dpns_data_contract, &mut operations)?; let block_info = BlockInfo::default_with_time(genesis_time); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index d4498a54241..954ce1f2ff9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -7,8 +7,8 @@ use crate::execution::validation::state_transition::documents_batch::data_trigge use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; use dpp::errors::ProtocolError; -use dpp::system_data_contracts::feature_flags_contract::document_types::update_consensus_params; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{dashpay_contract, dpns_contract, SystemDataContract}; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 61da179ca6f..feab7c074c8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -10,7 +10,8 @@ use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::dashpay_contract::document_types::contact_request::properties::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; +use dpp::system_data_contracts::dashpay_contract::v1::document_types::contact_request::properties +::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index c4a0ab9ae70..419f9b1c9f5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -1,6 +1,6 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::dpns_contract::document_types::domain::properties::PARENT_DOMAIN_NAME; +use dpp::data_contracts::dpns_contract::v1::document_types::domain::properties::PARENT_DOMAIN_NAME; ///! The `dpns_triggers` module contains data triggers specific to the DPNS data contract. use dpp::util::hash::hash; use std::collections::BTreeMap; @@ -19,7 +19,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::dpns_contract; -use dpp::system_data_contracts::dpns_contract::document_types::domain::properties::{ALLOW_SUBDOMAINS, DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; +use dpp::system_data_contracts::dpns_contract::v1::document_types::domain::properties::{ALLOW_SUBDOMAINS, + DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; use dpp::util::strings::convert_to_homograph_safe_chars; use dpp::version::PlatformVersion; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 6300fdcc57a..5d559cab7d3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -10,7 +10,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::feature_flags_contract; -use dpp::system_data_contracts::feature_flags_contract::document_types::update_consensus_params::properties::PROPERTY_ENABLE_AT_HEIGHT; +use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params::properties +::PROPERTY_ENABLE_AT_HEIGHT; use dpp::version::PlatformVersion; use super::{DataTriggerExecutionContext, DataTriggerExecutionResult}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs index 78c48f1e905..5fd7a63aa79 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs @@ -12,7 +12,8 @@ use dpp::document::DocumentV0Getters; use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::document_types::reward_share::properties::{PAY_TO_ID, PERCENTAGE}; +use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types::reward_share::properties +::{PAY_TO_ID, PERCENTAGE}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::error::execution::ExecutionError; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 466f0154fdf..3e6e7937a7c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -15,7 +15,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::DocumentV0Getters; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; @@ -202,11 +202,9 @@ mod tests { fn can_serialize_and_deserialize_withdrawal() { let platform_version = PlatformVersion::first(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); let owner_id = data_contract.owner_id(); let document_type = data_contract @@ -257,11 +255,9 @@ mod tests { .current_platform_version() .expect("should return a platform version"); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); let owner_id = data_contract.owner_id(); let document_type = data_contract diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index dec4bc0a6e5..40c71f7e4ce 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -372,7 +372,7 @@ mod test { let path = tempdir.join("db"); fs::create_dir(&path).expect("create db dir"); - let drive = Drive::open(&path, None).expect("open drive"); + let (drive, _) = Drive::open(&path, None).expect("open drive"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index 54c9f8cea4b..4ab7ecfe28c 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -7,7 +7,7 @@ use std::fmt::{Debug, Formatter}; #[cfg(any(feature = "mocks", test))] use crate::rpc::core::MockCoreRPCLike; -use drive::drive::defaults::PROTOCOL_VERSION; +use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; use std::path::Path; use std::str::FromStr; use std::sync::RwLock; @@ -176,9 +176,10 @@ impl Platform { { let config = config.unwrap_or(PlatformConfig::default_testnet()); - let drive = Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; + let (drive, current_protocol_version) = + Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; - if let Some(protocol_version) = drive.fetch_current_protocol_version(None)? { + if let Some(protocol_version) = current_protocol_version { let platform_version = PlatformVersion::get(protocol_version)?; let Some(execution_state) = @@ -201,8 +202,8 @@ impl Platform { drive, core_rpc, config, - PROTOCOL_VERSION, - PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, ) } diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index ea323d94c82..d54805b3326 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -47,7 +47,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::document::{DocumentV0, INITIAL_REVISION}; use dpp::identity::accessors::IdentityGettersV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::document_types; +use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types; use dpp::version::PlatformVersion; use drive::common::identities::create_test_identity_with_rng; use drive::dpp::document::Document; diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 52fd3d1ef64..bf8df7f8a4a 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -18,6 +18,7 @@ mod tests { use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, }; + use dpp::data_contracts::SystemDataContract; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::Value; use dpp::prelude::Identity; @@ -256,8 +257,24 @@ mod tests { platform_version, ); + let cache = platform + .drive + .cache + .read() + .expect("expected to get a read lock on the cache"); + + let dpns_contract = cache.system_data_contracts.dpns.clone(); + + drop(cache); + + let dpns_contract_for_type = dpns_contract.clone(); + + let domain_document_type_ref = dpns_contract_for_type + .document_type_for_name("domain") + .expect("expected a profile document type"); + let document_op_1 = DocumentOp { - contract: platform.drive.system_contracts.dpns_contract.clone(), + contract: dpns_contract.clone(), action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -276,17 +293,11 @@ mod tests { DocumentFieldFillType::FillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, ), - document_type: platform - .drive - .system_contracts - .dpns_contract - .document_type_for_name("domain") - .expect("expected a profile document type") - .to_owned_document_type(), + document_type: domain_document_type_ref.to_owned_document_type(), }; let document_op_2 = DocumentOp { - contract: platform.drive.system_contracts.dpns_contract.clone(), + contract: dpns_contract, action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -305,13 +316,7 @@ mod tests { DocumentFieldFillType::FillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, ), - document_type: platform - .drive - .system_contracts - .dpns_contract - .document_type_for_name("domain") - .expect("expected a profile document type") - .to_owned_document_type(), + document_type: domain_document_type_ref.to_owned_document_type(), }; let strategy = NetworkStrategy { diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 4fd13a99cc6..b5fc6a27725 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -14,8 +14,9 @@ use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; use dpp::prelude::Identifier; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::data_contracts::SystemDataContract; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -247,7 +248,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { DocumentOperationType::AddWithdrawalDocument { owned_document_info, } => { - let contract = &drive.system_contracts.withdrawal_contract; + let cache = drive.cache.read().expect("should get cache lock"); + + let contract = &cache.system_data_contracts.withdrawals; let document_type = contract.document_type_for_name(withdrawal::NAME)?; diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 8e15643bfbe..66390089017 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,3 +1,4 @@ +pub use crate::drive::cache::system_contracts_cache::SystemDataContracts; #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::contract::DataContractFetchInfo; use crate::drive::Drive; @@ -16,6 +17,9 @@ use platform_version::version::drive_versions::DriveVersion; #[cfg(any(feature = "full", feature = "verify"))] use std::sync::Arc; +#[cfg(feature = "full")] +mod system_contracts_cache; + /// Drive cache struct #[cfg(feature = "full")] pub struct DriveCache { @@ -25,6 +29,8 @@ pub struct DriveCache { pub genesis_time_ms: Option, /// Lazy loaded counter of votes to upgrade protocol version pub protocol_versions_counter: ProtocolVersionsCache, + /// Versioned system data contracts + pub system_data_contracts: SystemDataContracts, } /// ProtocolVersion cache that handles both global and block data diff --git a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs new file mode 100644 index 00000000000..d9a4af3288d --- /dev/null +++ b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs @@ -0,0 +1,36 @@ +use crate::error::Error; +use dpp::data_contract::DataContract; +use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use platform_version::version::PlatformVersion; + +/// System contracts +pub struct SystemDataContracts { + /// Withdrawal contract + pub withdrawals: DataContract, + /// DPNS contract + pub dpns: DataContract, + /// Dashpay contract + pub dashpay: DataContract, + /// Masternode reward shares contract + pub masternode_reward_shares: DataContract, +} + +impl SystemDataContracts { + /// load genesis system contracts + pub fn load_genesis_system_contracts( + platform_version: &PlatformVersion, + ) -> Result { + Ok(Self { + withdrawals: load_system_data_contract( + SystemDataContract::Withdrawals, + platform_version, + )?, + dpns: load_system_data_contract(SystemDataContract::DPNS, platform_version)?, + dashpay: load_system_data_contract(SystemDataContract::Dashpay, platform_version)?, + masternode_reward_shares: load_system_data_contract( + SystemDataContract::MasternodeRewards, + platform_version, + )?, + }) + } +} diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 3565b1ccc66..42d865b78f4 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -10,6 +10,7 @@ use dpp::tests::fixtures::get_dpns_data_contract_fixture; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_masternode_reward_shares_data_contract_fixture; use grovedb_costs::OperationCost; +use platform_version::version::PlatformVersion; #[cfg(any(feature = "full", feature = "verify"))] /// DataContract and fetch information @@ -65,11 +66,15 @@ impl DataContractFetchInfo { /// This should ONLY be used for tests pub fn withdrawals_contract_fixture(protocol_version: u32) -> Self { + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get version"); + let contract = load_system_data_contract( data_contracts::SystemDataContract::Withdrawals, - protocol_version, + platform_version, ) .expect("to load system data contract"); + DataContractFetchInfo { contract, storage_flags: None, diff --git a/packages/rs-drive/src/drive/defaults.rs b/packages/rs-drive/src/drive/defaults.rs index 3440843d64f..8dc5e8385b2 100644 --- a/packages/rs-drive/src/drive/defaults.rs +++ b/packages/rs-drive/src/drive/defaults.rs @@ -33,7 +33,7 @@ //! /// Protocol version -pub const PROTOCOL_VERSION: u32 = 1; +pub const INITIAL_PROTOCOL_VERSION: u32 = 1; ///DataContract Documents subtree path height pub const CONTRACT_DOCUMENTS_PATH_HEIGHT: u16 = 4; /// Base contract root path size diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index a43971fef05..8f88c41c9a6 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -119,7 +119,7 @@ mod tests { fn test_add_and_remove_family_one_document_no_transaction() { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs index 52ffe87fa4c..998e3c296fe 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs @@ -5,7 +5,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::Document; use dpp::platform_value::Value; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use grovedb::TransactionArg; use indexmap::IndexMap; @@ -193,7 +193,7 @@ mod tests { use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -206,11 +206,9 @@ mod tests { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); setup_system_data_contract(&drive, &data_contract, Some(&transaction)); @@ -305,7 +303,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::{platform_value, Bytes32}; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -320,11 +318,9 @@ mod tests { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); setup_system_data_contract(&drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index d7fbda7eee8..f89315e59e1 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -96,8 +96,6 @@ mod operations; mod platform_state; #[cfg(feature = "full")] mod prove; -#[cfg(feature = "full")] -mod system_contracts_cache; /// Contains a set of useful grovedb proof verification functions #[cfg(any(feature = "full", feature = "verify"))] pub mod verify; @@ -105,9 +103,6 @@ pub mod verify; #[cfg(feature = "full")] use crate::drive::cache::DriveCache; -#[cfg(feature = "full")] -use crate::drive::system_contracts_cache::SystemContracts; - /// Drive struct #[cfg(any(feature = "full", feature = "verify"))] pub struct Drive { @@ -115,9 +110,6 @@ pub struct Drive { pub grove: GroveDb, /// Drive config pub config: DriveConfig, - /// Main contracts in the system - #[cfg(feature = "full")] - pub system_contracts: SystemContracts, /// Drive Cache #[cfg(feature = "full")] pub cache: RwLock, diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index 3c5cb661924..457b88f4e70 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -1,8 +1,11 @@ +use crate::drive::cache::SystemDataContracts; use crate::drive::cache::{DataContractCache, DriveCache, ProtocolVersionsCache}; use crate::drive::config::DriveConfig; -use crate::drive::system_contracts_cache::SystemContracts; +use crate::drive::defaults::INITIAL_PROTOCOL_VERSION; use crate::drive::Drive; use crate::error::Error; +use dpp::errors::ProtocolError; +use dpp::util::deserializer::ProtocolVersion; use grovedb::GroveDb; use platform_version::version::PlatformVersion; use std::path::Path; @@ -24,7 +27,10 @@ impl Drive { /// /// * `Result` - On success, returns `Ok(Self)`, where `Self` is a `Drive` instance. On error, returns an `Error`. /// - pub fn open>(path: P, config: Option) -> Result { + pub fn open>( + path: P, + config: Option, + ) -> Result<(Self, Option), Error> { match GroveDb::open(path) { Ok(grove) => { let config = config.unwrap_or_default(); @@ -32,12 +38,16 @@ impl Drive { let data_contracts_global_cache_size = config.data_contracts_global_cache_size; let data_contracts_block_cache_size = config.data_contracts_block_cache_size; + let protocol_version = + Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + + let platform_version = + PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) + .map_err(ProtocolError::PlatformVersionError)?; + let drive = Drive { grove, config, - system_contracts: SystemContracts::load_genesis_system_contracts( - 1, // TODO: Will be fixed in #1676 - )?, cache: RwLock::new(DriveCache { cached_contracts: DataContractCache::new( data_contracts_global_cache_size, @@ -45,10 +55,13 @@ impl Drive { ), genesis_time_ms, protocol_versions_counter: ProtocolVersionsCache::new(), + system_data_contracts: SystemDataContracts::load_genesis_system_contracts( + platform_version, + )?, }), }; - Ok(drive) + Ok((drive, protocol_version)) } Err(e) => Err(Error::GroveDB(e)), } diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs index 2a38de6766d..fbd2e81b45a 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs @@ -5,7 +5,7 @@ use crate::error::Error; use crate::drive::system::misc_path; use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; use dpp::util::deserializer::ProtocolVersion; -use grovedb::TransactionArg; +use grovedb::{GroveDb, TransactionArg}; use integer_encoding::VarInt; /// @@ -33,9 +33,16 @@ impl Drive { pub fn fetch_current_protocol_version( &self, transaction: TransactionArg, + ) -> Result, Error> { + Drive::fetch_current_protocol_version_with_grovedb(&self.grove, transaction) + } + + pub(crate) fn fetch_current_protocol_version_with_grovedb( + grove: &GroveDb, + transaction: TransactionArg, ) -> Result, Error> { let misc_path = misc_path(); - self.grove + grove .get_raw_optional( (&misc_path).into(), PROTOCOL_VERSION_STORAGE_KEY, diff --git a/packages/rs-drive/src/drive/system_contracts_cache.rs b/packages/rs-drive/src/drive/system_contracts_cache.rs deleted file mode 100644 index 71e95262445..00000000000 --- a/packages/rs-drive/src/drive/system_contracts_cache.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::error::Error; -use dpp::data_contract::DataContract; -use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; - -/// System contracts -pub struct SystemContracts { - /// Withdrawal contract - pub withdrawal_contract: DataContract, - /// DPNS contract - pub dpns_contract: DataContract, - /// Dashpay contract - pub dashpay_contract: DataContract, - /// Masternode reward shares contract - pub masternode_rewards: DataContract, -} - -impl SystemContracts { - /// load genesis system contracts - pub fn load_genesis_system_contracts(protocol_version: u32) -> Result { - Ok(SystemContracts { - withdrawal_contract: load_system_data_contract( - SystemDataContract::Withdrawals, - protocol_version, - )?, - dpns_contract: load_system_data_contract(SystemDataContract::DPNS, protocol_version)?, - dashpay_contract: load_system_data_contract( - SystemDataContract::Dashpay, - protocol_version, - )?, - masternode_rewards: load_system_data_contract( - SystemDataContract::MasternodeRewards, - protocol_version, - )?, - }) - } -} diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 7217e72c101..0529cedbe32 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1974,7 +1974,7 @@ mod tests { fn setup_family_contract() -> (Drive, DataContract) { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 0d3b41099de..9cebee40643 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -1,6 +1,6 @@ use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; use dpp::data_contracts::withdrawals_contract; -use dpp::data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::{Document, DocumentV0}; use dpp::platform_value::platform_value; use dpp::state_transition::state_transitions::identity::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; diff --git a/packages/rs-drive/src/tests/helpers/setup.rs b/packages/rs-drive/src/tests/helpers/setup.rs index a62e55de431..7eaacc586f1 100644 --- a/packages/rs-drive/src/tests/helpers/setup.rs +++ b/packages/rs-drive/src/tests/helpers/setup.rs @@ -65,7 +65,7 @@ impl Default for SetupFeePoolsOptions { pub fn setup_drive(drive_config: Option) -> Drive { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); drive } diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index b0856635f7e..0eb4c39d5fd 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -426,9 +426,8 @@ fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { "e34e316e84c4639f44c512c5e602ee7d674d33ce69f02237de87af5f6151cdf6" ); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version) - .expect("should load dpns contract"); + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("should load dpns contract"); drive .apply_contract( diff --git a/packages/rs-platform-version/src/version/contracts.rs b/packages/rs-platform-version/src/version/contracts.rs new file mode 100644 index 00000000000..84c0d874b1d --- /dev/null +++ b/packages/rs-platform-version/src/version/contracts.rs @@ -0,0 +1,10 @@ +use crate::version::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct SystemDataContractVersions { + pub withdrawals: FeatureVersion, + pub dpns: FeatureVersion, + pub dashpay: FeatureVersion, + pub masternode_reward_shares: FeatureVersion, + pub feature_flags: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index bef04b0d407..a9fb7d79d40 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -922,4 +923,11 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 19ed1497bbf..432e417dbfa 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -922,4 +923,11 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 040c413e509..486f8db5fff 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,6 @@ mod protocol_version; pub use protocol_version::*; +pub mod contracts; pub mod dpp_versions; pub mod drive_abci_versions; pub mod drive_versions; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index e6577486066..2b6763aee6c 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -1,4 +1,5 @@ use crate::error::PlatformVersionError; +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::DriveVersion; @@ -48,6 +49,7 @@ pub struct PlatformVersion { pub drive_abci: DriveAbciVersion, pub abci_structure: AbciStructureVersion, pub platform_architecture: PlatformArchitectureVersion, + pub system_data_contracts: SystemDataContractVersions, } pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[PLATFORM_V1]; diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index e7122638dca..758332ee62c 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -919,4 +920,11 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 6dd9010f5c7..cc4d7e956e6 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -168,15 +168,11 @@ impl Config { } fn default_identity_id() -> Identifier { - data_contracts::SystemDataContract::DPNS - .source() - .expect("data contract source") - .owner_id_bytes - .into() + data_contracts::dpns_contract::OWNER_ID_BYTES.into() } fn default_data_contract_id() -> Identifier { - data_contracts::SystemDataContract::DPNS.id() + data_contracts::dpns_contract::ID_BYTES.into() } fn default_document_type_name() -> String { diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index d6deff5afa0..d48daf02d69 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1191,9 +1191,8 @@ mod tests { platform_version, ); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version) - .expect("data contract"); + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("data contract"); let document_op_1 = DocumentOp { contract: dpns_contract.clone(), diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index c0e4c43fa90..61d4b0dae5e 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -7,6 +7,8 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } platform-value = { path = "../rs-platform-value" } num_enum = "0.5.7" serde = { version = "1.0.152", features = ["derive"] } diff --git a/packages/withdrawals-contract/schema/withdrawals-documents.json b/packages/withdrawals-contract/schema/v1/withdrawals-documents.json similarity index 100% rename from packages/withdrawals-contract/schema/withdrawals-documents.json rename to packages/withdrawals-contract/schema/v1/withdrawals-documents.json diff --git a/packages/withdrawals-contract/src/error.rs b/packages/withdrawals-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/withdrawals-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/withdrawals-contract/src/lib.rs b/packages/withdrawals-contract/src/lib.rs index f041acc820d..acb8703c54b 100644 --- a/packages/withdrawals-contract/src/lib.rs +++ b/packages/withdrawals-contract/src/lib.rs @@ -1,28 +1,25 @@ +pub use crate::error::Error; use num_enum::{IntoPrimitive, TryFromPrimitive}; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; use serde_repr::{Deserialize_repr, Serialize_repr}; -pub mod document_types { - pub mod withdrawal { - pub const NAME: &str = "withdrawal"; +mod error; +pub mod v1; - pub mod properties { - pub const TRANSACTION_ID: &str = "transactionId"; - pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; - pub const TRANSACTION_INDEX: &str = "transactionIndex"; - pub const AMOUNT: &str = "amount"; - pub const CORE_FEE_PER_BYTE: &str = "coreFeePerByte"; - pub const POOLING: &str = "pooling"; - pub const OUTPUT_SCRIPT: &str = "outputScript"; - pub const STATUS: &str = "status"; - pub const CREATED_AT: &str = "$createdAt"; - pub const UPDATED_AT: &str = "$updatedAt"; - pub const OWNER_ID: &str = "$ownerId"; - } - } -} +pub const ID_BYTES: [u8; 32] = [ + 54, 98, 187, 97, 225, 127, 174, 62, 162, 148, 207, 96, 49, 151, 251, 10, 171, 109, 81, 24, 11, + 216, 182, 16, 76, 73, 68, 166, 47, 226, 217, 127, +]; + +pub const OWNER_ID_BYTES: [u8; 32] = [ + 170, 138, 235, 213, 173, 122, 202, 36, 243, 48, 61, 185, 146, 50, 146, 255, 194, 133, 221, 176, + 188, 82, 144, 69, 234, 198, 106, 35, 245, 167, 46, 192, +]; + +pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); +pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); // @append_only #[repr(u8)] @@ -45,19 +42,23 @@ pub enum WithdrawalStatus { EXPIRED = 4, } -pub const ID_BYTES: [u8; 32] = [ - 54, 98, 187, 97, 225, 127, 174, 62, 162, 148, 207, 96, 49, 151, 251, 10, 171, 109, 81, 24, 11, - 216, 182, 16, 76, 73, 68, 166, 47, 226, 217, 127, -]; - -pub const OWNER_ID_BYTES: [u8; 32] = [ - 170, 138, 235, 213, 173, 122, 202, 36, 243, 48, 61, 185, 146, 50, 146, 255, 194, 133, 221, 176, - 188, 82, 144, 69, 234, 198, 106, 35, 245, 167, 46, 192, -]; - -pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); -pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/withdrawals-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "withdrawals_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "withdrawals_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/withdrawals-contract/src/v1/mod.rs b/packages/withdrawals-contract/src/v1/mod.rs new file mode 100644 index 00000000000..df86928bb1e --- /dev/null +++ b/packages/withdrawals-contract/src/v1/mod.rs @@ -0,0 +1,27 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod withdrawal { + pub const NAME: &str = "withdrawal"; + + pub mod properties { + pub const TRANSACTION_ID: &str = "transactionId"; + pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; + pub const TRANSACTION_INDEX: &str = "transactionIndex"; + pub const AMOUNT: &str = "amount"; + pub const CORE_FEE_PER_BYTE: &str = "coreFeePerByte"; + pub const POOLING: &str = "pooling"; + pub const OUTPUT_SCRIPT: &str = "outputScript"; + pub const STATUS: &str = "status"; + pub const CREATED_AT: &str = "$createdAt"; + pub const UPDATED_AT: &str = "$updatedAt"; + pub const OWNER_ID: &str = "$ownerId"; + } + } +} + +pub(super) fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/withdrawals-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js index 61c8c064516..7f1d638a0cd 100644 --- a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js +++ b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const withdrawalContractDocumentsSchema = require('../../schema/withdrawals-documents.json'); +const withdrawalContractDocumentsSchema = require('../../schema/v1/withdrawals-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors();