From 64fefde16699ac39b6013f3ec5cb4657a5d3e204 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 2 Jun 2025 22:42:22 +0200 Subject: [PATCH 1/2] fix: fixes issue #2653 Cannot decode DataContractCreateV1 with WASM-DPP --- .../src/data_contract/data_contract.rs | 5 ++--- .../data_contract_create_transition/mod.rs | 19 ++++++++++++++++--- .../data_contract_update_transition/mod.rs | 19 ++++++++++++++++--- .../DataContractCreateTransition.spec.js | 6 ++++++ 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index 5b8134dc29d..a78eab156a1 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -415,12 +415,11 @@ impl DataContractWasm { self.clone() } - pub(crate) fn try_from_serialization_format( + pub(crate) fn try_from_serialization_format_with_platform_version( value: DataContractInSerializationFormat, full_validation: bool, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::first(); - DataContract::try_from_platform_versioned( value, full_validation, diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index 81a69a1da6b..6ea4400919e 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -55,9 +55,22 @@ impl DataContractCreateTransitionWasm { } #[wasm_bindgen(js_name=getDataContract)] - pub fn get_data_contract(&self) -> DataContractWasm { - DataContractWasm::try_from_serialization_format(self.0.data_contract().clone(), false) - .expect("should convert from serialziation format") + pub fn get_data_contract( + &self, + protocol_version: Option, + ) -> Result { + // Use provided protocol version or latest if not specified + let platform_version = if let Some(version) = protocol_version { + PlatformVersion::get(version).with_js_error()? + } else { + PlatformVersion::latest() + }; + + DataContractWasm::try_from_serialization_format_with_platform_version( + self.0.data_contract().clone(), + false, + platform_version, + ) } // #[wasm_bindgen(js_name=setDataContractConfig)] diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 1645e2c7a3c..655cb305765 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -56,9 +56,22 @@ impl DataContractUpdateTransitionWasm { } #[wasm_bindgen(js_name=getDataContract)] - pub fn get_data_contract(&self) -> DataContractWasm { - DataContractWasm::try_from_serialization_format(self.0.data_contract().clone(), false) - .expect("should create data contract from serialized format") + pub fn get_data_contract( + &self, + protocol_version: Option, + ) -> Result { + // Use provided protocol version or latest if not specified + let platform_version = if let Some(version) = protocol_version { + PlatformVersion::get(version).with_js_error()? + } else { + PlatformVersion::latest() + }; + + DataContractWasm::try_from_serialization_format_with_platform_version( + self.0.data_contract().clone(), + false, + platform_version, + ) } // #[wasm_bindgen(js_name=setDataContractConfig)] diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js index dc394aee3c6..2fa931c11ab 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js @@ -46,6 +46,12 @@ describe('DataContractCreateTransition', () => { expect(result.toObject()).to.deep.equal(dataContract.toObject()); }); + + it('should return Data Contract with specific protocol version', () => { + const result = stateTransition.getDataContract(1); + + expect(result.toObject()).to.deep.equal(dataContract.toObject()); + }); }); describe.skip('#toJSON', () => { From e311c4474a9cbf8b53b47abbde8c56d849ce60ed Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 2 Jun 2025 23:06:40 +0200 Subject: [PATCH 2/2] fix --- .../state_transition/data_contract_create_transition/mod.rs | 4 +++- .../state_transition/data_contract_update_transition/mod.rs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index 6ea4400919e..e6d10d8da8b 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -61,7 +61,9 @@ impl DataContractCreateTransitionWasm { ) -> Result { // Use provided protocol version or latest if not specified let platform_version = if let Some(version) = protocol_version { - PlatformVersion::get(version).with_js_error()? + PlatformVersion::get(version) + .map_err(ProtocolError::PlatformVersionError) + .with_js_error()? } else { PlatformVersion::latest() }; diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 655cb305765..2095c43fb46 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -62,7 +62,9 @@ impl DataContractUpdateTransitionWasm { ) -> Result { // Use provided protocol version or latest if not specified let platform_version = if let Some(version) = protocol_version { - PlatformVersion::get(version).with_js_error()? + PlatformVersion::get(version) + .map_err(ProtocolError::PlatformVersionError) + .with_js_error()? } else { PlatformVersion::latest() };