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}