Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ mod v0;
mod v1;

use crate::data_contract::config::DataContractConfig;
use crate::data_contract::document_type::v0::DocumentTypeV0;
use crate::data_contract::document_type::DocumentType;
use crate::data_contract::DocumentName;
use crate::data_contract::{DocumentName, TokenConfiguration, TokenContractPosition};
use crate::validation::operations::ProtocolValidationOperation;
use crate::version::PlatformVersion;
use crate::ProtocolError;
Expand Down Expand Up @@ -40,6 +39,7 @@ impl DocumentType {
data_contract_id: Identifier,
document_schemas: BTreeMap<DocumentName, Value>,
schema_defs: Option<&BTreeMap<String, Value>>,
token_configurations: &BTreeMap<TokenContractPosition, TokenConfiguration>,
data_contact_config: &DataContractConfig,
full_validation: bool,
has_tokens: bool,
Expand All @@ -53,20 +53,22 @@ impl DocumentType {
.class_method_versions
.create_document_types_from_document_schemas
{
0 => DocumentTypeV0::create_document_types_from_document_schemas_v0(
0 => DocumentType::create_document_types_from_document_schemas_v0(
data_contract_id,
document_schemas,
schema_defs,
token_configurations,
data_contact_config,
full_validation,
validation_operations,
platform_version,
),
// in v1 we add the ability to have contracts without documents and just tokens
1 => DocumentTypeV0::create_document_types_from_document_schemas_v1(
1 => DocumentType::create_document_types_from_document_schemas_v1(
data_contract_id,
document_schemas,
schema_defs,
token_configurations,
data_contact_config,
full_validation,
has_tokens,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
use crate::consensus::basic::data_contract::DocumentTypesAreMissingError;
use crate::data_contract::config::DataContractConfig;
use crate::data_contract::document_type::class_methods::consensus_or_protocol_data_contract_error;
use crate::data_contract::document_type::v0::DocumentTypeV0;
use crate::data_contract::document_type::DocumentType;
use crate::data_contract::DocumentName;
use crate::data_contract::{DocumentName, TokenConfiguration, TokenContractPosition};
use crate::validation::operations::ProtocolValidationOperation;
use crate::version::PlatformVersion;
use crate::ProtocolError;
use platform_value::{Identifier, Value};
use std::collections::BTreeMap;

impl DocumentTypeV0 {
impl DocumentType {
pub(in crate::data_contract) fn create_document_types_from_document_schemas_v0(
data_contract_id: Identifier,
document_schemas: BTreeMap<DocumentName, Value>,
schema_defs: Option<&BTreeMap<String, Value>>,
token_configurations: &BTreeMap<TokenContractPosition, TokenConfiguration>,
data_contact_config: &DataContractConfig,
full_validation: bool,
validation_operations: &mut Vec<ProtocolValidationOperation>,
platform_version: &PlatformVersion,
) -> Result<BTreeMap<String, DocumentType>, ProtocolError> {

Check failure on line 22 in packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dpp) / Linting

this function has too many arguments (8/7)

error: this function has too many arguments (8/7) --> packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs:13:5 | 13 | / pub(in crate::data_contract) fn create_document_types_from_document_schemas_v0( 14 | | data_contract_id: Identifier, 15 | | document_schemas: BTreeMap<DocumentName, Value>, 16 | | schema_defs: Option<&BTreeMap<String, Value>>, ... | 21 | | platform_version: &PlatformVersion, 22 | | ) -> Result<BTreeMap<String, DocumentType>, ProtocolError> { | |______________________________________________________________^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#too_many_arguments = note: `-D clippy::too-many-arguments` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::too_many_arguments)]`
let mut contract_document_types: BTreeMap<String, DocumentType> = BTreeMap::new();

if document_schemas.is_empty() {
Expand All @@ -40,6 +40,7 @@
&name,
schema,
schema_defs,
token_configurations,
data_contact_config,
full_validation,
validation_operations,
Expand Down Expand Up @@ -84,6 +85,7 @@
id,
Default::default(),
None,
&BTreeMap::new(),
&config,
false,
false,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
use crate::consensus::basic::data_contract::DocumentTypesAreMissingError;
use crate::data_contract::config::DataContractConfig;
use crate::data_contract::document_type::class_methods::consensus_or_protocol_data_contract_error;
use crate::data_contract::document_type::v0::DocumentTypeV0;
use crate::data_contract::document_type::DocumentType;
use crate::data_contract::DocumentName;
use crate::data_contract::{DocumentName, TokenConfiguration, TokenContractPosition};
use crate::validation::operations::ProtocolValidationOperation;
use crate::version::PlatformVersion;
use crate::ProtocolError;
use platform_value::{Identifier, Value};
use std::collections::BTreeMap;

impl DocumentTypeV0 {
impl DocumentType {
#[allow(clippy::too_many_arguments)]
pub(in crate::data_contract) fn create_document_types_from_document_schemas_v1(
data_contract_id: Identifier,
document_schemas: BTreeMap<DocumentName, Value>,
schema_defs: Option<&BTreeMap<String, Value>>,
token_configurations: &BTreeMap<TokenContractPosition, TokenConfiguration>,
data_contact_config: &DataContractConfig,
full_validation: bool,
has_tokens: bool,
Expand All @@ -42,6 +42,7 @@ impl DocumentTypeV0 {
&name,
schema,
schema_defs,
token_configurations,
data_contact_config,
full_validation,
validation_operations,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::data_contract::document_type::{
property_names, DocumentProperty, DocumentPropertyType, DocumentType,
};
use crate::data_contract::errors::DataContractError;
use crate::data_contract::{TokenConfiguration, TokenContractPosition};
use crate::util::json_schema::resolve_uri;
use crate::validation::operations::ProtocolValidationOperation;
use crate::ProtocolError;
Expand Down Expand Up @@ -42,6 +43,7 @@ impl DocumentType {
name: &str,
schema: Value,
schema_defs: Option<&BTreeMap<String, Value>>,
token_configurations: &BTreeMap<TokenContractPosition, TokenConfiguration>,
data_contact_config: &DataContractConfig,
full_validation: bool,
validation_operations: &mut Vec<ProtocolValidationOperation>,
Expand Down Expand Up @@ -70,6 +72,7 @@ impl DocumentType {
name,
schema,
schema_defs,
token_configurations,
data_contact_config,
full_validation,
validation_operations,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
use crate::consensus::basic::data_contract::TokenPaymentByBurningOnlyAllowedOnInternalTokenError;
#[cfg(feature = "validation")]
use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError;
use crate::consensus::basic::token::InvalidTokenPositionError;

Check warning on line 35 in packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v1/mod.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

unused import: `crate::consensus::basic::token::InvalidTokenPositionError`

warning: unused import: `crate::consensus::basic::token::InvalidTokenPositionError` --> packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v1/mod.rs:35:5 | 35 | use crate::consensus::basic::token::InvalidTokenPositionError; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default
#[cfg(feature = "validation")]
use crate::consensus::basic::BasicError;
use crate::data_contract::config::v0::DataContractConfigGettersV0;
Expand All @@ -56,7 +57,7 @@
use crate::data_contract::document_type::{property_names, DocumentType};
use crate::data_contract::errors::DataContractError;
use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements;
use crate::data_contract::TokenContractPosition;
use crate::data_contract::{TokenConfiguration, TokenContractPosition};
use crate::identity::SecurityLevel;
use crate::tokens::gas_fees_paid_by::GasFeesPaidBy;
use crate::tokens::token_amount_on_contract_token::{
Expand All @@ -78,6 +79,7 @@
name: &str,
schema: Value,
schema_defs: Option<&BTreeMap<String, Value>>,
token_configurations: &BTreeMap<TokenContractPosition, TokenConfiguration>,
data_contact_config: &DataContractConfig,
full_validation: bool, // we don't need to validate if loaded from state
validation_operations: &mut Vec<ProtocolValidationOperation>,
Expand Down Expand Up @@ -577,6 +579,19 @@

#[cfg(feature = "validation")]
if full_validation {
if !token_configurations.contains_key(&token_contract_position) {
return Err(ProtocolError::ConsensusError(
ConsensusError::BasicError(
BasicError::InvalidTokenPositionError(
InvalidTokenPositionError::new(
token_configurations.last_key_value().map(|(position, _)| *position),
token_contract_position,
),
),
)
.into(),
));
}

// If contractId is present and user tries to burn, bail out:
if let Some(contract_id) = contract_id {
Expand Down Expand Up @@ -686,6 +701,7 @@
"valid_name-a-b-123",
schema,
None,
&BTreeMap::new(),
&config,
true,
&mut vec![],
Expand Down Expand Up @@ -717,6 +733,7 @@
"",
schema,
None,
&BTreeMap::new(),
&config,
true,
&mut vec![],
Expand Down Expand Up @@ -759,6 +776,7 @@
&"a".repeat(65),
schema,
None,
&BTreeMap::new(),
&config,
true,
&mut vec![],
Expand Down Expand Up @@ -827,6 +845,7 @@
"invalid&name",
schema,
None,
&BTreeMap::new(),
&config,
true,
&mut vec![],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use crate::data_contract::{
use crate::version::PlatformVersion;
use std::collections::BTreeMap;

use super::EMPTY_KEYWORDS;
use crate::data_contract::associated_token::token_configuration::TokenConfiguration;
use crate::data_contract::group::Group;
use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1;
Expand All @@ -21,8 +22,6 @@ use platform_versioning::PlatformVersioned;
#[cfg(feature = "data-contract-serde-conversion")]
use serde::{Deserialize, Serialize};

use super::EMPTY_KEYWORDS;

pub(in crate::data_contract) mod v0;
pub(in crate::data_contract) mod v1;

Expand Down
2 changes: 2 additions & 0 deletions packages/rs-dpp/src/data_contract/v0/methods/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 {
self.id,
schemas,
defs.as_ref(),
&BTreeMap::new(),
&self.config,
full_validation,
false,
Expand All @@ -45,6 +46,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 {
name,
schema,
self.schema_defs.as_ref(),
&BTreeMap::new(),
&self.config,
full_validation,
validation_operations,
Expand Down
3 changes: 3 additions & 0 deletions packages/rs-dpp/src/data_contract/v0/serialization/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::data_contract::v0::DataContractV0;
use crate::data_contract::DataContract;
use crate::version::{PlatformVersion, PlatformVersionCurrentVersion};
use crate::ProtocolError;
use std::collections::BTreeMap;

use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1;
use crate::validation::operations::ProtocolValidationOperation;
Expand Down Expand Up @@ -94,6 +95,7 @@ impl DataContractV0 {
id,
document_schemas,
schema_defs.as_ref(),
&BTreeMap::new(),
&config,
full_validation,
false,
Expand Down Expand Up @@ -134,6 +136,7 @@ impl DataContractV0 {
id,
document_schemas,
schema_defs.as_ref(),
&BTreeMap::new(),
&config,
full_validation,
false,
Expand Down
3 changes: 3 additions & 0 deletions packages/rs-dpp/src/data_contract/v1/methods/schema.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::data_contract::accessors::v1::DataContractV1Getters;
use crate::data_contract::document_type::accessors::DocumentTypeV0Getters;
use crate::data_contract::document_type::DocumentType;
use crate::data_contract::schema::DataContractSchemaMethodsV0;
Expand All @@ -21,6 +22,7 @@ impl DataContractSchemaMethodsV0 for DataContractV1 {
self.id,
schemas,
defs.as_ref(),
&self.tokens,
&self.config,
full_validation,
!self.tokens.is_empty(),
Expand All @@ -44,6 +46,7 @@ impl DataContractSchemaMethodsV0 for DataContractV1 {
name,
schema,
self.schema_defs.as_ref(),
self.tokens(),
&self.config,
full_validation,
validation_operations,
Expand Down
3 changes: 3 additions & 0 deletions packages/rs-dpp/src/data_contract/v1/serialization/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use crate::data_contract::serialized_version::DataContractInSerializationFormat;
use crate::data_contract::{DataContract, DataContractV1};
use crate::version::{PlatformVersion, PlatformVersionCurrentVersion};
use crate::ProtocolError;
use std::collections::BTreeMap;

use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1;
use crate::validation::operations::ProtocolValidationOperation;
Expand Down Expand Up @@ -93,6 +94,7 @@ impl DataContractV1 {
id,
document_schemas,
schema_defs.as_ref(),
&BTreeMap::new(),
&config,
full_validation,
false,
Expand Down Expand Up @@ -151,6 +153,7 @@ impl DataContractV1 {
id,
document_schemas,
schema_defs.as_ref(),
&tokens,
&config,
full_validation,
!tokens.is_empty(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,22 @@ use thiserror::Error;
Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize,
)]
#[error(
"Invalid token position {}, max {}",
invalid_token_position,
max_token_position
"Invalid token position: {invalid_token_position}. {max_token_message}",
max_token_message = if let Some(max) = self.max_token_position {
format!("The maximum allowed token position is {}", max)
} else {
"No maximum token position limit is set.".to_string()
}
)]
#[platform_serialize(unversioned)]
pub struct InvalidTokenPositionError {
max_token_position: TokenContractPosition,
max_token_position: Option<TokenContractPosition>,
invalid_token_position: TokenContractPosition,
}

impl InvalidTokenPositionError {
pub fn new(
max_token_position: TokenContractPosition,
max_token_position: Option<TokenContractPosition>,
invalid_token_position: TokenContractPosition,
) -> Self {
Self {
Expand All @@ -31,7 +34,7 @@ impl InvalidTokenPositionError {
}
}

pub fn max_token_position(&self) -> TokenContractPosition {
pub fn max_token_position(&self) -> Option<TokenContractPosition> {
self.max_token_position
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,7 @@ impl TokenBaseTransitionActionStructureValidationV0 for TokenBaseTransitionActio
} else {
Ok(SimpleConsensusValidationResult::new_with_error(
BasicError::InvalidTokenPositionError(InvalidTokenPositionError::new(
*contract
.contract
.tokens()
.keys()
.last()
.expect("we already checked this was not empty"),
contract.contract.tokens().keys().last().copied(),
token_position,
))
.into(),
Expand Down
2 changes: 2 additions & 0 deletions packages/strategy-tests/src/operations.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::frequency::Frequency;
use bincode::{Decode, Encode};
use dpp::data_contract::accessors::v0::DataContractV0Getters;
use dpp::data_contract::accessors::v1::DataContractV1Getters;
use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters;
use dpp::data_contract::document_type::random_document::{
DocumentFieldFillSize, DocumentFieldFillType,
Expand Down Expand Up @@ -430,6 +431,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Dat
name_str,
schema_json,
None,
contract.tokens(),
contract.config(),
full_validation,
&mut vec![],
Expand Down
Loading