From 603ca77a22a3e7f752b0e5d474319fd374d88beb Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Wed, 14 Dec 2022 21:43:13 +0400 Subject: [PATCH 01/17] feat: public_keys_validator.rs test --- .../wasm-dpp/lib/test/expect/expectError.js | 6 +- .../duplicated_identity_public_key_error.rs | 4 +- ...duplicated_identity_public_key_id_error.rs | 4 +- ...dentity_public_key_security_level_error.rs | 4 +- .../consensus/basic/json_schema_error.rs | 2 +- .../src/{identifier.rs => identifier/mod.rs} | 0 .../src/{ => identity}/identity_facade.rs | 2 +- .../identity_public_key/key_type.rs | 0 .../{ => identity}/identity_public_key/mod.rs | 3 - .../identity_public_key/purpose.rs | 0 .../identity_public_key/security_level.rs | 0 .../src/{identity.rs => identity/mod.rs} | 6 +- .../wasm-dpp/src/identity/validation/mod.rs | 3 + .../validation/public_keys_validator.rs | 70 ++++++ .../public_keys_validator.rs | 44 ---- packages/wasm-dpp/src/lib.rs | 7 +- packages/wasm-dpp/src/validation/mod.rs | 3 + .../src/{ => validation}/validation_result.rs | 0 .../validatePublicKeysFactory.spec.js | 201 ++++++++---------- 19 files changed, 177 insertions(+), 182 deletions(-) rename packages/wasm-dpp/src/{identifier.rs => identifier/mod.rs} (100%) rename packages/wasm-dpp/src/{ => identity}/identity_facade.rs (97%) rename packages/wasm-dpp/src/{ => identity}/identity_public_key/key_type.rs (100%) rename packages/wasm-dpp/src/{ => identity}/identity_public_key/mod.rs (98%) rename packages/wasm-dpp/src/{ => identity}/identity_public_key/purpose.rs (100%) rename packages/wasm-dpp/src/{ => identity}/identity_public_key/security_level.rs (100%) rename packages/wasm-dpp/src/{identity.rs => identity/mod.rs} (98%) create mode 100644 packages/wasm-dpp/src/identity/validation/mod.rs create mode 100644 packages/wasm-dpp/src/identity/validation/public_keys_validator.rs delete mode 100644 packages/wasm-dpp/src/identity_public_key/public_keys_validator.rs create mode 100644 packages/wasm-dpp/src/validation/mod.rs rename packages/wasm-dpp/src/{ => validation}/validation_result.rs (100%) diff --git a/packages/wasm-dpp/lib/test/expect/expectError.js b/packages/wasm-dpp/lib/test/expect/expectError.js index cb54e60cc37..5a648691aa9 100644 --- a/packages/wasm-dpp/lib/test/expect/expectError.js +++ b/packages/wasm-dpp/lib/test/expect/expectError.js @@ -12,12 +12,14 @@ const expectError = { const wasmDpp = await loadWasmDpp(); if (!errorClass) { // eslint-disable-next-line no-param-reassign - errorClass = wasmDpp.ValidationResult; + errorClass = TypeError; } expect(result).to.be.an.instanceOf(wasmDpp.ValidationResult); expect(result.getErrors()).to.have.lengthOf(count); - result.getErrors().forEach((error) => expect(error).to.be.an.instanceOf(errorClass)); + result.getErrors().forEach((error) => { + expect(error).to.be.an.instanceOf(errorClass); + }); }, /** diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs index a832527d715..04f8fa90c23 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs @@ -16,12 +16,12 @@ impl From<&DuplicatedIdentityPublicKeyError> for DuplicatedIdentityPublicKeyErro #[wasm_bindgen(js_class=DuplicatedIdentityPublicKeyError)] impl DuplicatedIdentityPublicKeyErrorWasm { #[wasm_bindgen(js_name=getDuplicatedPublicKeysIds)] - pub fn duplicated_public_keys_ids(&self) -> Vec { + pub fn duplicated_public_keys_ids(&self) -> js_sys::Array { // TODO: key ids probably should be u32 self.inner .duplicated_public_keys_ids() .iter() - .map(|id| *id as u32) + .map(|id| JsValue::from(*id as u32)) .collect() } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs index 41cde66b3ac..bbf92ba535f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs @@ -16,12 +16,12 @@ impl From<&DuplicatedIdentityPublicKeyIdError> for DuplicatedIdentityPublicKeyId #[wasm_bindgen(js_class=DuplicatedIdentityPublicKeyIdError)] impl DuplicatedIdentityPublicKeyIdErrorWasm { #[wasm_bindgen(js_name=getDuplicatedIds)] - pub fn duplicated_ids(&self) -> Vec { + pub fn duplicated_ids(&self) -> js_sys::Array { // TODO: key ids probably should be u32 self.inner .duplicated_ids() .iter() - .map(|id| *id as u32) + .map(|id| JsValue::from(*id as u32)) .collect() } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs index 049d8c7fb0a..99f323eca02 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs @@ -25,12 +25,12 @@ impl InvalidIdentityPublicKeySecurityLevelErrorWasm { self.inner.public_key_id() as u32 } - #[wasm_bindgen(js_name=getPurpose)] + #[wasm_bindgen(js_name=getPublicKeyPurpose)] pub fn purpose(&self) -> u8 { self.inner.purpose() as u8 } - #[wasm_bindgen(js_name=getSecurityLevel)] + #[wasm_bindgen(js_name=getPublicKeySecurityLevel)] pub fn security_level(&self) -> u8 { self.inner.security_level() as u8 } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs index b8bcf2ba4db..4349e1820f9 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs @@ -141,7 +141,7 @@ impl From<&ValidationErrorKind> for Params { .build(), ValidationErrorKind::MinItems { limit } => ParamsBuilder::new() .set_keyword("minItems") - .add_param("maximum", Value::from(*limit)) + .add_param("minItems", Value::from(*limit)) .build(), ValidationErrorKind::Minimum { limit } => ParamsBuilder::new() .set_keyword("minimum") diff --git a/packages/wasm-dpp/src/identifier.rs b/packages/wasm-dpp/src/identifier/mod.rs similarity index 100% rename from packages/wasm-dpp/src/identifier.rs rename to packages/wasm-dpp/src/identifier/mod.rs diff --git a/packages/wasm-dpp/src/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs similarity index 97% rename from packages/wasm-dpp/src/identity_facade.rs rename to packages/wasm-dpp/src/identity/identity_facade.rs index 284f2c4181e..63e0c5cc87f 100644 --- a/packages/wasm-dpp/src/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -6,7 +6,7 @@ use dpp::identity::validation::PublicKeysValidator; use dpp::identity::IdentityFacade; use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; -use crate::validation_result::ValidationResultWasm; +use crate::validation::ValidationResultWasm; use dpp::version::ProtocolVersionValidator; use dpp::NonConsensusError; diff --git a/packages/wasm-dpp/src/identity_public_key/key_type.rs b/packages/wasm-dpp/src/identity/identity_public_key/key_type.rs similarity index 100% rename from packages/wasm-dpp/src/identity_public_key/key_type.rs rename to packages/wasm-dpp/src/identity/identity_public_key/key_type.rs diff --git a/packages/wasm-dpp/src/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs similarity index 98% rename from packages/wasm-dpp/src/identity_public_key/mod.rs rename to packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 118ee778aa0..93aa1d6788a 100644 --- a/packages/wasm-dpp/src/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -14,9 +14,6 @@ mod security_level; pub use security_level::*; mod key_type; -mod public_keys_validator; - -pub use public_keys_validator::*; pub use key_type::*; diff --git a/packages/wasm-dpp/src/identity_public_key/purpose.rs b/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs similarity index 100% rename from packages/wasm-dpp/src/identity_public_key/purpose.rs rename to packages/wasm-dpp/src/identity/identity_public_key/purpose.rs diff --git a/packages/wasm-dpp/src/identity_public_key/security_level.rs b/packages/wasm-dpp/src/identity/identity_public_key/security_level.rs similarity index 100% rename from packages/wasm-dpp/src/identity_public_key/security_level.rs rename to packages/wasm-dpp/src/identity/identity_public_key/security_level.rs diff --git a/packages/wasm-dpp/src/identity.rs b/packages/wasm-dpp/src/identity/mod.rs similarity index 98% rename from packages/wasm-dpp/src/identity.rs rename to packages/wasm-dpp/src/identity/mod.rs index d475a27eeef..a6b9f67ecb4 100644 --- a/packages/wasm-dpp/src/identity.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -1,3 +1,7 @@ +pub mod identity_facade; +mod identity_public_key; +mod validation; + use js_sys::Array; use serde_json::Value; use wasm_bindgen::prelude::*; @@ -12,8 +16,8 @@ use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; use crate::utils; use crate::utils::to_vec_of_serde_values; -use crate::IdentityPublicKeyWasm; use crate::MetadataWasm; +pub use identity_public_key::*; #[wasm_bindgen(js_name=Identity)] #[derive(Clone)] diff --git a/packages/wasm-dpp/src/identity/validation/mod.rs b/packages/wasm-dpp/src/identity/validation/mod.rs new file mode 100644 index 00000000000..c65f318e96c --- /dev/null +++ b/packages/wasm-dpp/src/identity/validation/mod.rs @@ -0,0 +1,3 @@ +mod public_keys_validator; + +pub use public_keys_validator::*; diff --git a/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs b/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs new file mode 100644 index 00000000000..aca52fca9de --- /dev/null +++ b/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs @@ -0,0 +1,70 @@ +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; + +use crate::utils::{to_vec_of_serde_values, ToSerdeJSONExt}; +use crate::validation::ValidationResultWasm; +use dpp::identity::validation::{ + PublicKeysValidator, TPublicKeysValidator, PUBLIC_KEY_SCHEMA_FOR_TRANSITION, +}; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name = PublicKeysValidator)] +pub struct PublicKeysValidatorWasm { + public_key_validator: PublicKeysValidator, + public_key_in_state_transition_validator: PublicKeysValidator, +} + +#[wasm_bindgen(js_class = PublicKeysValidator)] +impl PublicKeysValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new(adapter: JsBlsAdapter) -> Result { + Ok(Self { + public_key_validator: PublicKeysValidator::new(BlsAdapter(JsBlsAdapter::from( + adapter.clone(), + )))?, + public_key_in_state_transition_validator: PublicKeysValidator::new_with_schema( + PUBLIC_KEY_SCHEMA_FOR_TRANSITION.clone(), + BlsAdapter(adapter), + )?, + }) + } + + #[wasm_bindgen(js_name=validateKeys)] + pub fn validate_keys( + &self, + public_keys: js_sys::Array, + ) -> Result { + let raw_public_keys = to_vec_of_serde_values(public_keys.iter())?; + + self.public_key_validator + .validate_keys(&raw_public_keys) + .map(ValidationResultWasm::from) + .map_err(|e| JsValue::from(e.to_string())) + } + + #[wasm_bindgen(js_name=validatePublicKeyStructure)] + pub fn validate_public_key_structure( + &self, + public_key: JsValue, + ) -> Result { + let pk_serde_json = public_key.to_serde_json_value()?; + + self.public_key_validator + .validate_public_key_structure(&pk_serde_json) + .map(ValidationResultWasm::from) + .map_err(|e| JsValue::from(e.to_string())) + } + + #[wasm_bindgen(js_name=validateKeysInStateTransition)] + pub fn validate_keys_in_state_transition( + &self, + public_keys: js_sys::Array, + ) -> Result { + let raw_public_keys = to_vec_of_serde_values(public_keys.iter())?; + + self.public_key_in_state_transition_validator + .validate_keys(&raw_public_keys) + .map(ValidationResultWasm::from) + .map_err(|e| JsValue::from(e.to_string())) + } +} diff --git a/packages/wasm-dpp/src/identity_public_key/public_keys_validator.rs b/packages/wasm-dpp/src/identity_public_key/public_keys_validator.rs deleted file mode 100644 index e5faf2834af..00000000000 --- a/packages/wasm-dpp/src/identity_public_key/public_keys_validator.rs +++ /dev/null @@ -1,44 +0,0 @@ -use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; - -use crate::utils::{to_vec_of_serde_values, ToSerdeJSONExt}; -use crate::validation_result::ValidationResultWasm; -use dpp::identity::validation::{PublicKeysValidator, TPublicKeysValidator}; - -use wasm_bindgen::prelude::*; - -#[wasm_bindgen(js_name = PublicKeysValidator)] -pub struct PublicKeysValidatorWasm(PublicKeysValidator); - -#[wasm_bindgen(js_class = PublicKeysValidator)] -impl PublicKeysValidatorWasm { - #[wasm_bindgen(constructor)] - pub fn new(adapter: JsBlsAdapter) -> PublicKeysValidatorWasm { - Self(PublicKeysValidator::new(BlsAdapter(adapter)).unwrap()) - } - - #[wasm_bindgen(js_name=validateKeys)] - pub fn validate_keys( - &self, - public_keys: js_sys::Array, - ) -> Result { - let raw_public_keys = to_vec_of_serde_values(public_keys.iter())?; - - self.0 - .validate_keys(&raw_public_keys) - .map(ValidationResultWasm::from) - .map_err(|e| JsValue::from(e.to_string())) - } - - #[wasm_bindgen(js_name=validatePublicKeyStructure)] - pub fn validate_public_key_structure( - &self, - public_key: JsValue, - ) -> Result { - let pk_serde_json = public_key.to_serde_json_value()?; - - self.0 - .validate_public_key_structure(&pk_serde_json) - .map(ValidationResultWasm::from) - .map_err(|e| JsValue::from(e.to_string())) - } -} diff --git a/packages/wasm-dpp/src/lib.rs b/packages/wasm-dpp/src/lib.rs index e76d79fbd6f..63330116cc4 100644 --- a/packages/wasm-dpp/src/lib.rs +++ b/packages/wasm-dpp/src/lib.rs @@ -4,9 +4,6 @@ pub use dash_platform_protocol::*; pub use data_contract::*; pub use document::*; pub use identity::*; -pub use identity::*; -pub use identity_facade::*; -pub use identity_public_key::*; pub use metadata::*; mod dash_platform_protocol; @@ -15,12 +12,10 @@ mod document; pub mod errors; mod identifier; mod identity; -mod identity_facade; -mod identity_public_key; mod metadata; mod utils; mod bls_adapter; mod buffer; -pub mod validation_result; +mod validation; diff --git a/packages/wasm-dpp/src/validation/mod.rs b/packages/wasm-dpp/src/validation/mod.rs new file mode 100644 index 00000000000..4e80aa1f5db --- /dev/null +++ b/packages/wasm-dpp/src/validation/mod.rs @@ -0,0 +1,3 @@ +mod validation_result; + +pub use validation_result::*; diff --git a/packages/wasm-dpp/src/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs similarity index 100% rename from packages/wasm-dpp/src/validation_result.rs rename to packages/wasm-dpp/src/validation/validation_result.rs diff --git a/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js b/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js index 7d5cd7cb607..4ba459938f9 100644 --- a/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js @@ -1,41 +1,9 @@ -const { getRE2Class } = require('@dashevo/wasm-re2'); - const crypto = require('crypto'); -const createAjv = require('@dashevo/dpp/lib/ajv/createAjv'); - -const JsonSchemaValidator = require( - '@dashevo/dpp/lib/validation/JsonSchemaValidator', -); - -const validatePublicKeysFactory = require( - '@dashevo/dpp/lib/identity/validation/validatePublicKeysFactory', -); - const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture'); -const DuplicatedIdentityPublicKeyError = require( - '@dashevo/dpp/lib/errors/consensus/basic/identity/DuplicatedIdentityPublicKeyError', -); -const DuplicatedIdentityPublicKeyIdError = require( - '@dashevo/dpp/lib/errors/consensus/basic/identity/DuplicatedIdentityPublicKeyIdError', -); - -const InvalidIdentityPublicKeyDataError = require( - '@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidIdentityPublicKeyDataError', -); - -const InvalidIdentityPublicKeySecurityLevelError = require( - '@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidIdentityPublicKeySecurityLevelError', -); - -const IdentityPublicKey = require( - '@dashevo/dpp/lib/identity/IdentityPublicKey', -); const BlsSignatures = require('@dashevo/dpp/lib/bls/bls'); -const identityPublicKeySchema = require('@dashevo/dpp/schema/identity/publicKey.json'); -const stateTransitionPublicKeySchema = require('@dashevo/dpp/schema/identity/stateTransition/publicKey.json'); const { expectValidationError, expectJsonSchemaError, @@ -46,24 +14,31 @@ const { default: loadWasmDpp } = require('../../../../dist'); describe('validatePublicKeysFactory', () => { let rawPublicKeys; let validatePublicKeys; - let validator; let bls; let PublicKeysValidator; let publicKeysValidator; let InvalidIdentityPublicKeyDataErrorWasm; let PublicKeyValidationError; + let KeyType; + let KeyPurpose; + let KeySecurityLevel; + + let DuplicatedIdentityPublicKeyError; + let DuplicatedIdentityPublicKeyIdError; + let InvalidIdentityPublicKeyDataError; + let InvalidIdentityPublicKeySecurityLevelError; beforeEach(async () => { ({ publicKeys: rawPublicKeys } = getIdentityFixture().toObject()); ({ - PublicKeysValidator, + PublicKeysValidator, KeyType, KeyPurpose, KeySecurityLevel, InvalidIdentityPublicKeyDataError: InvalidIdentityPublicKeyDataErrorWasm, + DuplicatedIdentityPublicKeyError, DuplicatedIdentityPublicKeyIdError, + InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError, PublicKeyValidationError, } = await loadWasmDpp()); - const RE2 = await getRE2Class(); - const ajv = createAjv(RE2); bls = await BlsSignatures.getInstance(); const blsAdapter = { @@ -80,39 +55,31 @@ describe('validatePublicKeysFactory', () => { }, }; - validator = new JsonSchemaValidator(ajv); - - validatePublicKeys = validatePublicKeysFactory( - validator, - identityPublicKeySchema, - bls, - ); - publicKeysValidator = new PublicKeysValidator(blsAdapter); + + validatePublicKeys = (keys) => publicKeysValidator.validateKeys(keys); }); describe('id', () => { - it('should be present', () => { + it('should be present', async () => { delete rawPublicKeys[1].id; const result = publicKeysValidator.validateKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); expect(error.getInstancePath()).to.equal(''); expect(error.getKeyword()).to.equal('required'); expect(error.getParams().missingProperty).to.equal('id'); - - console.dir(error); }); - it('should be a number', () => { + it('should be a number', async () => { rawPublicKeys[1].id = 'string'; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -120,12 +87,12 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('type'); }); - it('should be an integer', () => { + it('should be an integer', async () => { rawPublicKeys[1].id = 1.1; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -133,12 +100,12 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('type'); }); - it('should be greater or equal to one', () => { + it('should be greater or equal to one', async () => { rawPublicKeys[1].id = -1; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -148,12 +115,12 @@ describe('validatePublicKeysFactory', () => { }); describe('type', () => { - it('should be present', () => { + it('should be present', async () => { delete rawPublicKeys[1].type; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result, 4); const [error] = result.getErrors(); @@ -161,27 +128,30 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('minItems'); }); - it('should be a number', () => { + it('should be a number', async () => { rawPublicKeys[1].type = 'string'; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result, 2); - const [error] = result.getErrors(); + const [typeError, enumError] = result.getErrors(); - expect(error.getInstancePath()).to.equal('/type'); - expect(error.getKeyword()).to.equal('type'); + expect(typeError.getInstancePath()).to.equal('/type'); + expect(typeError.getKeyword()).to.equal('type'); + + expect(enumError.getInstancePath()).to.equal('/type'); + expect(enumError.getKeyword()).to.equal('enum'); }); }); describe('data', () => { - it('should be present', () => { + it('should be present', async () => { delete rawPublicKeys[1].data; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -190,28 +160,29 @@ describe('validatePublicKeysFactory', () => { expect(error.getParams().missingProperty).to.equal('data'); }); - it('should be a byte array', () => { + it('should be a byte array', async () => { rawPublicKeys[1].data = new Array(33).fill('string'); const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result, 2); + await expectJsonSchemaError(result, 33); const [error, byteArrayError] = result.getErrors(); expect(error.getInstancePath()).to.equal('/data/0'); expect(error.getKeyword()).to.equal('type'); - expect(byteArrayError.getKeyword()).to.equal('byteArray'); + expect(byteArrayError.getInstancePath()).to.equal('/data/1'); + expect(byteArrayError.getKeyword()).to.equal('type'); }); describe('ECDSA_SECP256K1', () => { - it('should be no less than 33 bytes', () => { + it('should be no less than 33 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(32); const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -219,12 +190,12 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('minItems'); }); - it('should be no longer than 33 bytes', () => { + it('should be no longer than 33 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(34); const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -234,13 +205,13 @@ describe('validatePublicKeysFactory', () => { }); describe('BLS12_381', () => { - it('should be no less than 48 bytes', () => { + it('should be no less than 48 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(47); rawPublicKeys[1].type = 1; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -248,13 +219,13 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('minItems'); }); - it('should be no longer than 48 bytes', () => { + it('should be no longer than 48 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(49); rawPublicKeys[1].type = 1; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -264,13 +235,13 @@ describe('validatePublicKeysFactory', () => { }); describe('ECDSA_HASH160', () => { - it('should be no less than 20 bytes', () => { + it('should be no less than 20 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(19); rawPublicKeys[1].type = 2; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -278,13 +249,13 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('minItems'); }); - it('should be no longer than 20 bytes', () => { + it('should be no longer than 20 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(21); rawPublicKeys[1].type = 2; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -294,13 +265,13 @@ describe('validatePublicKeysFactory', () => { }); describe('BIP13_SCRIPT_HASH', () => { - it('should be no less than 20 bytes', () => { + it('should be no less than 20 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(19); rawPublicKeys[1].type = 3; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -308,13 +279,13 @@ describe('validatePublicKeysFactory', () => { expect(error.getKeyword()).to.equal('minItems'); }); - it('should be no longer than 20 bytes', () => { + it('should be no longer than 20 bytes', async () => { rawPublicKeys[1].data = Buffer.alloc(21); rawPublicKeys[1].type = 3; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -324,12 +295,12 @@ describe('validatePublicKeysFactory', () => { }); }); - it('should return invalid result if there are duplicate key ids', () => { + it('should return invalid result if there are duplicate key ids', async () => { rawPublicKeys[1].id = rawPublicKeys[0].id; const result = validatePublicKeys(rawPublicKeys); - expectValidationError(result, DuplicatedIdentityPublicKeyIdError); + await expectValidationError(result, DuplicatedIdentityPublicKeyIdError); const [error] = result.getErrors(); @@ -337,12 +308,12 @@ describe('validatePublicKeysFactory', () => { expect(error.getDuplicatedIds()).to.deep.equal([rawPublicKeys[1].id]); }); - it('should return invalid result if there are duplicate keys', () => { + it('should return invalid result if there are duplicate keys', async () => { rawPublicKeys[1].data = rawPublicKeys[0].data; const result = validatePublicKeys(rawPublicKeys); - expectValidationError(result, DuplicatedIdentityPublicKeyError); + await expectValidationError(result, DuplicatedIdentityPublicKeyError); const [error] = result.getErrors(); @@ -350,28 +321,28 @@ describe('validatePublicKeysFactory', () => { expect(error.getDuplicatedPublicKeysIds()).to.deep.equal([rawPublicKeys[1].id]); }); - it('should return invalid result if key data is not a valid DER', () => { + it('should return invalid result if key data is not a valid DER', async () => { rawPublicKeys[1].data = Buffer.alloc(33); const result = validatePublicKeys(rawPublicKeys); - expectValidationError(result, InvalidIdentityPublicKeyDataError); + await expectValidationError(result, InvalidIdentityPublicKeyDataError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(1040); expect(error.getPublicKeyId()).to.deep.equal(rawPublicKeys[1].id); - expect(error.getValidationError()).to.be.instanceOf(TypeError); - expect(error.getValidationError().message).to.equal('Invalid DER format public key'); + expect(error.getValidationError()).to.be.instanceOf(PublicKeyValidationError); + expect(error.getValidationError().message).to.equal('Key secp256k1 error: secp: malformed public key'); }); - it('should return invalid result if key has an invalid combination of purpose and security level', () => { - rawPublicKeys[1].purpose = IdentityPublicKey.PURPOSES.ENCRYPTION; - rawPublicKeys[1].securityLevel = IdentityPublicKey.SECURITY_LEVELS.MASTER; + it('should return invalid result if key has an invalid combination of purpose and security level', async () => { + rawPublicKeys[1].purpose = KeyPurpose.ENCRYPTION; + rawPublicKeys[1].securityLevel = KeySecurityLevel.MASTER; const result = validatePublicKeys(rawPublicKeys); - expectValidationError(result, InvalidIdentityPublicKeySecurityLevelError); + await expectValidationError(result, InvalidIdentityPublicKeySecurityLevelError); const [error] = result.getErrors(); @@ -390,14 +361,14 @@ describe('validatePublicKeysFactory', () => { it('should pass valid BLS12_381 public key', () => { rawPublicKeys = [{ id: 0, - type: IdentityPublicKey.TYPES.BLS12_381, + type: KeyType.BLS12_381, purpose: 0, securityLevel: 0, readOnly: true, data: Buffer.from('01fac99ca2c8f39c286717c213e190aba4b7af76db320ec43f479b7d9a2012313a0ae59ca576edf801444bc694686694', 'hex'), }]; - const result = publicKeysValidator.validateKeys(rawPublicKeys); + const result = validatePublicKeys(rawPublicKeys); expect(result.isValid()).to.be.true(); }); @@ -405,7 +376,7 @@ describe('validatePublicKeysFactory', () => { it('should pass valid ECDSA_HASH160 public key', () => { rawPublicKeys = [{ id: 0, - type: IdentityPublicKey.TYPES.ECDSA_HASH160, + type: KeyType.ECDSA_HASH160, purpose: 0, securityLevel: 0, readOnly: true, @@ -420,7 +391,7 @@ describe('validatePublicKeysFactory', () => { it('should return invalid result if BLS12_381 public key is invalid', async () => { rawPublicKeys = [{ id: 0, - type: IdentityPublicKey.TYPES.BLS12_381, + type: KeyType.BLS12_381, purpose: 0, securityLevel: 0, readOnly: true, @@ -429,7 +400,7 @@ describe('validatePublicKeysFactory', () => { const result = publicKeysValidator.validateKeys(rawPublicKeys); - await expectValidationError(result, InvalidIdentityPublicKeyDataErrorWasm); + await await expectValidationError(result, InvalidIdentityPublicKeyDataErrorWasm); const [error] = result.getErrors(); @@ -453,11 +424,7 @@ describe('validatePublicKeysFactory', () => { describe('State Transition Schema', () => { beforeEach(() => { - validatePublicKeys = validatePublicKeysFactory( - validator, - stateTransitionPublicKeySchema, - bls, - ); + validatePublicKeys = (keys) => publicKeysValidator.validateKeysInStateTransition(keys); rawPublicKeys.forEach((rawPublicKey) => { // eslint-disable-next-line no-param-reassign @@ -466,16 +433,16 @@ describe('validatePublicKeysFactory', () => { }); describe('signature', () => { - it('should be present', () => { + it('should be present', async () => { delete rawPublicKeys[0].signature; const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); - expect(error.instancePath).to.equal(''); + expect(error.getInstancePath()).to.equal(''); expect(error.getKeyword()).to.equal('required'); expect(error.getParams().missingProperty).to.equal('signature'); }); @@ -485,39 +452,37 @@ describe('validatePublicKeysFactory', () => { const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result, 2); + await expectJsonSchemaError(result, 65); - const [error, byteArrayError] = result.getErrors(); + const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/signature/0'); expect(error.getKeyword()).to.equal('type'); - - expect(byteArrayError.getKeyword()).to.equal('byteArray'); + expect(error.getInstancePath()).to.equal('/signature/0'); }); - it('should be not shorter than 65 bytes', () => { + it('should be not shorter than 65 bytes', async () => { rawPublicKeys[0].signature = Buffer.alloc(64); const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/signature'); + expect(error.getInstancePath()).to.equal('/signature'); expect(error.getKeyword()).to.equal('minItems'); }); - it('should be not longer than 65 bytes', () => { + it('should be not longer than 65 bytes', async () => { rawPublicKeys[0].signature = Buffer.alloc(66); const result = validatePublicKeys(rawPublicKeys); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/signature'); + expect(error.getInstancePath()).to.equal('/signature'); expect(error.getKeyword()).to.equal('maxItems'); }); }); From e8338d7e03c46b033c3deb7df7f5d3b79db3d2e3 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Thu, 15 Dec 2022 19:25:25 +0400 Subject: [PATCH 02/17] add static fields to the IdentityPublicKey export --- packages/wasm-dpp/index.ts | 3 ++- packages/wasm-dpp/lib/dpp.ts | 10 ++++++++ packages/wasm-dpp/lib/patchIdentifier.ts | 2 +- .../validatePublicKeysFactory.spec.js | 24 +++++++++---------- 4 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 packages/wasm-dpp/lib/dpp.ts diff --git a/packages/wasm-dpp/index.ts b/packages/wasm-dpp/index.ts index efea10ea715..eb010f5f0c0 100644 --- a/packages/wasm-dpp/index.ts +++ b/packages/wasm-dpp/index.ts @@ -1,4 +1,5 @@ -import init, * as dpp_module from './wasm/wasm_dpp'; +import init from './wasm/wasm_dpp'; +import * as dpp_module from './lib/dpp'; // @ts-ignore import wasmBase from './wasm/wasm_dpp_bg.js'; import patchIdentifier from "./lib/patchIdentifier"; diff --git a/packages/wasm-dpp/lib/dpp.ts b/packages/wasm-dpp/lib/dpp.ts new file mode 100644 index 00000000000..f5baec6980d --- /dev/null +++ b/packages/wasm-dpp/lib/dpp.ts @@ -0,0 +1,10 @@ +// import * as dpp_module from '../wasm/wasm_dpp'; +import {IdentityPublicKey as UnprocessedIdentityPublicKey, KeyType, KeySecurityLevel, KeyPurpose} from "../wasm/wasm_dpp"; + +export class IdentityPublicKey extends UnprocessedIdentityPublicKey { + static TYPES = KeyType; + static PURPOSES = KeyPurpose; + static SECURITY_LEVELS = KeySecurityLevel; +} + +export * from '../wasm/wasm_dpp'; \ No newline at end of file diff --git a/packages/wasm-dpp/lib/patchIdentifier.ts b/packages/wasm-dpp/lib/patchIdentifier.ts index 1028b25b570..e5f2d0ba062 100644 --- a/packages/wasm-dpp/lib/patchIdentifier.ts +++ b/packages/wasm-dpp/lib/patchIdentifier.ts @@ -1,4 +1,4 @@ -import * as dpp_module from "../wasm/wasm_dpp"; +import * as dpp_module from "../lib/dpp"; // import { inspect } from 'util'; export default function (dppModule: typeof dpp_module) { diff --git a/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js b/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js index 4ba459938f9..4de6591e41e 100644 --- a/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js @@ -15,13 +15,11 @@ describe('validatePublicKeysFactory', () => { let rawPublicKeys; let validatePublicKeys; let bls; - let PublicKeysValidator; let publicKeysValidator; - let InvalidIdentityPublicKeyDataErrorWasm; + + let PublicKeysValidator; let PublicKeyValidationError; - let KeyType; - let KeyPurpose; - let KeySecurityLevel; + let IdentityPublicKey; let DuplicatedIdentityPublicKeyError; let DuplicatedIdentityPublicKeyIdError; @@ -32,8 +30,8 @@ describe('validatePublicKeysFactory', () => { ({ publicKeys: rawPublicKeys } = getIdentityFixture().toObject()); ({ - PublicKeysValidator, KeyType, KeyPurpose, KeySecurityLevel, - InvalidIdentityPublicKeyDataError: InvalidIdentityPublicKeyDataErrorWasm, + PublicKeysValidator, IdentityPublicKey, + InvalidIdentityPublicKeyDataError, DuplicatedIdentityPublicKeyError, DuplicatedIdentityPublicKeyIdError, InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError, PublicKeyValidationError, @@ -337,8 +335,8 @@ describe('validatePublicKeysFactory', () => { }); it('should return invalid result if key has an invalid combination of purpose and security level', async () => { - rawPublicKeys[1].purpose = KeyPurpose.ENCRYPTION; - rawPublicKeys[1].securityLevel = KeySecurityLevel.MASTER; + rawPublicKeys[1].purpose = IdentityPublicKey.PURPOSES.ENCRYPTION; + rawPublicKeys[1].securityLevel = IdentityPublicKey.SECURITY_LEVELS.MASTER; const result = validatePublicKeys(rawPublicKeys); @@ -361,7 +359,7 @@ describe('validatePublicKeysFactory', () => { it('should pass valid BLS12_381 public key', () => { rawPublicKeys = [{ id: 0, - type: KeyType.BLS12_381, + type: IdentityPublicKey.TYPES.BLS12_381, purpose: 0, securityLevel: 0, readOnly: true, @@ -376,7 +374,7 @@ describe('validatePublicKeysFactory', () => { it('should pass valid ECDSA_HASH160 public key', () => { rawPublicKeys = [{ id: 0, - type: KeyType.ECDSA_HASH160, + type: IdentityPublicKey.TYPES.ECDSA_HASH160, purpose: 0, securityLevel: 0, readOnly: true, @@ -391,7 +389,7 @@ describe('validatePublicKeysFactory', () => { it('should return invalid result if BLS12_381 public key is invalid', async () => { rawPublicKeys = [{ id: 0, - type: KeyType.BLS12_381, + type: IdentityPublicKey.TYPES.BLS12_381, purpose: 0, securityLevel: 0, readOnly: true, @@ -400,7 +398,7 @@ describe('validatePublicKeysFactory', () => { const result = publicKeysValidator.validateKeys(rawPublicKeys); - await await expectValidationError(result, InvalidIdentityPublicKeyDataErrorWasm); + await expectValidationError(result, InvalidIdentityPublicKeyDataError); const [error] = result.getErrors(); From acf1b7915a13d333f1f30e99b32ad931bf3d5021 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 16 Dec 2022 18:30:32 +0400 Subject: [PATCH 03/17] make a declaration that seems to work --- packages/wasm-dpp/lib/dpp.ts | 23 +++++++++++++------ .../unit/identity/IdentityPublicKey.spec.js | 5 ++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/wasm-dpp/lib/dpp.ts b/packages/wasm-dpp/lib/dpp.ts index f5baec6980d..4ee3ded55d7 100644 --- a/packages/wasm-dpp/lib/dpp.ts +++ b/packages/wasm-dpp/lib/dpp.ts @@ -1,10 +1,19 @@ -// import * as dpp_module from '../wasm/wasm_dpp'; -import {IdentityPublicKey as UnprocessedIdentityPublicKey, KeyType, KeySecurityLevel, KeyPurpose} from "../wasm/wasm_dpp"; +import * as dpp_module from '../wasm/wasm_dpp'; -export class IdentityPublicKey extends UnprocessedIdentityPublicKey { - static TYPES = KeyType; - static PURPOSES = KeyPurpose; - static SECURITY_LEVELS = KeySecurityLevel; +// Declarations written prior to "export *" will overwrite exports +declare class IdentityPublicKey extends dpp_module.IdentityPublicKey { + static TYPES: typeof dpp_module.KeyType; + static PURPOSES: typeof dpp_module.KeyPurpose; + static SECURITY_LEVELS: typeof dpp_module.KeySecurityLevel; } -export * from '../wasm/wasm_dpp'; \ No newline at end of file +// While we declared it above, those fields do not hold any values - let's assign them. +// We need to suppress the compiler here, as he won't be happy about those reassignments. +// @ts-ignore +dpp_module.IdentityPublicKey.TYPES = dpp_module.KeyType; +// @ts-ignore +dpp_module.IdentityPublicKey.PURPOSES = dpp_module.KeyPurpose; +// @ts-ignore +dpp_module.IdentityPublicKey.SECURITY_LEVELS = dpp_module.KeySecurityLevel; + +export * from '../wasm/wasm_dpp'; diff --git a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js index aad2f4dad91..deb76bd2be5 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js @@ -15,13 +15,12 @@ describe('IdentityPublicKey', () => { rawPublicKey = { id: 0, - type: KeyType.ECDSA_SECP256K1, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), purpose: KeyPurpose.AUTHENTICATION, securityLevel: KeySecurityLevel.MASTER, readOnly: false, }; - publicKey = new IdentityPublicKey(rawPublicKey); }); @@ -151,7 +150,7 @@ describe('IdentityPublicKey', () => { it('should return data in case ECDSA_HASH160', () => { rawPublicKey = { id: 0, - type: KeyType.ECDSA_HASH160, + type: IdentityPublicKey.TYPES.ECDSA_HASH160, data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), purpose: KeyPurpose.AUTHENTICATION, securityLevel: KeySecurityLevel.MASTER, From 349b83b3d60fd3c7c34f6941e601c5774b19669d Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 16 Dec 2022 18:32:49 +0400 Subject: [PATCH 04/17] replace uses of KeyPurpose, KeyType, KeySecurityLevel in the public key tests --- .../unit/identity/IdentityPublicKey.spec.js | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js index deb76bd2be5..ed09ee7ecff 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js @@ -4,21 +4,16 @@ describe('IdentityPublicKey', () => { let rawPublicKey; let publicKey; let IdentityPublicKey; - let KeyPurpose; - let KeyType; - let KeySecurityLevel; beforeEach(async () => { - ({ - IdentityPublicKey, KeyPurpose, KeyType, KeySecurityLevel, - } = await loadWasmDpp()); + ({IdentityPublicKey} = await loadWasmDpp()); rawPublicKey = { id: 0, type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), - purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, readOnly: false, }; publicKey = new IdentityPublicKey(rawPublicKey); @@ -88,9 +83,9 @@ describe('IdentityPublicKey', () => { describe('#setPurpose', () => { it('should set data', () => { - publicKey.setPurpose(KeyPurpose.DECRYPTION); + publicKey.setPurpose(IdentityPublicKey.PURPOSES.DECRYPTION); - expect(publicKey.getPurpose()).to.equal(KeyPurpose.DECRYPTION); + expect(publicKey.getPurpose()).to.equal(IdentityPublicKey.PURPOSES.DECRYPTION); }); }); @@ -102,9 +97,9 @@ describe('IdentityPublicKey', () => { describe('#setSecurityLevel', () => { it('should set data', () => { - publicKey.setSecurityLevel(KeySecurityLevel.MEDIUM); + publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MEDIUM); - expect(publicKey.getSecurityLevel()).to.equal(KeySecurityLevel.MEDIUM); + expect(publicKey.getSecurityLevel()).to.equal(IdentityPublicKey.SECURITY_LEVELS.MEDIUM); }); }); @@ -152,8 +147,8 @@ describe('IdentityPublicKey', () => { id: 0, type: IdentityPublicKey.TYPES.ECDSA_HASH160, data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), - purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, readOnly: false, disabledAt: 123, }; @@ -170,10 +165,10 @@ describe('IdentityPublicKey', () => { it('should return original public key hash in case BLS12_381', () => { rawPublicKey = { id: 0, - type: KeyType.BLS12_381, + type: IdentityPublicKey.TYPES.BLS12_381, data: Buffer.from('01fac99ca2c8f39c286717c213e190aba4b7af76db320ec43f479b7d9a2012313a0ae59ca576edf801444bc694686694', 'hex'), - purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, readOnly: false, disabledAt: 123, }; @@ -190,10 +185,10 @@ describe('IdentityPublicKey', () => { it('should return data in case BIP13_SCRIPT_HASH', () => { rawPublicKey = { id: 0, - type: KeyType.BIP13_SCRIPT_HASH, + type: IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH, data: Buffer.from('54c557e07dde5bb6cb791c7a540e0a4796f5e97e', 'hex'), - purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, readOnly: false, disabledAt: 123, }; @@ -214,10 +209,10 @@ describe('IdentityPublicKey', () => { expect(jsonPublicKey).to.deep.equal({ id: 0, - type: KeyType.ECDSA_SECP256K1, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', - purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, readOnly: false, }); }); @@ -229,10 +224,10 @@ describe('IdentityPublicKey', () => { expect(jsonPublicKey).to.deep.equal({ id: 0, - type: KeyType.ECDSA_SECP256K1, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', - purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, readOnly: false, disabledAt: 42, }); @@ -241,7 +236,7 @@ describe('IdentityPublicKey', () => { describe('#isMaster', () => { it('should return true when public key has MASTER security level', () => { - publicKey.setSecurityLevel(KeySecurityLevel.MASTER); + publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); const result = publicKey.isMaster(); @@ -249,7 +244,7 @@ describe('IdentityPublicKey', () => { }); it('should return false when public key doesn\'t have MASTER security level', () => { - publicKey.setSecurityLevel(KeySecurityLevel.HIGH); + publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.HIGH); const result = publicKey.isMaster(); From 4f37000df02efc3e86ee9d8026ca4eb38f229b4b Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 16 Dec 2022 18:33:15 +0400 Subject: [PATCH 05/17] fix linting errors --- packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js index ed09ee7ecff..5652950a6ef 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js @@ -6,7 +6,7 @@ describe('IdentityPublicKey', () => { let IdentityPublicKey; beforeEach(async () => { - ({IdentityPublicKey} = await loadWasmDpp()); + ({ IdentityPublicKey } = await loadWasmDpp()); rawPublicKey = { id: 0, From a5618ac5515a46f5f2e76c96ed1104352510ac91 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 19 Dec 2022 12:43:48 +0400 Subject: [PATCH 06/17] fix ts compilation issue --- packages/wasm-dpp/lib/dpp.ts | 14 +++++++------- packages/wasm-dpp/lib/patchIdentifier.ts | 4 +++- packages/wasm-dpp/src/errors/consensus_error.rs | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/wasm-dpp/lib/dpp.ts b/packages/wasm-dpp/lib/dpp.ts index 4ee3ded55d7..538ae59fb4d 100644 --- a/packages/wasm-dpp/lib/dpp.ts +++ b/packages/wasm-dpp/lib/dpp.ts @@ -1,12 +1,5 @@ import * as dpp_module from '../wasm/wasm_dpp'; -// Declarations written prior to "export *" will overwrite exports -declare class IdentityPublicKey extends dpp_module.IdentityPublicKey { - static TYPES: typeof dpp_module.KeyType; - static PURPOSES: typeof dpp_module.KeyPurpose; - static SECURITY_LEVELS: typeof dpp_module.KeySecurityLevel; -} - // While we declared it above, those fields do not hold any values - let's assign them. // We need to suppress the compiler here, as he won't be happy about those reassignments. // @ts-ignore @@ -17,3 +10,10 @@ dpp_module.IdentityPublicKey.PURPOSES = dpp_module.KeyPurpose; dpp_module.IdentityPublicKey.SECURITY_LEVELS = dpp_module.KeySecurityLevel; export * from '../wasm/wasm_dpp'; + +// Declarations written prior to "export *" will overwrite exports +export declare class IdentityPublicKey extends dpp_module.IdentityPublicKey { + static TYPES: typeof dpp_module.KeyType; + static PURPOSES: typeof dpp_module.KeyPurpose; + static SECURITY_LEVELS: typeof dpp_module.KeySecurityLevel; +} diff --git a/packages/wasm-dpp/lib/patchIdentifier.ts b/packages/wasm-dpp/lib/patchIdentifier.ts index e5f2d0ba062..a40ea5d2f27 100644 --- a/packages/wasm-dpp/lib/patchIdentifier.ts +++ b/packages/wasm-dpp/lib/patchIdentifier.ts @@ -1,4 +1,4 @@ -import * as dpp_module from "../lib/dpp"; +import * as dpp_module from "./dpp"; // import { inspect } from 'util'; export default function (dppModule: typeof dpp_module) { @@ -8,6 +8,8 @@ export default function (dppModule: typeof dpp_module) { // be implemented in Rust directly. const { Identifier } = dppModule; + let kek = dppModule.IdentityPublicKey.TYPES.BLS12_381; + //@ts-ignore Object.setPrototypeOf(Identifier.prototype, Buffer.prototype); diff --git a/packages/wasm-dpp/src/errors/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus_error.rs index 3f089244c11..ea4482cc87c 100644 --- a/packages/wasm-dpp/src/errors/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus_error.rs @@ -27,7 +27,7 @@ use dpp::consensus::basic::identity::{ }; use dpp::consensus::basic::BasicError; use dpp::consensus::signature::SignatureError; -use dpp::StateError; +use dpp::{ProtocolError, StateError}; use wasm_bindgen::JsValue; use crate::errors::consensus::basic::data_contract::{ From 0084f9eec276ca9667adb71dc77d19191c8d65a7 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 19 Dec 2022 13:17:41 +0400 Subject: [PATCH 07/17] remove unnecessary code --- packages/wasm-dpp/lib/patchIdentifier.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/wasm-dpp/lib/patchIdentifier.ts b/packages/wasm-dpp/lib/patchIdentifier.ts index a40ea5d2f27..db4e911404e 100644 --- a/packages/wasm-dpp/lib/patchIdentifier.ts +++ b/packages/wasm-dpp/lib/patchIdentifier.ts @@ -8,8 +8,6 @@ export default function (dppModule: typeof dpp_module) { // be implemented in Rust directly. const { Identifier } = dppModule; - let kek = dppModule.IdentityPublicKey.TYPES.BLS12_381; - //@ts-ignore Object.setPrototypeOf(Identifier.prototype, Buffer.prototype); From 5c59effec0ab30c767ae59d4250f517f1b9405a4 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 19 Dec 2022 16:28:10 +0400 Subject: [PATCH 08/17] fix build issues --- .../data_contract_create_transition/validation.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs index ca2707f39c5..edc949bce64 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs @@ -7,6 +7,7 @@ use crate::{ validation_result::ValidationResultWasm, DataContractCreateTransitionWasm, }; +use crate::validation::ValidationResultWasm; #[wasm_bindgen(js_name=validateDataContractCreateTransitionState)] pub async fn validate_data_contract_create_transition_state( @@ -19,6 +20,6 @@ pub async fn validate_data_contract_create_transition_state( &state_transition.into(), ) .await - .map(Into::into) + .map(Into::::into) .map_err(from_dpp_err) } From 0332c01ff8699bb92c94e3db5ae2dad6880f406d Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 19 Dec 2022 16:33:05 +0400 Subject: [PATCH 09/17] reformat --- .../data_contract_create_transition/validation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs index edc949bce64..5e531e0834a 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs @@ -1,13 +1,13 @@ use dpp::data_contract::state_transition::data_contract_create_transition::validation::state::validate_data_contract_create_transition_state::validate_data_contract_create_transition_state as dpp_validate_data_contract_create_transition_state; use wasm_bindgen::prelude::*; +use crate::validation::ValidationResultWasm; use crate::{ errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation_result::ValidationResultWasm, DataContractCreateTransitionWasm, }; -use crate::validation::ValidationResultWasm; #[wasm_bindgen(js_name=validateDataContractCreateTransitionState)] pub async fn validate_data_contract_create_transition_state( From d3f5208854c4c49506b987ee4f5b2ea7155c83d3 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 19 Dec 2022 16:36:18 +0400 Subject: [PATCH 10/17] fix some other build errors --- .../data_contract_create_transition/validation.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs index 5e531e0834a..74c754d1aa5 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs @@ -5,7 +5,6 @@ use crate::validation::ValidationResultWasm; use crate::{ errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, - validation_result::ValidationResultWasm, DataContractCreateTransitionWasm, }; From 051605a626fc105cce71ccc67ce61799230b6181 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Wed, 21 Dec 2022 15:15:50 +0400 Subject: [PATCH 11/17] fix find duplicates by id in the documents batch validator --- .../rs-dpp/src/document/document_validator.rs | 2 +- .../validation/basic/find_duplicates_by_id.rs | 43 ++--- ...lidate_documents_batch_transition_basic.rs | 20 +- packages/rs-dpp/src/errors/codes.rs | 3 +- .../consensus/basic/abstract_basic_error.rs | 5 +- .../wasm-dpp/lib/AbstractConsensusError.ts | 58 ++++++ packages/wasm-dpp/lib/DPPError.ts | 15 ++ packages/wasm-dpp/lib/dpp.ts | 1 + packages/wasm-dpp/lib/extend.ts | 6 + packages/wasm-dpp/lib/patchConsensusErrors.ts | 179 ++++++++++++++++++ .../data_contract_max_depth_exceed_error.rs | 10 +- ...ate_document_transitions_with_ids_error.rs | 8 +- ...document_transitions_with_indices_error.rs | 36 ++++ .../missing_document_transition_type_error.rs | 20 ++ .../document/missing_document_type_error.rs | 20 -- .../errors/consensus/basic/document/mod.rs | 8 +- .../wasm-dpp/src/errors/consensus_error.rs | 18 +- 17 files changed, 382 insertions(+), 70 deletions(-) create mode 100644 packages/wasm-dpp/lib/AbstractConsensusError.ts create mode 100644 packages/wasm-dpp/lib/DPPError.ts create mode 100644 packages/wasm-dpp/lib/extend.ts create mode 100644 packages/wasm-dpp/lib/patchConsensusErrors.ts create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs delete mode 100644 packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs diff --git a/packages/rs-dpp/src/document/document_validator.rs b/packages/rs-dpp/src/document/document_validator.rs index 85d425791f2..d7d317adb2d 100644 --- a/packages/rs-dpp/src/document/document_validator.rs +++ b/packages/rs-dpp/src/document/document_validator.rs @@ -44,7 +44,7 @@ impl DocumentValidator { let maybe_document_type = raw_document.get(PROPERTY_DOCUMENT_TYPE); if maybe_document_type.is_none() { - result.add_error(BasicError::MissingDocumentTypeError); + result.add_error(BasicError::MissingDocumentTransitionTypeError); return Ok(result); } diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs index 9ac340b5d2e..d890da0cf61 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs @@ -1,41 +1,38 @@ use std::collections::{hash_map::Entry, HashMap}; +use anyhow::anyhow; +use sha2::digest::generic_array::functional::FunctionalSequence; +use serde_json::Value as JsonValue; -use crate::document::document_transition::{DocumentBaseTransition, DocumentTransition}; +use crate::document::document_transition::{DocumentBaseTransition, DocumentTransition, DocumentTransitionObjectLike}; use crate::util::string_encoding::Encoding; /// Find the duplicates in the collection of Document Transitions pub fn find_duplicates_by_id<'a>( - document_transitions: impl IntoIterator, -) -> Vec<&'a DocumentTransition> { - let mut fingerprints: HashMap = HashMap::new(); - let mut duplicates: Vec<&DocumentTransition> = vec![]; + document_transitions: impl IntoIterator, +) -> Result, anyhow::Error> { + let mut fingerprints: HashMap = HashMap::new(); + let mut duplicates: Vec = vec![]; - for dt in document_transitions { - match fingerprints.entry(create_fingerprint(dt)) { - Entry::Occupied(_) => { - duplicates.push(dt); + for transition in document_transitions { + let fingerprint = create_fingerprint(&transition).ok_or(anyhow!("Can't create fingerprint from a document transition"))?; + match fingerprints.entry(fingerprint.clone()) { + Entry::Occupied(val) => { + duplicates.push(val.get().clone()); } Entry::Vacant(v) => { - v.insert(()); + v.insert(transition.clone()); } } } - duplicates + Ok(duplicates) } -fn create_fingerprint(document_transition: &DocumentTransition) -> String { - match document_transition { - DocumentTransition::Create(ref dt) => fingerprint(&dt.base), - DocumentTransition::Delete(ref dt) => fingerprint(&dt.base), - DocumentTransition::Replace(ref dt) => fingerprint(&dt.base), - } -} -fn fingerprint(document: &DocumentBaseTransition) -> String { - format!( +fn create_fingerprint(document_transition: &JsonValue) -> Option { + Some(format!( "{}:{}", - document.data_contract_id.to_string(Encoding::Base58), - document.document_type - ) + document_transition.as_object()?.get("$type")?, + document_transition.as_object()?.get("id")?, + )) } #[cfg(test)] diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs index 711e5a96788..b4ce0eb4436 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs @@ -23,6 +23,7 @@ use crate::{ use anyhow::anyhow; use lazy_static::lazy_static; use serde_json::Value as JsonValue; +use crate::document::validation::basic::find_duplicates_by_id::find_duplicates_by_id; use super::{ find_duplicates_by_indices::find_duplicates_by_indices, @@ -209,7 +210,7 @@ fn validate_raw_transitions<'a>( for raw_document_transition in raw_document_transitions.iter() { let document_type = match raw_document_transition.get_string("$type") { Err(_) => { - result.add_error(BasicError::MissingDocumentTypeError); + result.add_error(BasicError::MissingDocumentTransitionTypeError); return Ok(result); } @@ -292,8 +293,7 @@ fn validate_raw_transitions<'a>( let raw_document_transitions_iter = raw_document_transitions.into_iter(); - let duplicate_transitions = - find_duplicates_by_indices(raw_document_transitions_iter.clone(), data_contract)?; + let duplicate_transitions = find_duplicates_by_id(raw_document_transitions_iter.clone())?; if !duplicate_transitions.is_empty() { let references: Vec<(String, Vec)> = duplicate_transitions .iter() @@ -306,6 +306,20 @@ fn validate_raw_transitions<'a>( result.add_error(BasicError::DuplicateDocumentTransitionsWithIdsError { references }); } + let duplicate_transitions_by_indices = + find_duplicates_by_indices(raw_document_transitions_iter.clone(), data_contract)?; + if !duplicate_transitions_by_indices.is_empty() { + let references: Vec<(String, Vec)> = duplicate_transitions_by_indices + .iter() + .map(|t| { + let doc_type = t.get_string("$type")?.to_string(); + let id = t.get_bytes("$id")?; + Ok((doc_type, id)) + }) + .collect::)>, anyhow::Error>>()?; + result.add_error(BasicError::DuplicateDocumentTransitionsWithIndicesError { references }); + } + let validation_result = validate_partial_compound_indices( raw_document_transitions_iter .clone() diff --git a/packages/rs-dpp/src/errors/codes.rs b/packages/rs-dpp/src/errors/codes.rs index 4fe5045e6d4..f670fd74bc8 100644 --- a/packages/rs-dpp/src/errors/codes.rs +++ b/packages/rs-dpp/src/errors/codes.rs @@ -103,12 +103,13 @@ impl ErrorWithCode for BasicError { // Document Self::DataContractNotPresent { .. } => 1018, Self::InvalidDocumentTypeError { .. } => 1024, - Self::MissingDocumentTypeError { .. } => 1027, + Self::MissingDocumentTransitionTypeError { .. } => 1027, Self::MissingDocumentTransitionActionError { .. } => 1026, Self::InvalidDocumentTransitionIdError { .. } => 1023, Self::InvalidDocumentTransitionActionError { .. } => 1022, Self::DuplicateDocumentTransitionsWithIdsError { .. } => 1019, + Self::DuplicateDocumentTransitionsWithIndicesError { .. } => 1020, Self::MissingDataContractIdError => 1025, Self::InvalidIdentifierError { .. } => 1006, diff --git a/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs index 10285b92634..56f2cbb36bb 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs @@ -48,7 +48,7 @@ pub enum BasicError { }, #[error("$type is not present")] - MissingDocumentTypeError, + MissingDocumentTransitionTypeError, #[error("$action is not present")] MissingDocumentTransitionActionError, @@ -69,6 +69,9 @@ pub enum BasicError { #[error("Document transitions with duplicate IDs {:?}", references)] DuplicateDocumentTransitionsWithIdsError { references: Vec<(String, Vec)> }, + #[error("Document transitions with duplicate unique properties: {:?}", references)] + DuplicateDocumentTransitionsWithIndicesError { references: Vec<(String, Vec)> }, + #[error("$dataContractId is not present")] MissingDataContractIdError, diff --git a/packages/wasm-dpp/lib/AbstractConsensusError.ts b/packages/wasm-dpp/lib/AbstractConsensusError.ts new file mode 100644 index 00000000000..3a8801e9069 --- /dev/null +++ b/packages/wasm-dpp/lib/AbstractConsensusError.ts @@ -0,0 +1,58 @@ +import { DPPError } from './DPPError' + +const CONSTRUCTOR_ARGUMENTS_SYMBOL = Symbol.for('constructorArguments'); + +/** + * @abstract + */ +export class AbstractConsensusError extends DPPError { + /** + * @param {string} message + */ + constructor(message) { + super(message); + + this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = []; + } + + /** + * @return {number} + */ + getCode() { + // Mitigate recursive dependency + + // eslint-disable-next-line global-require + const codes = require('./codes'); + + const code = Object.keys(codes) + .find((c) => this.constructor === codes[c]); + + if (!code) { + throw new Error('Error code is not defined'); + } + + return parseInt(code, 10); + } + + /** + * Get array of the error's arguments + * + * @returns {*[]} + */ + getConstructorArguments() { + return this[CONSTRUCTOR_ARGUMENTS_SYMBOL]; + } + + /** + * Set the error's arguments. + * Must be called from the constructor + * + * @protected + * @param {Object|Array} args + */ + setConstructorArguments(args) { + this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = Array.from(args); + } +} + +module.exports = AbstractConsensusError; diff --git a/packages/wasm-dpp/lib/DPPError.ts b/packages/wasm-dpp/lib/DPPError.ts new file mode 100644 index 00000000000..65f72178a17 --- /dev/null +++ b/packages/wasm-dpp/lib/DPPError.ts @@ -0,0 +1,15 @@ +export class DPPError extends Error { + /** + * @param {string} message + */ + constructor(message) { + super(); + + this.name = this.constructor.name; + this.message = message; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } +} diff --git a/packages/wasm-dpp/lib/dpp.ts b/packages/wasm-dpp/lib/dpp.ts index 538ae59fb4d..85888ee3b43 100644 --- a/packages/wasm-dpp/lib/dpp.ts +++ b/packages/wasm-dpp/lib/dpp.ts @@ -1,4 +1,5 @@ import * as dpp_module from '../wasm/wasm_dpp'; +import { patchConsensusErrors } from './patchConsensusErrors'; // While we declared it above, those fields do not hold any values - let's assign them. // We need to suppress the compiler here, as he won't be happy about those reassignments. diff --git a/packages/wasm-dpp/lib/extend.ts b/packages/wasm-dpp/lib/extend.ts new file mode 100644 index 00000000000..1078d7f2ce3 --- /dev/null +++ b/packages/wasm-dpp/lib/extend.ts @@ -0,0 +1,6 @@ +export function extend(Derived: any, Base: any) { + Object.setPrototypeOf( + Derived.prototype, + Base.prototype, + ); +} \ No newline at end of file diff --git a/packages/wasm-dpp/lib/patchConsensusErrors.ts b/packages/wasm-dpp/lib/patchConsensusErrors.ts new file mode 100644 index 00000000000..b7840eaf23c --- /dev/null +++ b/packages/wasm-dpp/lib/patchConsensusErrors.ts @@ -0,0 +1,179 @@ +import * as dpp_module from '../wasm/wasm_dpp'; +import { extend } from "./extend"; +import { AbstractConsensusError } from "./AbstractConsensusError"; + +const { + ProtocolVersionParsingError, + UnsupportedProtocolVersionError, + IncompatibleProtocolVersionError, + SerializedObjectParsingError, + JsonSchemaError, + InvalidIdentifierError, + DataContractMaxDepthExceedError, + DuplicateIndexError, + InvalidCompoundIndexError, + InvalidDataContractIdError, + InvalidIndexedPropertyConstraintError, + InvalidIndexPropertyTypeError, + SystemPropertyIndexAlreadyPresentError, + UndefinedIndexPropertyError, + UniqueIndicesLimitReachedError, + InconsistentCompoundIndexDataError, + InvalidDocumentTransitionActionError, + InvalidDocumentTransitionIdError, + DataContractNotPresentError, + InvalidDocumentTypeError, + MissingDataContractIdError, + MissingDocumentTransitionActionError, + MissingDocumentTransitionTypeError, + MissingDocumentTypeError, + DuplicatedIdentityPublicKeyError, + DuplicatedIdentityPublicKeyIdError, + MissingMasterPublicKeyError, + IdentityAssetLockProofLockedTransactionMismatchError, + IdentityAssetLockTransactionIsNotFoundError, + IdentityAssetLockTransactionOutPointAlreadyExistsError, + IdentityAssetLockTransactionOutputNotFoundError, + InvalidAssetLockProofCoreChainHeightError, + InvalidAssetLockProofTransactionHeightError, + InvalidIdentityAssetLockTransactionError, + InvalidIdentityAssetLockTransactionOutputError, + InvalidIdentityPublicKeyDataError, + InvalidIdentityPublicKeySecurityLevelError, + InvalidStateTransitionTypeError, + MissingStateTransitionTypeError, + StateTransitionMaxSizeExceededError, + IdentityNotFoundError, + InvalidIdentityPublicKeyTypeError, + InvalidStateTransitionSignatureError, + MissingPublicKeyError, + BalanceIsNotEnoughError, + DataContractAlreadyPresentError, + DataTriggerConditionError, + DataTriggerExecutionError, + DataTriggerInvalidResultError, + DocumentAlreadyPresentError, + DocumentNotFoundError, + DocumentOwnerIdMismatchError, + DocumentTimestampsMismatchError, + DocumentTimestampWindowViolationError, + DuplicateUniqueIndexError, + InvalidDocumentRevisionError, + IdentityAlreadyExistsError, + InvalidJsonSchemaRefError, + JsonSchemaCompilationError, + DuplicateDocumentTransitionsWithIdsError, + DuplicateDocumentTransitionsWithIndicesError, + InvalidAssetLockTransactionOutputReturnSizeError, + InvalidInstantAssetLockProofError, + InvalidInstantAssetLockProofSignatureError, + IncompatibleRe2PatternError, + InvalidDataContractVersionError, + IncompatibleDataContractSchemaError, + DataContractImmutablePropertiesUpdateError, + DataContractIndicesChangedError, + DuplicateIndexNameError, + DataContractInvalidIndexDefinitionUpdateError, + DataContractHaveNewUniqueIndexError, + IdentityPublicKeyDisabledAtWindowViolationError, + IdentityPublicKeyIsReadOnlyError, + InvalidIdentityPublicKeyIdError, + InvalidIdentityRevisionError, + StateMaxIdentityPublicKeyLimitReachedError, + DuplicatedIdentityPublicKeyStateError, + DuplicatedIdentityPublicKeyIdStateError, + InvalidIdentityKeySignatureError, + InvalidSignaturePublicKeySecurityLevelError, + PublicKeyIsDisabledError, + PublicKeySecurityLevelNotMetError, + WrongPublicKeyPurposeError, + IdentityPublicKeyIsDisabledError, +} = dpp_module; + +export function patchConsensusErrors() { + extend(ProtocolVersionParsingError, AbstractConsensusError); + extend(UnsupportedProtocolVersionError, AbstractConsensusError); + extend(IncompatibleProtocolVersionError, AbstractConsensusError); + extend(SerializedObjectParsingError, AbstractConsensusError); + extend(JsonSchemaError, AbstractConsensusError); + extend(InvalidIdentifierError, AbstractConsensusError); + extend(DataContractMaxDepthExceedError, AbstractConsensusError); + extend(DuplicateIndexError, AbstractConsensusError); + extend(InvalidCompoundIndexError, AbstractConsensusError); + extend(InvalidDataContractIdError, AbstractConsensusError); + extend(InvalidIndexedPropertyConstraintError, AbstractConsensusError); + extend(InvalidIndexPropertyTypeError, AbstractConsensusError); + extend(SystemPropertyIndexAlreadyPresentError, AbstractConsensusError); + extend(UndefinedIndexPropertyError, AbstractConsensusError); + extend(UniqueIndicesLimitReachedError, AbstractConsensusError); + extend(InconsistentCompoundIndexDataError, AbstractConsensusError); + extend(InvalidDocumentTransitionActionError, AbstractConsensusError); + extend(InvalidDocumentTransitionIdError, AbstractConsensusError); + extend(DataContractNotPresentError, AbstractConsensusError); + extend(InvalidDocumentTypeError, AbstractConsensusError); + extend(MissingDataContractIdError, AbstractConsensusError); + extend(MissingDocumentTransitionActionError, AbstractConsensusError); + extend(MissingDocumentTransitionTypeError, AbstractConsensusError); + extend(MissingDocumentTypeError, AbstractConsensusError); + extend(DuplicatedIdentityPublicKeyError, AbstractConsensusError); + extend(DuplicatedIdentityPublicKeyIdError, AbstractConsensusError); + extend(MissingMasterPublicKeyError, AbstractConsensusError); + extend(IdentityAssetLockProofLockedTransactionMismatchError, AbstractConsensusError); + extend(IdentityAssetLockTransactionIsNotFoundError, AbstractConsensusError); + extend(IdentityAssetLockTransactionOutPointAlreadyExistsError, AbstractConsensusError); + extend(IdentityAssetLockTransactionOutputNotFoundError, AbstractConsensusError); + extend(InvalidAssetLockProofCoreChainHeightError, AbstractConsensusError); + extend(InvalidAssetLockProofTransactionHeightError, AbstractConsensusError); + extend(InvalidIdentityAssetLockTransactionError, AbstractConsensusError); + extend(InvalidIdentityAssetLockTransactionOutputError, AbstractConsensusError); + extend(InvalidIdentityPublicKeyDataError, AbstractConsensusError); + extend(InvalidIdentityPublicKeySecurityLevelError, AbstractConsensusError); + extend(InvalidStateTransitionTypeError, AbstractConsensusError); + extend(MissingStateTransitionTypeError, AbstractConsensusError); + extend(StateTransitionMaxSizeExceededError, AbstractConsensusError); + extend(IdentityNotFoundError, AbstractConsensusError); + extend(InvalidIdentityPublicKeyTypeError, AbstractConsensusError); + extend(InvalidStateTransitionSignatureError, AbstractConsensusError); + extend(MissingPublicKeyError, AbstractConsensusError); + extend(BalanceIsNotEnoughError, AbstractConsensusError); + extend(DataContractAlreadyPresentError, AbstractConsensusError); + extend(DataTriggerConditionError, AbstractConsensusError); + extend(DataTriggerExecutionError, AbstractConsensusError); + extend(DataTriggerInvalidResultError, AbstractConsensusError); + extend(DocumentAlreadyPresentError, AbstractConsensusError); + extend(DocumentNotFoundError, AbstractConsensusError); + extend(DocumentOwnerIdMismatchError, AbstractConsensusError); + extend(DocumentTimestampsMismatchError, AbstractConsensusError); + extend(DocumentTimestampWindowViolationError, AbstractConsensusError); + extend(DuplicateUniqueIndexError, AbstractConsensusError); + extend(InvalidDocumentRevisionError, AbstractConsensusError); + extend(IdentityAlreadyExistsError, AbstractConsensusError); + extend(InvalidJsonSchemaRefError, AbstractConsensusError); + extend(JsonSchemaCompilationError, AbstractConsensusError); + extend(DuplicateDocumentTransitionsWithIdsError, AbstractConsensusError); + extend(DuplicateDocumentTransitionsWithIndicesError, AbstractConsensusError); + extend(InvalidAssetLockTransactionOutputReturnSizeError, AbstractConsensusError); + extend(InvalidInstantAssetLockProofError, AbstractConsensusError); + extend(InvalidInstantAssetLockProofSignatureError, AbstractConsensusError); + extend(IncompatibleRe2PatternError, AbstractConsensusError); + extend(InvalidDataContractVersionError, AbstractConsensusError); + extend(IncompatibleDataContractSchemaError, AbstractConsensusError); + extend(DataContractImmutablePropertiesUpdateError, AbstractConsensusError); + extend(DataContractIndicesChangedError, AbstractConsensusError); + extend(DuplicateIndexNameError, AbstractConsensusError); + extend(DataContractInvalidIndexDefinitionUpdateError, AbstractConsensusError); + extend(DataContractHaveNewUniqueIndexError, AbstractConsensusError); + extend(IdentityPublicKeyDisabledAtWindowViolationError, AbstractConsensusError); + extend(IdentityPublicKeyIsReadOnlyError, AbstractConsensusError); + extend(InvalidIdentityPublicKeyIdError, AbstractConsensusError); + extend(InvalidIdentityRevisionError, AbstractConsensusError); + extend(StateMaxIdentityPublicKeyLimitReachedError, AbstractConsensusError); + extend(DuplicatedIdentityPublicKeyStateError, AbstractConsensusError); + extend(DuplicatedIdentityPublicKeyIdStateError, AbstractConsensusError); + extend(InvalidIdentityKeySignatureError, AbstractConsensusError); + extend(InvalidSignaturePublicKeySecurityLevelError, AbstractConsensusError); + extend(PublicKeyIsDisabledError, AbstractConsensusError); + extend(PublicKeySecurityLevelNotMetError, AbstractConsensusError); + extend(WrongPublicKeyPurposeError, AbstractConsensusError); + extend(IdentityPublicKeyIsDisabledError, AbstractConsensusError); +} \ No newline at end of file diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs index a7dee9fbfa2..38b1df3a3d9 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs @@ -1,19 +1,19 @@ use wasm_bindgen::prelude::*; -#[wasm_bindgen(js_name=DataContractMaxDepthError)] -pub struct DataContractMaxDepthErrorWasm { +#[wasm_bindgen(js_name=DataContractMaxDepthExceedError)] +pub struct DataContractMaxDepthExceedErrorWasm { depth: usize, code: u32, } -impl DataContractMaxDepthErrorWasm { +impl DataContractMaxDepthExceedErrorWasm { pub fn new(depth: usize, code: u32) -> Self { - DataContractMaxDepthErrorWasm { depth, code } + DataContractMaxDepthExceedErrorWasm { depth, code } } } #[wasm_bindgen(js_class=DataContractMaxDepthError)] -impl DataContractMaxDepthErrorWasm { +impl DataContractMaxDepthExceedErrorWasm { #[wasm_bindgen(js_name=getDepth)] pub fn get_expected_version(&self) -> usize { self.depth diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs index f70812c43d0..159c6f58517 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs @@ -3,19 +3,19 @@ use std::iter::FromIterator; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicateDocumentTransitionsWithIdsError)] -pub struct DuplicateDocumentTransitionsWithIdsError { +pub struct DuplicateDocumentTransitionsWithIdsErrorWasm { references: Vec<(String, Vec)>, code: u32, } -impl DuplicateDocumentTransitionsWithIdsError { +impl DuplicateDocumentTransitionsWithIdsErrorWasm { pub fn new(references: Vec<(String, Vec)>, code: u32) -> Self { - DuplicateDocumentTransitionsWithIdsError { references, code } + DuplicateDocumentTransitionsWithIdsErrorWasm { references, code } } } #[wasm_bindgen(js_class=DuplicateDocumentTransitionsWithIdsError)] -impl DuplicateDocumentTransitionsWithIdsError { +impl DuplicateDocumentTransitionsWithIdsErrorWasm { #[wasm_bindgen(js_name=getReferences)] pub fn get_references(&self) -> js_sys::Array { self.references diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs new file mode 100644 index 00000000000..ea8aba9e100 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs @@ -0,0 +1,36 @@ +use crate::buffer::Buffer; +use std::iter::FromIterator; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=DuplicateDocumentTransitionsWithIndicesError)] +pub struct DuplicateDocumentTransitionsWithIndicesErrorWasm { + references: Vec<(String, Vec)>, + code: u32, +} + +impl DuplicateDocumentTransitionsWithIndicesErrorWasm { + pub fn new(references: Vec<(String, Vec)>, code: u32) -> Self { + DuplicateDocumentTransitionsWithIndicesErrorWasm { references, code } + } +} + +#[wasm_bindgen(js_class=DuplicateDocumentTransitionsWithIndicesError)] +impl DuplicateDocumentTransitionsWithIndicesErrorWasm { + #[wasm_bindgen(js_name=getReferences)] + pub fn get_references(&self) -> js_sys::Array { + self.references + .iter() + .map(|v| { + js_sys::Array::from_iter(vec![ + JsValue::from(v.0.clone()), + JsValue::from(Buffer::from_bytes(&v.1)), + ]) + }) + .collect() + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + self.code + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs new file mode 100644 index 00000000000..88d77f2e111 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs @@ -0,0 +1,20 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=MissingDocumentTransitionTypeError)] +pub struct MissingDocumentTransitionTypeErrorWasm { + code: u32, +} + +impl MissingDocumentTransitionTypeErrorWasm { + pub fn new(code: u32) -> Self { + MissingDocumentTransitionTypeErrorWasm { code } + } +} + +#[wasm_bindgen(js_class=MissingDocumentTypeError)] +impl MissingDocumentTransitionTypeErrorWasm { + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + self.code + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs deleted file mode 100644 index 34d5689d6fc..00000000000 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs +++ /dev/null @@ -1,20 +0,0 @@ -use wasm_bindgen::prelude::*; - -#[wasm_bindgen(js_name=MissingDocumentTypeError)] -pub struct MissingDocumentTypeErrorWasm { - code: u32, -} - -impl MissingDocumentTypeErrorWasm { - pub fn new(code: u32) -> Self { - MissingDocumentTypeErrorWasm { code } - } -} - -#[wasm_bindgen(js_class=MissingDocumentTypeError)] -impl MissingDocumentTypeErrorWasm { - #[wasm_bindgen(js_name=getCode)] - pub fn get_code(&self) -> u32 { - self.code - } -} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs index 4f580104f26..6114c6c7fb5 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs @@ -1,19 +1,21 @@ mod data_contract_not_present_error; -mod duplicate_document_transitions_with_ids_error; +mod duplicate_document_transitions_with_indices_error; mod inconsistent_compound_index_data_error; mod invalid_document_transition_action_error; mod invalid_document_transition_id_error; mod invalid_document_type_error; mod missing_data_contract_id_error; mod missing_document_transition_action_error; -mod missing_document_type_error; +mod missing_document_transition_type_error; +mod duplicate_document_transitions_with_ids_error; pub use data_contract_not_present_error::*; pub use duplicate_document_transitions_with_ids_error::*; +pub use duplicate_document_transitions_with_indices_error::*; pub use inconsistent_compound_index_data_error::*; pub use invalid_document_transition_action_error::*; pub use invalid_document_transition_id_error::*; pub use invalid_document_type_error::*; pub use missing_data_contract_id_error::*; pub use missing_document_transition_action_error::*; -pub use missing_document_type_error::*; +pub use missing_document_transition_type_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus_error.rs index ea4482cc87c..8c466edc2c3 100644 --- a/packages/wasm-dpp/src/errors/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus_error.rs @@ -35,10 +35,7 @@ use crate::errors::consensus::basic::data_contract::{ DataContractInvalidIndexDefinitionUpdateErrorWasm, DataContractUniqueIndicesChangedErrorWasm, IncompatibleDataContractSchemaErrorWasm, InvalidDataContractIdErrorWasm, }; -use crate::errors::consensus::basic::document::{ - DuplicateDocumentTransitionsWithIdsError, InvalidDocumentTransitionActionErrorWasm, - InvalidDocumentTransitionIdErrorWasm, MissingDataContractIdErrorWasm, -}; +use crate::errors::consensus::basic::document::{DuplicateDocumentTransitionsWithIdsErrorWasm, DuplicateDocumentTransitionsWithIndicesErrorWasm, InvalidDocumentTransitionActionErrorWasm, InvalidDocumentTransitionIdErrorWasm, MissingDataContractIdErrorWasm}; use crate::errors::consensus::basic::state_transition::{ InvalidStateTransitionTypeErrorWasm, MissingStateTransitionTypeErrorWasm, StateTransitionMaxSizeExceededErrorWasm, @@ -62,7 +59,7 @@ use crate::errors::consensus::state::identity::{ use dpp::errors::DataTriggerError; use super::consensus::basic::data_contract::{ - DataContractMaxDepthErrorWasm, DuplicateIndexErrorWasm, DuplicateIndexNameErrorWasm, + DataContractMaxDepthExceedErrorWasm, DuplicateIndexErrorWasm, DuplicateIndexNameErrorWasm, IncompatibleRe2PatternErrorWasm, InvalidCompoundIndexErrorWasm, InvalidDataContractVersionErrorWasm, InvalidIndexPropertyTypeErrorWasm, InvalidIndexedPropertyConstraintErrorWasm, InvalidJsonSchemaRefErrorWasm, @@ -75,7 +72,7 @@ use super::consensus::basic::decode::{ use super::consensus::basic::document::{ DataContractNotPresentErrorWasm, InconsistentCompoundIndexDataErrorWasm, InvalidDocumentTypeErrorWasm, MissingDocumentTransitionActionErrorWasm, - MissingDocumentTypeErrorWasm, + MissingDocumentTransitionTypeErrorWasm, }; use super::consensus::basic::identity::{ InvalidIdentityPublicKeyTypeErrorWasm, MissingPublicKeyErrorWasm, @@ -351,7 +348,7 @@ fn from_basic_error(basic_error: &Box) -> JsValue { version, } => InvalidDataContractVersionErrorWasm::new(*expected_version, *version, code).into(), BasicError::DataContractMaxDepthExceedError(depth) => { - DataContractMaxDepthErrorWasm::new(*depth, code).into() + DataContractMaxDepthExceedErrorWasm::new(*depth, code).into() } BasicError::InvalidDocumentTypeError { document_type, @@ -457,7 +454,7 @@ fn from_basic_error(basic_error: &Box) -> JsValue { code, ) .into(), - BasicError::MissingDocumentTypeError => MissingDocumentTypeErrorWasm::new(code).into(), + BasicError::MissingDocumentTransitionTypeError => MissingDocumentTransitionTypeErrorWasm::new(code).into(), BasicError::MissingDocumentTransitionActionError => { MissingDocumentTransitionActionErrorWasm::new(code).into() } @@ -472,8 +469,11 @@ fn from_basic_error(basic_error: &Box) -> JsValue { InvalidDocumentTransitionIdErrorWasm::new(expected_id.clone(), invalid_id.clone(), code) .into() } + BasicError::DuplicateDocumentTransitionsWithIndicesError { references } => { + DuplicateDocumentTransitionsWithIndicesErrorWasm::new(references.clone(), code).into() + } BasicError::DuplicateDocumentTransitionsWithIdsError { references } => { - DuplicateDocumentTransitionsWithIdsError::new(references.clone(), code).into() + DuplicateDocumentTransitionsWithIdsErrorWasm::new(references.clone(), code).into() } BasicError::MissingDataContractIdError => MissingDataContractIdErrorWasm::new(code).into(), BasicError::InvalidIdentifierError { From 1136f7584b10118d19ca6a114070fee7d04f0e3d Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Wed, 21 Dec 2022 16:18:44 +0400 Subject: [PATCH 12/17] fix error code in `DataContractUniqueIndicesChangedError` --- packages/js-dpp/lib/errors/consensus/codes.js | 4 ++-- packages/rs-dpp/src/errors/codes.rs | 2 +- packages/wasm-dpp/lib/patchConsensusErrors.ts | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/js-dpp/lib/errors/consensus/codes.js b/packages/js-dpp/lib/errors/consensus/codes.js index 91883e22770..3511cedcda5 100644 --- a/packages/js-dpp/lib/errors/consensus/codes.js +++ b/packages/js-dpp/lib/errors/consensus/codes.js @@ -66,7 +66,7 @@ const IncompatibleRe2PatternError = require('./basic/dataContract/IncompatibleRe const InvalidDataContractVersionError = require('./basic/dataContract/InvalidDataContractVersionError'); const IncompatibleDataContractSchemaError = require('./basic/dataContract/IncompatibleDataContractSchemaError'); const DataContractImmutablePropertiesUpdateError = require('./basic/dataContract/DataContractImmutablePropertiesUpdateError'); -const DataContractIndicesChangedError = require('./basic/dataContract/DataContractUniqueIndicesChangedError'); +const DataContractUniqueIndicesChangedError = require('./basic/dataContract/DataContractUniqueIndicesChangedError'); const DuplicateIndexNameError = require('./basic/dataContract/DuplicateIndexNameError'); const DataContractInvalidIndexDefinitionUpdateError = require('./basic/dataContract/DataContractInvalidIndexDefinitionUpdateError'); const DataContractHaveNewUniqueIndexError = require('./basic/dataContract/DataContractHaveNewUniqueIndexError'); @@ -116,7 +116,7 @@ const codes = { 1050: InvalidDataContractVersionError, 1051: IncompatibleDataContractSchemaError, 1052: DataContractImmutablePropertiesUpdateError, - 1053: DataContractIndicesChangedError, + 1053: DataContractUniqueIndicesChangedError, 1054: DataContractInvalidIndexDefinitionUpdateError, 1055: DataContractHaveNewUniqueIndexError, diff --git a/packages/rs-dpp/src/errors/codes.rs b/packages/rs-dpp/src/errors/codes.rs index f670fd74bc8..6a26476128a 100644 --- a/packages/rs-dpp/src/errors/codes.rs +++ b/packages/rs-dpp/src/errors/codes.rs @@ -123,7 +123,7 @@ impl ErrorWithCode for BasicError { Self::DataContractImmutablePropertiesUpdateError { .. } => 1052, Self::IncompatibleDataContractSchemaError { .. } => 1051, - Self::DataContractUniqueIndicesChangedError { .. } => 4016, + Self::DataContractUniqueIndicesChangedError { .. } => 1053, // TODO - they don't have error codes in https://github.com/dashevo/platform/blob/25ab6d8a38880eaff6ac119126b2ee5991b2a5aa/packages/js-dpp/lib/errors/consensus/codes.js Self::DataContractHaveNewUniqueIndexError { .. } => 0, Self::DataContractInvalidIndexDefinitionUpdateError { .. } => 0, diff --git a/packages/wasm-dpp/lib/patchConsensusErrors.ts b/packages/wasm-dpp/lib/patchConsensusErrors.ts index b7840eaf23c..2032b3bea30 100644 --- a/packages/wasm-dpp/lib/patchConsensusErrors.ts +++ b/packages/wasm-dpp/lib/patchConsensusErrors.ts @@ -71,7 +71,7 @@ const { InvalidDataContractVersionError, IncompatibleDataContractSchemaError, DataContractImmutablePropertiesUpdateError, - DataContractIndicesChangedError, + DataContractUniqueIndicesChangedError, DuplicateIndexNameError, DataContractInvalidIndexDefinitionUpdateError, DataContractHaveNewUniqueIndexError, @@ -79,8 +79,8 @@ const { IdentityPublicKeyIsReadOnlyError, InvalidIdentityPublicKeyIdError, InvalidIdentityRevisionError, - StateMaxIdentityPublicKeyLimitReachedError, - DuplicatedIdentityPublicKeyStateError, + MaxIdentityPublicKeyLimitReachedError, + DuplicatedIdentityPublicKeyError, DuplicatedIdentityPublicKeyIdStateError, InvalidIdentityKeySignatureError, InvalidSignaturePublicKeySecurityLevelError, @@ -159,7 +159,7 @@ export function patchConsensusErrors() { extend(InvalidDataContractVersionError, AbstractConsensusError); extend(IncompatibleDataContractSchemaError, AbstractConsensusError); extend(DataContractImmutablePropertiesUpdateError, AbstractConsensusError); - extend(DataContractIndicesChangedError, AbstractConsensusError); + extend(DataContractUniqueIndicesChangedError, AbstractConsensusError); extend(DuplicateIndexNameError, AbstractConsensusError); extend(DataContractInvalidIndexDefinitionUpdateError, AbstractConsensusError); extend(DataContractHaveNewUniqueIndexError, AbstractConsensusError); @@ -167,7 +167,7 @@ export function patchConsensusErrors() { extend(IdentityPublicKeyIsReadOnlyError, AbstractConsensusError); extend(InvalidIdentityPublicKeyIdError, AbstractConsensusError); extend(InvalidIdentityRevisionError, AbstractConsensusError); - extend(StateMaxIdentityPublicKeyLimitReachedError, AbstractConsensusError); + extend(MaxIdentityPublicKeyLimitReachedError, AbstractConsensusError); extend(DuplicatedIdentityPublicKeyStateError, AbstractConsensusError); extend(DuplicatedIdentityPublicKeyIdStateError, AbstractConsensusError); extend(InvalidIdentityKeySignatureError, AbstractConsensusError); From d14fa336abcfa37ef3bc4151b369cc4415cef0e3 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 26 Dec 2022 12:59:42 +0400 Subject: [PATCH 13/17] fix AbstractConsensusError handling --- .../rs-dpp/src/document/document_validator.rs | 2 +- .../validation/basic/find_duplicates_by_id.rs | 12 ++- ...lidate_documents_batch_transition_basic.rs | 2 +- packages/rs-dpp/src/errors/codes.rs | 5 +- .../consensus/abstract_consensus_error.rs | 12 +-- .../consensus/basic/abstract_basic_error.rs | 8 +- .../validation/public_keys_validator_spec.rs | 9 +- .../wasm-dpp/lib/AbstractConsensusError.ts | 84 +++++++++---------- packages/wasm-dpp/lib/DPPError.ts | 8 +- packages/wasm-dpp/lib/dpp.ts | 4 + packages/wasm-dpp/lib/patchConsensusErrors.ts | 9 +- .../wasm-dpp/lib/test/expect/expectError.js | 2 +- .../data_contract_factory.rs | 2 +- .../missing_document_transition_type_error.rs | 2 +- .../document/missing_document_type_error.rs | 20 +++++ .../errors/consensus/basic/document/mod.rs | 4 +- .../wasm-dpp/src/errors/consensus_error.rs | 15 +++- 17 files changed, 123 insertions(+), 77 deletions(-) create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs diff --git a/packages/rs-dpp/src/document/document_validator.rs b/packages/rs-dpp/src/document/document_validator.rs index d7d317adb2d..85d425791f2 100644 --- a/packages/rs-dpp/src/document/document_validator.rs +++ b/packages/rs-dpp/src/document/document_validator.rs @@ -44,7 +44,7 @@ impl DocumentValidator { let maybe_document_type = raw_document.get(PROPERTY_DOCUMENT_TYPE); if maybe_document_type.is_none() { - result.add_error(BasicError::MissingDocumentTransitionTypeError); + result.add_error(BasicError::MissingDocumentTypeError); return Ok(result); } diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs index d890da0cf61..7434ff39d72 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/find_duplicates_by_id.rs @@ -1,9 +1,11 @@ -use std::collections::{hash_map::Entry, HashMap}; use anyhow::anyhow; -use sha2::digest::generic_array::functional::FunctionalSequence; use serde_json::Value as JsonValue; +use sha2::digest::generic_array::functional::FunctionalSequence; +use std::collections::{hash_map::Entry, HashMap}; -use crate::document::document_transition::{DocumentBaseTransition, DocumentTransition, DocumentTransitionObjectLike}; +use crate::document::document_transition::{ + DocumentBaseTransition, DocumentTransition, DocumentTransitionObjectLike, +}; use crate::util::string_encoding::Encoding; /// Find the duplicates in the collection of Document Transitions @@ -14,7 +16,9 @@ pub fn find_duplicates_by_id<'a>( let mut duplicates: Vec = vec![]; for transition in document_transitions { - let fingerprint = create_fingerprint(&transition).ok_or(anyhow!("Can't create fingerprint from a document transition"))?; + let fingerprint = create_fingerprint(&transition).ok_or(anyhow!( + "Can't create fingerprint from a document transition" + ))?; match fingerprints.entry(fingerprint.clone()) { Entry::Occupied(val) => { duplicates.push(val.get().clone()); diff --git a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs index b4ce0eb4436..2f52d09914f 100644 --- a/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +++ b/packages/rs-dpp/src/document/state_transition/documents_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs @@ -3,6 +3,7 @@ use std::{ convert::{TryFrom, TryInto}, }; +use crate::document::validation::basic::find_duplicates_by_id::find_duplicates_by_id; use crate::{ consensus::basic::BasicError, data_contract::{ @@ -23,7 +24,6 @@ use crate::{ use anyhow::anyhow; use lazy_static::lazy_static; use serde_json::Value as JsonValue; -use crate::document::validation::basic::find_duplicates_by_id::find_duplicates_by_id; use super::{ find_duplicates_by_indices::find_duplicates_by_indices, diff --git a/packages/rs-dpp/src/errors/codes.rs b/packages/rs-dpp/src/errors/codes.rs index 6a26476128a..c0db2664d05 100644 --- a/packages/rs-dpp/src/errors/codes.rs +++ b/packages/rs-dpp/src/errors/codes.rs @@ -25,8 +25,8 @@ impl ErrorWithCode for ConsensusError { Self::IncompatibleProtocolVersionError(_) => 1003, // Identity - Self::DuplicatedIdentityPublicKeyError(_) => 1029, - Self::DuplicatedIdentityPublicKeyIdError(_) => 1030, + Self::DuplicatedIdentityPublicKeyBasicError(_) => 1029, + Self::DuplicatedIdentityPublicKeyBasicIdError(_) => 1030, Self::IdentityAssetLockProofLockedTransactionMismatchError(_) => 1031, Self::IdentityAssetLockTransactionIsNotFoundError(_) => 1032, Self::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) => 1033, @@ -105,6 +105,7 @@ impl ErrorWithCode for BasicError { Self::InvalidDocumentTypeError { .. } => 1024, Self::MissingDocumentTransitionTypeError { .. } => 1027, Self::MissingDocumentTransitionActionError { .. } => 1026, + Self::MissingDocumentTypeError => 1028, Self::InvalidDocumentTransitionIdError { .. } => 1023, Self::InvalidDocumentTransitionActionError { .. } => 1022, diff --git a/packages/rs-dpp/src/errors/consensus/abstract_consensus_error.rs b/packages/rs-dpp/src/errors/consensus/abstract_consensus_error.rs index 9b2a4392dde..83652786526 100644 --- a/packages/rs-dpp/src/errors/consensus/abstract_consensus_error.rs +++ b/packages/rs-dpp/src/errors/consensus/abstract_consensus_error.rs @@ -39,13 +39,13 @@ pub enum ConsensusError { #[error("{0}")] IncompatibleProtocolVersionError(IncompatibleProtocolVersionError), #[error("{0}")] - DuplicatedIdentityPublicKeyIdError(DuplicatedIdentityPublicKeyIdError), + DuplicatedIdentityPublicKeyBasicIdError(DuplicatedIdentityPublicKeyIdError), #[error("{0}")] InvalidIdentityPublicKeyDataError(InvalidIdentityPublicKeyDataError), #[error("{0}")] InvalidIdentityPublicKeySecurityLevelError(InvalidIdentityPublicKeySecurityLevelError), #[error("{0}")] - DuplicatedIdentityPublicKeyError(DuplicatedIdentityPublicKeyError), + DuplicatedIdentityPublicKeyBasicError(DuplicatedIdentityPublicKeyError), #[error("{0}")] MissingMasterPublicKeyError(MissingMasterPublicKeyError), #[error("{0}")] @@ -144,8 +144,8 @@ impl ConsensusError { ConsensusError::IncompatibleProtocolVersionError(_) => 1003, // Identity - ConsensusError::DuplicatedIdentityPublicKeyError(_) => 1029, - ConsensusError::DuplicatedIdentityPublicKeyIdError(_) => 1030, + ConsensusError::DuplicatedIdentityPublicKeyBasicError(_) => 1029, + ConsensusError::DuplicatedIdentityPublicKeyBasicIdError(_) => 1030, ConsensusError::IdentityAssetLockProofLockedTransactionMismatchError(_) => 1031, ConsensusError::IdentityAssetLockTransactionIsNotFoundError(_) => 1032, ConsensusError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) => 1033, @@ -204,7 +204,7 @@ impl From for ConsensusError { impl From for ConsensusError { fn from(error: DuplicatedIdentityPublicKeyIdError) -> Self { - Self::DuplicatedIdentityPublicKeyIdError(error) + Self::DuplicatedIdentityPublicKeyBasicIdError(error) } } @@ -222,7 +222,7 @@ impl From for ConsensusError { impl From for ConsensusError { fn from(error: DuplicatedIdentityPublicKeyError) -> Self { - Self::DuplicatedIdentityPublicKeyError(error) + Self::DuplicatedIdentityPublicKeyBasicError(error) } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs index 56f2cbb36bb..ca52aa8191a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/abstract_basic_error.rs @@ -50,6 +50,9 @@ pub enum BasicError { #[error("$type is not present")] MissingDocumentTransitionTypeError, + #[error("$type is not present")] + MissingDocumentTypeError, + #[error("$action is not present")] MissingDocumentTransitionActionError, @@ -69,7 +72,10 @@ pub enum BasicError { #[error("Document transitions with duplicate IDs {:?}", references)] DuplicateDocumentTransitionsWithIdsError { references: Vec<(String, Vec)> }, - #[error("Document transitions with duplicate unique properties: {:?}", references)] + #[error( + "Document transitions with duplicate unique properties: {:?}", + references + )] DuplicateDocumentTransitionsWithIndicesError { references: Vec<(String, Vec)> }, #[error("$dataContractId is not present")] diff --git a/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs b/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs index 0ca453a1028..099f8628874 100644 --- a/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/validation/public_keys_validator_spec.rs @@ -340,7 +340,7 @@ pub fn should_return_invalid_result_if_there_are_duplicate_key_ids() { let errors = assert_consensus_errors!( result, - ConsensusError::DuplicatedIdentityPublicKeyIdError, + ConsensusError::DuplicatedIdentityPublicKeyBasicIdError, 1 ); let consensus_error = result.errors().first().unwrap(); @@ -372,8 +372,11 @@ pub fn should_return_invalid_result_if_there_are_duplicate_keys() { ); let result = validator.validate_keys(&raw_public_keys).unwrap(); - let errors = - assert_consensus_errors!(&result, ConsensusError::DuplicatedIdentityPublicKeyError, 1); + let errors = assert_consensus_errors!( + &result, + ConsensusError::DuplicatedIdentityPublicKeyBasicError, + 1 + ); let consensus_error = result.errors().first().unwrap(); let error = errors.get(0).unwrap(); diff --git a/packages/wasm-dpp/lib/AbstractConsensusError.ts b/packages/wasm-dpp/lib/AbstractConsensusError.ts index 3a8801e9069..15c92f0a3ed 100644 --- a/packages/wasm-dpp/lib/AbstractConsensusError.ts +++ b/packages/wasm-dpp/lib/AbstractConsensusError.ts @@ -1,6 +1,6 @@ import { DPPError } from './DPPError' -const CONSTRUCTOR_ARGUMENTS_SYMBOL = Symbol.for('constructorArguments'); +//const CONSTRUCTOR_ARGUMENTS_SYMBOL = Symbol.for('constructorArguments'); /** * @abstract @@ -9,50 +9,48 @@ export class AbstractConsensusError extends DPPError { /** * @param {string} message */ - constructor(message) { + constructor(message: string) { super(message); - this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = []; + // this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = []; } - /** - * @return {number} - */ - getCode() { - // Mitigate recursive dependency - - // eslint-disable-next-line global-require - const codes = require('./codes'); - - const code = Object.keys(codes) - .find((c) => this.constructor === codes[c]); - - if (!code) { - throw new Error('Error code is not defined'); - } - - return parseInt(code, 10); - } - - /** - * Get array of the error's arguments - * - * @returns {*[]} - */ - getConstructorArguments() { - return this[CONSTRUCTOR_ARGUMENTS_SYMBOL]; - } - - /** - * Set the error's arguments. - * Must be called from the constructor - * - * @protected - * @param {Object|Array} args - */ - setConstructorArguments(args) { - this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = Array.from(args); - } + // /** + // * @return {number} + // */ + // getCode() { + // // Mitigate recursive dependency + // + // // eslint-disable-next-line global-require + // const codes = require('./codes'); + // + // const code = Object.keys(codes) + // .find((c) => this.constructor === codes[c]); + // + // if (!code) { + // throw new Error('Error code is not defined'); + // } + // + // return parseInt(code, 10); + // } + // + // /** + // * Get array of the error's arguments + // * + // * @returns {*[]} + // */ + // getConstructorArguments() { + // return this[CONSTRUCTOR_ARGUMENTS_SYMBOL]; + // } + // + // /** + // * Set the error's arguments. + // * Must be called from the constructor + // * + // * @protected + // * @param {Object|Array} args + // */ + // setConstructorArguments(args) { + // this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = Array.from(args); + // } } - -module.exports = AbstractConsensusError; diff --git a/packages/wasm-dpp/lib/DPPError.ts b/packages/wasm-dpp/lib/DPPError.ts index 65f72178a17..395c92427eb 100644 --- a/packages/wasm-dpp/lib/DPPError.ts +++ b/packages/wasm-dpp/lib/DPPError.ts @@ -1,8 +1,8 @@ export class DPPError extends Error { - /** - * @param {string} message - */ - constructor(message) { + name: string; + message: string; + + constructor(message: string) { super(); this.name = this.constructor.name; diff --git a/packages/wasm-dpp/lib/dpp.ts b/packages/wasm-dpp/lib/dpp.ts index 85888ee3b43..e2055302b76 100644 --- a/packages/wasm-dpp/lib/dpp.ts +++ b/packages/wasm-dpp/lib/dpp.ts @@ -1,6 +1,8 @@ import * as dpp_module from '../wasm/wasm_dpp'; import { patchConsensusErrors } from './patchConsensusErrors'; +patchConsensusErrors(); + // While we declared it above, those fields do not hold any values - let's assign them. // We need to suppress the compiler here, as he won't be happy about those reassignments. // @ts-ignore @@ -11,6 +13,8 @@ dpp_module.IdentityPublicKey.PURPOSES = dpp_module.KeyPurpose; dpp_module.IdentityPublicKey.SECURITY_LEVELS = dpp_module.KeySecurityLevel; export * from '../wasm/wasm_dpp'; +export * from './AbstractConsensusError'; +export * from './DPPError'; // Declarations written prior to "export *" will overwrite exports export declare class IdentityPublicKey extends dpp_module.IdentityPublicKey { diff --git a/packages/wasm-dpp/lib/patchConsensusErrors.ts b/packages/wasm-dpp/lib/patchConsensusErrors.ts index 2032b3bea30..7a3aba44b3a 100644 --- a/packages/wasm-dpp/lib/patchConsensusErrors.ts +++ b/packages/wasm-dpp/lib/patchConsensusErrors.ts @@ -80,8 +80,9 @@ const { InvalidIdentityPublicKeyIdError, InvalidIdentityRevisionError, MaxIdentityPublicKeyLimitReachedError, - DuplicatedIdentityPublicKeyError, - DuplicatedIdentityPublicKeyIdStateError, + // TODO: those are + // DuplicatedIdentityPublicKeyError, + // DuplicatedIdentityPublicKeyIdError, InvalidIdentityKeySignatureError, InvalidSignaturePublicKeySecurityLevelError, PublicKeyIsDisabledError, @@ -168,8 +169,8 @@ export function patchConsensusErrors() { extend(InvalidIdentityPublicKeyIdError, AbstractConsensusError); extend(InvalidIdentityRevisionError, AbstractConsensusError); extend(MaxIdentityPublicKeyLimitReachedError, AbstractConsensusError); - extend(DuplicatedIdentityPublicKeyStateError, AbstractConsensusError); - extend(DuplicatedIdentityPublicKeyIdStateError, AbstractConsensusError); + // extend(DuplicatedIdentityPublicKeyStateError, AbstractConsensusError); + // extend(DuplicatedIdentityPublicKeyIdStateError, AbstractConsensusError); extend(InvalidIdentityKeySignatureError, AbstractConsensusError); extend(InvalidSignaturePublicKeySecurityLevelError, AbstractConsensusError); extend(PublicKeyIsDisabledError, AbstractConsensusError); diff --git a/packages/wasm-dpp/lib/test/expect/expectError.js b/packages/wasm-dpp/lib/test/expect/expectError.js index 5a648691aa9..a7e0aff5662 100644 --- a/packages/wasm-dpp/lib/test/expect/expectError.js +++ b/packages/wasm-dpp/lib/test/expect/expectError.js @@ -12,7 +12,7 @@ const expectError = { const wasmDpp = await loadWasmDpp(); if (!errorClass) { // eslint-disable-next-line no-param-reassign - errorClass = TypeError; + errorClass = wasmDpp.AbstractConsensusError; } expect(result).to.be.an.instanceOf(wasmDpp.ValidationResult); expect(result.getErrors()).to.have.lengthOf(count); diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 38378a7a168..3a59104bcfb 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -17,7 +17,7 @@ use crate::{ consensus_error::from_consensus_error, from_dpp_err, protocol_error::from_protocol_error, RustConversionError, }, - validation_result::ValidationResultWasm, + validation::ValidationResultWasm, with_js_error, DataContractCreateTransitionWasm, DataContractParameters, DataContractWasm, }; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs index 88d77f2e111..51f077cf613 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs @@ -11,7 +11,7 @@ impl MissingDocumentTransitionTypeErrorWasm { } } -#[wasm_bindgen(js_class=MissingDocumentTypeError)] +#[wasm_bindgen(js_class=MissingDocumentTransitionTypeError)] impl MissingDocumentTransitionTypeErrorWasm { #[wasm_bindgen(js_name=getCode)] pub fn get_code(&self) -> u32 { diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs new file mode 100644 index 00000000000..34d5689d6fc --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs @@ -0,0 +1,20 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=MissingDocumentTypeError)] +pub struct MissingDocumentTypeErrorWasm { + code: u32, +} + +impl MissingDocumentTypeErrorWasm { + pub fn new(code: u32) -> Self { + MissingDocumentTypeErrorWasm { code } + } +} + +#[wasm_bindgen(js_class=MissingDocumentTypeError)] +impl MissingDocumentTypeErrorWasm { + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + self.code + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs index 6114c6c7fb5..43c56685b6f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs @@ -1,4 +1,5 @@ mod data_contract_not_present_error; +mod duplicate_document_transitions_with_ids_error; mod duplicate_document_transitions_with_indices_error; mod inconsistent_compound_index_data_error; mod invalid_document_transition_action_error; @@ -7,7 +8,7 @@ mod invalid_document_type_error; mod missing_data_contract_id_error; mod missing_document_transition_action_error; mod missing_document_transition_type_error; -mod duplicate_document_transitions_with_ids_error; +mod missing_document_type_error; pub use data_contract_not_present_error::*; pub use duplicate_document_transitions_with_ids_error::*; @@ -19,3 +20,4 @@ pub use invalid_document_type_error::*; pub use missing_data_contract_id_error::*; pub use missing_document_transition_action_error::*; pub use missing_document_transition_type_error::*; +pub use missing_document_type_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus_error.rs index 8c466edc2c3..7dbe69b85e7 100644 --- a/packages/wasm-dpp/src/errors/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus_error.rs @@ -35,7 +35,11 @@ use crate::errors::consensus::basic::data_contract::{ DataContractInvalidIndexDefinitionUpdateErrorWasm, DataContractUniqueIndicesChangedErrorWasm, IncompatibleDataContractSchemaErrorWasm, InvalidDataContractIdErrorWasm, }; -use crate::errors::consensus::basic::document::{DuplicateDocumentTransitionsWithIdsErrorWasm, DuplicateDocumentTransitionsWithIndicesErrorWasm, InvalidDocumentTransitionActionErrorWasm, InvalidDocumentTransitionIdErrorWasm, MissingDataContractIdErrorWasm}; +use crate::errors::consensus::basic::document::{ + DuplicateDocumentTransitionsWithIdsErrorWasm, DuplicateDocumentTransitionsWithIndicesErrorWasm, + InvalidDocumentTransitionActionErrorWasm, InvalidDocumentTransitionIdErrorWasm, + MissingDataContractIdErrorWasm, MissingDocumentTypeErrorWasm, +}; use crate::errors::consensus::basic::state_transition::{ InvalidStateTransitionTypeErrorWasm, MissingStateTransitionTypeErrorWasm, StateTransitionMaxSizeExceededErrorWasm, @@ -96,7 +100,7 @@ pub fn from_consensus_error_ref(e: &DPPConsensusError) -> JsValue { DPPConsensusError::IncompatibleProtocolVersionError(e) => { IncompatibleProtocolVersionErrorWasm::from(e).into() } - DPPConsensusError::DuplicatedIdentityPublicKeyIdError(e) => { + DPPConsensusError::DuplicatedIdentityPublicKeyBasicIdError(e) => { DuplicatedIdentityPublicKeyIdErrorWasm::from(e).into() } DPPConsensusError::InvalidIdentityPublicKeyDataError(e) => { @@ -105,7 +109,7 @@ pub fn from_consensus_error_ref(e: &DPPConsensusError) -> JsValue { DPPConsensusError::InvalidIdentityPublicKeySecurityLevelError(e) => { InvalidIdentityPublicKeySecurityLevelErrorWasm::from(e).into() } - DPPConsensusError::DuplicatedIdentityPublicKeyError(e) => { + DPPConsensusError::DuplicatedIdentityPublicKeyBasicError(e) => { DuplicatedIdentityPublicKeyErrorWasm::from(e).into() } DPPConsensusError::MissingMasterPublicKeyError(e) => { @@ -454,7 +458,10 @@ fn from_basic_error(basic_error: &Box) -> JsValue { code, ) .into(), - BasicError::MissingDocumentTransitionTypeError => MissingDocumentTransitionTypeErrorWasm::new(code).into(), + BasicError::MissingDocumentTransitionTypeError => { + MissingDocumentTransitionTypeErrorWasm::new(code).into() + } + BasicError::MissingDocumentTypeError => MissingDocumentTypeErrorWasm::new(code).into(), BasicError::MissingDocumentTransitionActionError => { MissingDocumentTransitionActionErrorWasm::new(code).into() } From 473f1af06fdb0edacd7c77c2d3973a5d059428b5 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 26 Dec 2022 13:11:25 +0400 Subject: [PATCH 14/17] remove non-existent errors --- packages/wasm-dpp/lib/extend.ts | 2 +- packages/wasm-dpp/lib/patchConsensusErrors.ts | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/wasm-dpp/lib/extend.ts b/packages/wasm-dpp/lib/extend.ts index 1078d7f2ce3..b0343e316a8 100644 --- a/packages/wasm-dpp/lib/extend.ts +++ b/packages/wasm-dpp/lib/extend.ts @@ -3,4 +3,4 @@ export function extend(Derived: any, Base: any) { Derived.prototype, Base.prototype, ); -} \ No newline at end of file +} diff --git a/packages/wasm-dpp/lib/patchConsensusErrors.ts b/packages/wasm-dpp/lib/patchConsensusErrors.ts index 7a3aba44b3a..92dfcc36934 100644 --- a/packages/wasm-dpp/lib/patchConsensusErrors.ts +++ b/packages/wasm-dpp/lib/patchConsensusErrors.ts @@ -80,9 +80,6 @@ const { InvalidIdentityPublicKeyIdError, InvalidIdentityRevisionError, MaxIdentityPublicKeyLimitReachedError, - // TODO: those are - // DuplicatedIdentityPublicKeyError, - // DuplicatedIdentityPublicKeyIdError, InvalidIdentityKeySignatureError, InvalidSignaturePublicKeySecurityLevelError, PublicKeyIsDisabledError, @@ -169,12 +166,10 @@ export function patchConsensusErrors() { extend(InvalidIdentityPublicKeyIdError, AbstractConsensusError); extend(InvalidIdentityRevisionError, AbstractConsensusError); extend(MaxIdentityPublicKeyLimitReachedError, AbstractConsensusError); - // extend(DuplicatedIdentityPublicKeyStateError, AbstractConsensusError); - // extend(DuplicatedIdentityPublicKeyIdStateError, AbstractConsensusError); extend(InvalidIdentityKeySignatureError, AbstractConsensusError); extend(InvalidSignaturePublicKeySecurityLevelError, AbstractConsensusError); extend(PublicKeyIsDisabledError, AbstractConsensusError); extend(PublicKeySecurityLevelNotMetError, AbstractConsensusError); extend(WrongPublicKeyPurposeError, AbstractConsensusError); extend(IdentityPublicKeyIsDisabledError, AbstractConsensusError); -} \ No newline at end of file +} From da682aaef39d1256240ad91e4e5e66bffc83a4cb Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 26 Dec 2022 13:25:29 +0400 Subject: [PATCH 15/17] remove unused code --- .../wasm-dpp/lib/AbstractConsensusError.ts | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/packages/wasm-dpp/lib/AbstractConsensusError.ts b/packages/wasm-dpp/lib/AbstractConsensusError.ts index 15c92f0a3ed..0cc87cd9c83 100644 --- a/packages/wasm-dpp/lib/AbstractConsensusError.ts +++ b/packages/wasm-dpp/lib/AbstractConsensusError.ts @@ -1,7 +1,5 @@ import { DPPError } from './DPPError' -//const CONSTRUCTOR_ARGUMENTS_SYMBOL = Symbol.for('constructorArguments'); - /** * @abstract */ @@ -11,46 +9,5 @@ export class AbstractConsensusError extends DPPError { */ constructor(message: string) { super(message); - - // this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = []; } - - // /** - // * @return {number} - // */ - // getCode() { - // // Mitigate recursive dependency - // - // // eslint-disable-next-line global-require - // const codes = require('./codes'); - // - // const code = Object.keys(codes) - // .find((c) => this.constructor === codes[c]); - // - // if (!code) { - // throw new Error('Error code is not defined'); - // } - // - // return parseInt(code, 10); - // } - // - // /** - // * Get array of the error's arguments - // * - // * @returns {*[]} - // */ - // getConstructorArguments() { - // return this[CONSTRUCTOR_ARGUMENTS_SYMBOL]; - // } - // - // /** - // * Set the error's arguments. - // * Must be called from the constructor - // * - // * @protected - // * @param {Object|Array} args - // */ - // setConstructorArguments(args) { - // this[CONSTRUCTOR_ARGUMENTS_SYMBOL] = Array.from(args); - // } } From 2a9401883ce181385b2771a7bf033cfce29e9434 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 26 Dec 2022 16:00:40 +0400 Subject: [PATCH 16/17] organize ts glue files and refactor --- packages/rs-drive/src/common/helpers/setup.rs | 2 +- packages/rs-drive/src/drive/object_size_info.rs | 6 +++++- packages/rs-drive/src/query/mod.rs | 4 ++-- packages/rs-drive/tests/query_tests_history.rs | 6 ++++-- packages/wasm-dpp/lib/dpp.ts | 6 +++--- .../wasm-dpp/lib/{ => errors}/AbstractConsensusError.ts | 0 packages/wasm-dpp/lib/{ => errors}/DPPError.ts | 0 .../wasm-dpp/lib/{ => errors}/patchConsensusErrors.ts | 4 ++-- packages/wasm-dpp/lib/{ => identifier}/patchIdentifier.ts | 2 +- packages/wasm-dpp/{ => lib}/index.ts | 8 ++++---- packages/wasm-dpp/lib/{ => utils}/extend.ts | 0 packages/wasm-dpp/package.json | 2 +- packages/wasm-dpp/tsconfig.json | 2 +- packages/wasm-dpp/webpack.config.js | 2 +- 14 files changed, 25 insertions(+), 19 deletions(-) rename packages/wasm-dpp/lib/{ => errors}/AbstractConsensusError.ts (100%) rename packages/wasm-dpp/lib/{ => errors}/DPPError.ts (100%) rename packages/wasm-dpp/lib/{ => errors}/patchConsensusErrors.ts (98%) rename packages/wasm-dpp/lib/{ => identifier}/patchIdentifier.ts (97%) rename packages/wasm-dpp/{ => lib}/index.ts (75%) rename packages/wasm-dpp/lib/{ => utils}/extend.ts (100%) diff --git a/packages/rs-drive/src/common/helpers/setup.rs b/packages/rs-drive/src/common/helpers/setup.rs index 24e9362aa4b..6ef37a375cf 100644 --- a/packages/rs-drive/src/common/helpers/setup.rs +++ b/packages/rs-drive/src/common/helpers/setup.rs @@ -61,7 +61,7 @@ pub fn setup_drive(drive_config: Option) -> Drive { /// Sets up Drive with the initial state structure. pub fn setup_drive_with_initial_state_structure() -> Drive { - let drive = setup_drive(Some(DriveConfig{ + let drive = setup_drive(Some(DriveConfig { batching_consistency_verification: true, ..Default::default() })); diff --git a/packages/rs-drive/src/drive/object_size_info.rs b/packages/rs-drive/src/drive/object_size_info.rs index 8c2a70e1491..ae2540a4a26 100644 --- a/packages/rs-drive/src/drive/object_size_info.rs +++ b/packages/rs-drive/src/drive/object_size_info.rs @@ -261,7 +261,11 @@ impl<'a, const N: usize> PathKeyInfo<'a, N> { (*path_iterator).iter().map(|a| a.len() as u32).sum::() + key.len() as u32 } PathKeySize(key_info_path, key_size) => { - key_info_path.iterator().map(|a| a.max_length() as u32).sum::() + key_size.max_length() as u32 + key_info_path + .iterator() + .map(|a| a.max_length() as u32) + .sum::() + + key_size.max_length() as u32 } } } diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index e75499a8e70..a46a20327e7 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1257,8 +1257,8 @@ impl<'a> DriveQuery<'a> { let element = Element::deserialize(value).unwrap(); match element { Element::Item(val, _) => values.push(val), - | Element::SumItem(val, _) => values.push(val.to_be_bytes().to_vec()), - Element::Tree(..) | Element::SumTree(..) | Element::Reference(..) => { + Element::SumItem(val, _) => values.push(val.to_be_bytes().to_vec()), + Element::Tree(..) | Element::SumTree(..) | Element::Reference(..) => { return Err(Error::GroveDB(GroveError::InvalidQuery( "path query should only point to items: got trees", ))); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 566dd53b7d4..1d11b1a4fc1 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -256,7 +256,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 49, 205, 177, 218, 169, 224, 236, 206, 112, 34, 163, 112, 222, 73, 92, 82, 189, 120, 135, 32, 13, 65, 253, 139, 167, 209, 146, 1, 81, 127, 38, 61 + 49, 205, 177, 218, 169, 224, 236, 206, 112, 34, 163, 112, 222, 73, 92, 82, 189, 120, + 135, 32, 13, 65, 253, 139, 167, 209, 146, 1, 81, 127, 38, 61 ] ); @@ -1534,7 +1535,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 200, 234, 81, 179, 120, 70, 117, 20, 202, 219, 197, 168, 20, 96, 55, 130, 62, 243, 181, 198, 88, 50, 225, 68, 205, 54, 191, 136, 37, 65, 113, 200 + 200, 234, 81, 179, 120, 70, 117, 20, 202, 219, 197, 168, 20, 96, 55, 130, 62, 243, 181, + 198, 88, 50, 225, 68, 205, 54, 191, 136, 37, 65, 113, 200 ] ); } diff --git a/packages/wasm-dpp/lib/dpp.ts b/packages/wasm-dpp/lib/dpp.ts index e2055302b76..8e3fd34920c 100644 --- a/packages/wasm-dpp/lib/dpp.ts +++ b/packages/wasm-dpp/lib/dpp.ts @@ -1,5 +1,5 @@ import * as dpp_module from '../wasm/wasm_dpp'; -import { patchConsensusErrors } from './patchConsensusErrors'; +import { patchConsensusErrors } from './errors/patchConsensusErrors'; patchConsensusErrors(); @@ -13,8 +13,8 @@ dpp_module.IdentityPublicKey.PURPOSES = dpp_module.KeyPurpose; dpp_module.IdentityPublicKey.SECURITY_LEVELS = dpp_module.KeySecurityLevel; export * from '../wasm/wasm_dpp'; -export * from './AbstractConsensusError'; -export * from './DPPError'; +export * from './errors/AbstractConsensusError'; +export * from './errors/DPPError'; // Declarations written prior to "export *" will overwrite exports export declare class IdentityPublicKey extends dpp_module.IdentityPublicKey { diff --git a/packages/wasm-dpp/lib/AbstractConsensusError.ts b/packages/wasm-dpp/lib/errors/AbstractConsensusError.ts similarity index 100% rename from packages/wasm-dpp/lib/AbstractConsensusError.ts rename to packages/wasm-dpp/lib/errors/AbstractConsensusError.ts diff --git a/packages/wasm-dpp/lib/DPPError.ts b/packages/wasm-dpp/lib/errors/DPPError.ts similarity index 100% rename from packages/wasm-dpp/lib/DPPError.ts rename to packages/wasm-dpp/lib/errors/DPPError.ts diff --git a/packages/wasm-dpp/lib/patchConsensusErrors.ts b/packages/wasm-dpp/lib/errors/patchConsensusErrors.ts similarity index 98% rename from packages/wasm-dpp/lib/patchConsensusErrors.ts rename to packages/wasm-dpp/lib/errors/patchConsensusErrors.ts index 92dfcc36934..5eafb514dce 100644 --- a/packages/wasm-dpp/lib/patchConsensusErrors.ts +++ b/packages/wasm-dpp/lib/errors/patchConsensusErrors.ts @@ -1,5 +1,5 @@ -import * as dpp_module from '../wasm/wasm_dpp'; -import { extend } from "./extend"; +import * as dpp_module from '../../wasm/wasm_dpp'; +import { extend } from "../utils/extend"; import { AbstractConsensusError } from "./AbstractConsensusError"; const { diff --git a/packages/wasm-dpp/lib/patchIdentifier.ts b/packages/wasm-dpp/lib/identifier/patchIdentifier.ts similarity index 97% rename from packages/wasm-dpp/lib/patchIdentifier.ts rename to packages/wasm-dpp/lib/identifier/patchIdentifier.ts index db4e911404e..f30a91cdbcb 100644 --- a/packages/wasm-dpp/lib/patchIdentifier.ts +++ b/packages/wasm-dpp/lib/identifier/patchIdentifier.ts @@ -1,4 +1,4 @@ -import * as dpp_module from "./dpp"; +import * as dpp_module from "../dpp"; // import { inspect } from 'util'; export default function (dppModule: typeof dpp_module) { diff --git a/packages/wasm-dpp/index.ts b/packages/wasm-dpp/lib/index.ts similarity index 75% rename from packages/wasm-dpp/index.ts rename to packages/wasm-dpp/lib/index.ts index eb010f5f0c0..b1363e52074 100644 --- a/packages/wasm-dpp/index.ts +++ b/packages/wasm-dpp/lib/index.ts @@ -1,8 +1,8 @@ -import init from './wasm/wasm_dpp'; -import * as dpp_module from './lib/dpp'; +import init from '../wasm/wasm_dpp'; +import * as dpp_module from './dpp'; // @ts-ignore -import wasmBase from './wasm/wasm_dpp_bg.js'; -import patchIdentifier from "./lib/patchIdentifier"; +import wasmBase from '../wasm/wasm_dpp_bg.js'; +import patchIdentifier from "./identifier/patchIdentifier"; let isInitialized = false; diff --git a/packages/wasm-dpp/lib/extend.ts b/packages/wasm-dpp/lib/utils/extend.ts similarity index 100% rename from packages/wasm-dpp/lib/extend.ts rename to packages/wasm-dpp/lib/utils/extend.ts diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index bd8082a72b8..de9b2376d90 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -3,7 +3,7 @@ "version": "0.24.0-dev.11", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "dist/lib/index.d.ts", "scripts": { "build": "yarn exec scripts/build.sh && webpack", "test": "yarn run test:node && yarn run test:browsers", diff --git a/packages/wasm-dpp/tsconfig.json b/packages/wasm-dpp/tsconfig.json index 714ea219c34..17eeea3831b 100644 --- a/packages/wasm-dpp/tsconfig.json +++ b/packages/wasm-dpp/tsconfig.json @@ -13,6 +13,6 @@ ] }, "include": [ - "index.ts", "wasm/wasm_dpp.js, lib/*" + "lib/**/*.ts", "wasm/wasm_dpp.js" ], } \ No newline at end of file diff --git a/packages/wasm-dpp/webpack.config.js b/packages/wasm-dpp/webpack.config.js index 09ab53f512e..b9d8edfd7e6 100644 --- a/packages/wasm-dpp/webpack.config.js +++ b/packages/wasm-dpp/webpack.config.js @@ -2,7 +2,7 @@ const path = require('path'); const webpack = require('webpack'); module.exports = { - entry: './index.ts', + entry: './lib/index.ts', output: { path: path.resolve(__dirname, 'dist'), filename: 'index.js', From c4196890391bb9b79bfef764cc0096d7eb6641f0 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 26 Dec 2022 16:07:41 +0400 Subject: [PATCH 17/17] updated the lockfile --- Cargo.lock | 4 ++-- .../identity/validation/validatePublicKeysFactory.spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba2ed10273d..f083b913129 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1563,9 +1563,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.138" +version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "libloading" diff --git a/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js b/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js index 4de6591e41e..fff8b951e32 100644 --- a/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/validation/validatePublicKeysFactory.spec.js @@ -331,7 +331,7 @@ describe('validatePublicKeysFactory', () => { expect(error.getCode()).to.equal(1040); expect(error.getPublicKeyId()).to.deep.equal(rawPublicKeys[1].id); expect(error.getValidationError()).to.be.instanceOf(PublicKeyValidationError); - expect(error.getValidationError().message).to.equal('Key secp256k1 error: secp: malformed public key'); + expect(error.getValidationError().message).to.equal('Key secp256k1 error: malformed public key'); }); it('should return invalid result if key has an invalid combination of purpose and security level', async () => {