From ed471fb8e1fb8cafae45ff225cfff5c9c15e2e33 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 18 Feb 2025 17:49:33 +0700 Subject: [PATCH 1/8] feat: validate token name localizations --- .../accessors/mod.rs | 25 +++++++++++++++++ .../accessors/v0/mod.rs | 7 +++++ .../methods/mod.rs | 1 + .../methods/validate_localizations/mod.rs | 27 +++++++++++++++++++ .../methods/validate_localizations/v0/mod.rs | 22 +++++++++++++++ .../token_configuration_convention/mod.rs | 2 ++ .../token_configuration_convention/v0/mod.rs | 21 +++++++++++++++ .../src/errors/consensus/basic/basic_error.rs | 5 +++- .../token/missing_default_localization.rs | 24 +++++++++++++++++ .../src/errors/consensus/basic/token/mod.rs | 2 ++ .../advanced_structure/v0/mod.rs | 14 ++++++++++ .../dpp_validation_versions/mod.rs | 1 + .../dpp_validation_versions/v1.rs | 1 + .../dpp_validation_versions/v2.rs | 1 + .../src/errors/consensus/consensus_error.rs | 5 +++- 15 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/v0/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/missing_default_localization.rs diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs new file mode 100644 index 00000000000..f9d7b04306f --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs @@ -0,0 +1,25 @@ +pub mod v0; + +use crate::data_contract::associated_token::token_configuration::accessors::v0::{ + TokenConfigurationV0Getters, TokenConfigurationV0Setters, +}; +use crate::data_contract::associated_token::token_configuration_convention::accessors::v0::TokenConfigurationConventionV0Getters; +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; + +impl TokenConfigurationConventionV0Getters for TokenConfigurationConvention { + fn singular_form_by_language_code_or_default(&self, language_code: &str) -> &str { + match self { + TokenConfigurationConvention::V0(v0) => { + v0.singular_form_by_language_code_or_default(language_code) + } + } + } + + fn plural_form_by_language_code_or_default(&self, language_code: &str) -> &str { + match self { + TokenConfigurationConvention::V0(v0) => { + v0.plural_form_by_language_code_or_default(language_code) + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/v0/mod.rs new file mode 100644 index 00000000000..343d47b6aa9 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/v0/mod.rs @@ -0,0 +1,7 @@ +/// Accessor trait for getters of `TokenConfigurationConventionV0` +pub trait TokenConfigurationConventionV0Getters { + /// Returns the localized token name in singular form + fn singular_form_by_language_code_or_default(&self, language_code: &str) -> &str; + /// Returns the localized token name in plural form + fn plural_form_by_language_code_or_default(&self, language_code: &str) -> &str; +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/mod.rs new file mode 100644 index 00000000000..3bf17581453 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/mod.rs @@ -0,0 +1 @@ +mod validate_localizations; diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/mod.rs new file mode 100644 index 00000000000..62569166425 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/mod.rs @@ -0,0 +1,27 @@ +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; + +mod v0; + +impl TokenConfigurationConvention { + pub fn validate_localizations( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .validation + .data_contract + .validate_localizations + { + 0 => Ok(self.validate_localizations_v0()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "validate_localizations".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/v0/mod.rs new file mode 100644 index 00000000000..72670aeb830 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/methods/validate_localizations/v0/mod.rs @@ -0,0 +1,22 @@ +use crate::consensus::basic::token::MissingDefaultLocalizationError; +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::validation::SimpleConsensusValidationResult; + +impl TokenConfigurationConvention { + #[inline(always)] + pub(super) fn validate_localizations_v0(&self) -> SimpleConsensusValidationResult { + let english_localization = match self { + TokenConfigurationConvention::V0(v0) => v0.localizations.get("en"), + }; + + // If there is no English localization, return an error + if english_localization.is_none() { + return SimpleConsensusValidationResult::new_with_error( + MissingDefaultLocalizationError::new().into(), + ); + } + + // If we reach here with no errors, return an empty result + SimpleConsensusValidationResult::new() + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs index 76a4ed1370c..f4f12fa8ed2 100644 --- a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs @@ -3,6 +3,8 @@ use bincode::{Decode, Encode}; use derive_more::From; use serde::{Deserialize, Serialize}; +mod accessors; +mod methods; pub mod v0; #[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, PartialOrd, From)] diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs index 6ea538cc6e5..c93e4e8a049 100644 --- a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::data_contract::associated_token::token_configuration_convention::accessors::v0::TokenConfigurationConventionV0Getters; use bincode::Encode; use platform_serialization::de::Decode; use serde::{Deserialize, Serialize}; @@ -22,11 +23,15 @@ impl fmt::Display for TokenConfigurationLocalizationsV0 { } } +pub const ENGLISH_ISO_639: &str = "en"; + #[derive( Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd, Default, )] #[serde(rename_all = "camelCase")] pub struct TokenConfigurationConventionV0 { + /// Localizations for the token name. + /// The key must be a ISO 639 2-chars language code #[serde(default)] pub localizations: BTreeMap, #[serde(default = "default_decimals")] @@ -54,3 +59,19 @@ impl fmt::Display for TokenConfigurationConventionV0 { ) } } + +impl TokenConfigurationConventionV0Getters for TokenConfigurationConventionV0 { + fn singular_form_by_language_code_or_default(&self, language_code: &str) -> &str { + self.localizations + .get(language_code) + .map(|localization| &localization.singular_form) + .unwrap_or_else(|| &self.localizations[ENGLISH_ISO_639].singular_form) + } + + fn plural_form_by_language_code_or_default(&self, language_code: &str) -> &str { + self.localizations + .get(language_code) + .map(|localization| &localization.plural_form) + .unwrap_or_else(|| &self.localizations[ENGLISH_ISO_639].plural_form) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 552a96a9490..2e85658b50e 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -74,7 +74,7 @@ use crate::consensus::basic::overflow_error::OverflowError; use crate::consensus::basic::token::{ ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError, DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenIdError, - InvalidTokenPositionError, TokenTransferToOurselfError, + InvalidTokenPositionError, MissingDefaultLocalizationError, TokenTransferToOurselfError, }; use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError; use crate::consensus::basic::value_error::ValueError; @@ -469,6 +469,9 @@ pub enum BasicError { GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError( GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, ), + + #[error(transparent)] + MissingDefaultLocalizationError(MissingDefaultLocalizationError), } impl From for ConsensusError { diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/missing_default_localization.rs b/packages/rs-dpp/src/errors/consensus/basic/token/missing_default_localization.rs new file mode 100644 index 00000000000..1c81c84b4a4 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/missing_default_localization.rs @@ -0,0 +1,24 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Missing english ('en') localization which is using by default")] +#[platform_serialize(unversioned)] +pub struct MissingDefaultLocalizationError {} + +impl MissingDefaultLocalizationError { + pub fn new() -> Self { + Self {} + } +} + +impl From for ConsensusError { + fn from(err: MissingDefaultLocalizationError) -> Self { + Self::BasicError(BasicError::MissingDefaultLocalizationError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs index d77dfff6fab..5999ef1d2de 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs @@ -4,6 +4,7 @@ mod destination_identity_for_token_minting_not_set_error; mod invalid_action_id_error; mod invalid_token_id_error; mod invalid_token_position_error; +mod missing_default_localization; mod token_transfer_to_ourselves_error; pub use choosing_token_mint_recipient_not_allowed_error::*; @@ -12,4 +13,5 @@ pub use destination_identity_for_token_minting_not_set_error::*; pub use invalid_action_id_error::*; pub use invalid_token_id_error::*; pub use invalid_token_position_error::*; +pub use missing_default_localization::*; pub use token_transfer_to_ourselves_error::*; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs index f4ca13d3a20..cb0983a8109 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs @@ -118,6 +118,20 @@ impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 )); } + let validation_result = token_configuration + .conventions() + .validate_localizations(platform_version)?; + if !validation_result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); + } + let validation_result = token_configuration.validate_token_config_groups_exist( self.data_contract().groups(), platform_version, diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs index b96453f6236..ebd9adc8180 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs @@ -21,6 +21,7 @@ pub struct DataContractValidationVersions { pub validate_not_defined_properties: FeatureVersion, pub validate_property_definition: FeatureVersion, pub validate_token_config_groups_exist: FeatureVersion, + pub validate_localizations: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs index 6b92b0d5493..61e85ffea12 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs @@ -19,6 +19,7 @@ pub const DPP_VALIDATION_VERSIONS_V1: DPPValidationVersions = DPPValidationVersi validate_not_defined_properties: 0, validate_property_definition: 0, validate_token_config_groups_exist: 0, + validate_localizations: 0, }, document_type: DocumentTypeValidationVersions { validate_update: 0, diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs index 05f6c867066..ad370c2a999 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs @@ -19,6 +19,7 @@ pub const DPP_VALIDATION_VERSIONS_V2: DPPValidationVersions = DPPValidationVersi validate_not_defined_properties: 0, validate_property_definition: 0, validate_token_config_groups_exist: 0, + validate_localizations: 0, }, document_type: DocumentTypeValidationVersions { validate_update: 0, diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 936eb1c4e73..67fecb1d633 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -66,7 +66,7 @@ use dpp::consensus::basic::document::{ContestedDocumentsTemporarilyNotAllowedErr use dpp::consensus::basic::group::GroupActionNotAllowedOnTransitionError; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError, WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError}; use dpp::consensus::basic::overflow_error::OverflowError; -use dpp::consensus::basic::token::{ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError, DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenIdError, InvalidTokenPositionError, TokenTransferToOurselfError}; +use dpp::consensus::basic::token::{ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError, DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenIdError, InvalidTokenPositionError, MissingDefaultLocalizationError, TokenTransferToOurselfError}; use dpp::consensus::state::data_contract::data_contract_update_action_not_allowed_error::DataContractUpdateActionNotAllowedError; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use dpp::consensus::state::document::document_contest_currently_locked_error::DocumentContestCurrentlyLockedError; @@ -690,6 +690,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { ) .into() } + BasicError::MissingDefaultLocalizationError(e) => { + generic_consensus_error!(MissingDefaultLocalizationError, e).into() + } } } From 47ceb4168493594dd4fe8f8fa8e74878975ddbd3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 18 Feb 2025 18:12:28 +0700 Subject: [PATCH 2/8] chore: add error code --- packages/rs-dpp/src/errors/consensus/codes.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index fa1583ea088..60ebe622abb 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -102,6 +102,7 @@ impl ErrorWithCode for BasicError { Self::InvalidTokenBaseSupplyError(_) => 10251, Self::NonContiguousContractGroupPositionsError(_) => 10252, Self::NonContiguousContractTokenPositionsError(_) => 10253, + Self::MissingDefaultLocalizationError(_) => 10254, // Group Errors: 10350-10399 Self::GroupPositionDoesNotExistError(_) => 10350, From 3596620b42f53773be5d176dd80961ca214823ac Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 20 Feb 2025 18:00:21 +0700 Subject: [PATCH 3/8] test: add default localization for test token contract --- .../contract/basic-token/basic-token.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json b/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json index ec2a3fd928e..1ef68dada56 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json @@ -9,6 +9,13 @@ "$format_version": "0", "conventions": { "$format_version": "0", + "localizations": { + "en": { + "shouldCapitalize": false, + "pluralForm": "tests", + "singularForm": "test" + } + }, "decimals": 8 }, "baseSupply": 100000, @@ -16,4 +23,4 @@ "keepsHistory": true } } -} \ No newline at end of file +} From 7644d39d08a79d534b6412e7e2db462f168cd763 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 11 Mar 2025 19:21:35 +0700 Subject: [PATCH 4/8] chore: update files after merge --- .../accessors/mod.rs | 22 ++++++++++++++++- .../token_configuration_convention/v0/mod.rs | 24 ++++++++++++++----- .../token_configuration_localization/mod.rs | 1 + 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs index 4c49117f190..acfbe376d1d 100644 --- a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/accessors/mod.rs @@ -1,10 +1,12 @@ -mod v0; +pub mod v0; use crate::data_contract::associated_token::token_configuration::accessors::v0::{ TokenConfigurationV0Getters, TokenConfigurationV0Setters, }; use crate::data_contract::associated_token::token_configuration_convention::accessors::v0::TokenConfigurationConventionV0Getters; use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::data_contract::associated_token::token_configuration_localization::TokenConfigurationLocalization; +use std::collections::BTreeMap; impl TokenConfigurationConventionV0Getters for TokenConfigurationConvention { fn singular_form_by_language_code_or_default(&self, language_code: &str) -> &str { @@ -22,4 +24,22 @@ impl TokenConfigurationConventionV0Getters for TokenConfigurationConvention { } } } + + fn localizations(&self) -> &BTreeMap { + match self { + TokenConfigurationConvention::V0(v0) => v0.localizations(), + } + } + + fn localizations_mut(&mut self) -> &mut BTreeMap { + match self { + TokenConfigurationConvention::V0(v0) => v0.localizations_mut(), + } + } + + fn decimals(&self) -> u16 { + match self { + TokenConfigurationConvention::V0(v0) => v0.decimals(), + } + } } diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs index 346b854d44f..aa497f3561d 100644 --- a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs @@ -1,11 +1,11 @@ -use crate::data_contract::associated_token::token_configuration_localization::TokenConfigurationLocalization; use crate::data_contract::associated_token::token_configuration_convention::accessors::v0::TokenConfigurationConventionV0Getters; +use crate::data_contract::associated_token::token_configuration_localization::accessors::v0::TokenConfigurationLocalizationV0Getters; +use crate::data_contract::associated_token::token_configuration_localization::TokenConfigurationLocalization; use bincode::Encode; use platform_serialization::de::Decode; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::fmt; -use crate::data_contract::associated_token::token_configuration_convention::accessors::v0::TokenConfigurationConventionV0Getters; pub const ENGLISH_ISO_639: &str = "en"; @@ -48,14 +48,26 @@ impl TokenConfigurationConventionV0Getters for TokenConfigurationConventionV0 { fn singular_form_by_language_code_or_default(&self, language_code: &str) -> &str { self.localizations .get(language_code) - .map(|localization| &localization.singular_form) - .unwrap_or_else(|| &self.localizations[ENGLISH_ISO_639].singular_form) + .map(|localization| localization.singular_form()) + .unwrap_or_else(|| self.localizations[ENGLISH_ISO_639].singular_form()) } fn plural_form_by_language_code_or_default(&self, language_code: &str) -> &str { self.localizations .get(language_code) - .map(|localization| &localization.plural_form) - .unwrap_or_else(|| &self.localizations[ENGLISH_ISO_639].plural_form) + .map(|localization| localization.plural_form()) + .unwrap_or_else(|| self.localizations[ENGLISH_ISO_639].plural_form()) + } + + fn localizations(&self) -> &BTreeMap { + &self.localizations + } + + fn localizations_mut(&mut self) -> &mut BTreeMap { + &mut self.localizations + } + + fn decimals(&self) -> u16 { + self.decimals } } diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_localization/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_localization/mod.rs index 424d64b0115..6d078d6d2eb 100644 --- a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_localization/mod.rs +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_localization/mod.rs @@ -1,3 +1,4 @@ +use crate::data_contract::associated_token::token_configuration_localization::accessors::v0::TokenConfigurationLocalizationV0Getters; use crate::data_contract::associated_token::token_configuration_localization::v0::TokenConfigurationLocalizationV0; use bincode::Encode; use derive_more::From; From 0ae4b59a550abb24dc9287d7d77e4db247aa2cc1 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 11 Mar 2025 20:18:34 +0700 Subject: [PATCH 5/8] ci: increase check each feature workspace timeout --- .github/workflows/tests-rs-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests-rs-package.yml b/.github/workflows/tests-rs-package.yml index 7730485c626..be6f8a6715f 100644 --- a/.github/workflows/tests-rs-package.yml +++ b/.github/workflows/tests-rs-package.yml @@ -205,7 +205,7 @@ jobs: check_each_feature: name: Check each feature runs-on: ubuntu-24.04 - timeout-minutes: 10 + timeout-minutes: 15 if: ${{ inputs.check-each-feature }} steps: - name: Check out repo From f36d3e4f409903ab253009db028d3119d640b969 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 11 Mar 2025 20:18:43 +0700 Subject: [PATCH 6/8] test: update fixture --- .../tests/supporting_files/contract/basic-token/basic-token.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json b/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json index c5c2f2b97d1..f795a05f330 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json @@ -11,6 +11,7 @@ "$format_version": "0", "localizations": { "en": { + "$format_version": "0", "shouldCapitalize": false, "pluralForm": "tests", "singularForm": "test" From 892072de698e3323110804109f95ae918e2c1bb0 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 11 Mar 2025 21:00:50 +0700 Subject: [PATCH 7/8] test: update token history contract tests --- .../test/unit/tokenHistoryContract.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js b/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js index 126bf84fa5a..38ccd8658bf 100644 --- a/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js +++ b/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js @@ -389,7 +389,7 @@ describe('Token History Contract', () => { const document = dpp.document.create(dataContract, identityId, 'emergencyAction', rawEmergencyActionDocument); const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); + expect(error.keyword).to.equal('enum'); }); }); From de671ba1492e3eef35f7183f50914283266850f3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 11 Mar 2025 21:32:36 +0700 Subject: [PATCH 8/8] test: fix token history tests --- .../test/unit/tokenHistoryContract.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js b/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js index 38ccd8658bf..ce3d9195664 100644 --- a/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js +++ b/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js @@ -288,13 +288,13 @@ describe('Token History Contract', () => { }); describe('tokenId', () => { - it('should be 32 bytes', async () => { - rawUnfreezeDocument.tokenId = crypto.randomBytes(33); + it('should be defined', async () => { + delete rawUnfreezeDocument.tokenId; const document = dpp.document.create(dataContract, identityId, 'unfreeze', rawUnfreezeDocument); const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.equal('/tokenId'); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('tokenId'); }); });