dpp/data_contract/methods/validate_groups/mod.rs
1use crate::data_contract::group::Group;
2use crate::data_contract::GroupContractPosition;
3use crate::prelude::DataContract;
4use platform_version::version::PlatformVersion;
5use std::collections::BTreeMap;
6
7mod v0;
8use crate::validation::SimpleConsensusValidationResult;
9use crate::ProtocolError;
10
11impl DataContract {
12 /// Validates the provided groups to ensure they meet the requirements for data contracts.
13 ///
14 /// # Parameters
15 /// - `groups`: A reference to a `BTreeMap` of group contract positions (`GroupContractPosition`)
16 /// mapped to their corresponding `Group` objects. These represent the groups associated with
17 /// the data contract.
18 /// - `platform_version`: A reference to the [`PlatformVersion`](crate::version::PlatformVersion)
19 /// object specifying the version of the platform and determining which validation method to use.
20 ///
21 /// # Returns
22 /// - `Ok(SimpleConsensusValidationResult)` if all the groups pass validation:
23 /// - Group contract positions must be contiguous, i.e., no gaps between positions.
24 /// - Each group must meet its individual validation criteria.
25 /// - `Err(ProtocolError)` if:
26 /// - An unknown or unsupported platform version is provided.
27 /// - Validation of any group fails.
28 ///
29 /// # Behavior
30 /// - Delegates the actual validation logic to the appropriate versioned implementation
31 /// (`validate_groups_v0`) based on the provided platform version.
32 /// - If an unknown platform version is encountered, a `ProtocolError::UnknownVersionMismatch`
33 /// is returned.
34 ///
35 /// # Errors
36 /// - Returns a `ProtocolError::UnknownVersionMismatch` if the platform version is not recognized.
37 /// - Returns validation errors for:
38 /// - Non-contiguous group contract positions (`NonContiguousContractGroupPositionsError`).
39 /// - Invalid individual group configurations (e.g., power-related errors or exceeding member limits).
40 pub fn validate_groups(
41 groups: &BTreeMap<GroupContractPosition, Group>,
42 platform_version: &PlatformVersion,
43 ) -> Result<SimpleConsensusValidationResult, ProtocolError> {
44 match platform_version
45 .dpp
46 .contract_versions
47 .methods
48 .validate_groups
49 {
50 0 => Self::validate_groups_v0(groups, platform_version),
51 version => Err(ProtocolError::UnknownVersionMismatch {
52 method: "DataContract::validate_groups".to_string(),
53 known_versions: vec![0],
54 received: version,
55 }),
56 }
57 }
58}