From b6cb602202f5ad88fc60a63fefbd2a020568d1e3 Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 1 Oct 2025 12:24:10 -0400 Subject: [PATCH 1/6] fix(wasm-sdk): include groups and tokens in data contract serialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DataContractWasm was using PlatformVersion::first() which defaults to V0 serialization format that excludes groups and tokens fields. Updated to use the SDK's platform version for proper V1 serialization support. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/wasm-sdk/src/dpp.rs | 15 ++++++++++----- packages/wasm-sdk/src/queries/data_contract.rs | 8 +++++--- packages/wasm-sdk/src/verify.rs | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/wasm-sdk/src/dpp.rs b/packages/wasm-sdk/src/dpp.rs index 4dc42d8a994..2c4c0d11066 100644 --- a/packages/wasm-sdk/src/dpp.rs +++ b/packages/wasm-sdk/src/dpp.rs @@ -295,11 +295,18 @@ impl IdentityWasm { // } #[wasm_bindgen] -pub struct DataContractWasm(DataContract); +pub struct DataContractWasm(DataContract, &'static PlatformVersion); + +impl DataContractWasm { + pub fn new(data_contract: DataContract, platform_version: &'static PlatformVersion) -> Self { + Self(data_contract, platform_version) + } +} impl From for DataContractWasm { fn from(value: DataContract) -> Self { - Self(value) + // Use first version as fallback for backward compatibility + Self(value, PlatformVersion::first()) } } @@ -311,9 +318,7 @@ impl DataContractWasm { #[wasm_bindgen(js_name=toJSON)] pub fn to_json(&self) -> Result { - let platform_version = PlatformVersion::first(); - - let json = self.0.to_json(platform_version).map_err(|e| { + let json = self.0.to_json(self.1).map_err(|e| { WasmSdkError::serialization(format!( "failed to convert data contract convert to json: {}", e diff --git a/packages/wasm-sdk/src/queries/data_contract.rs b/packages/wasm-sdk/src/queries/data_contract.rs index 67bcbe5d0eb..4a908b34c54 100644 --- a/packages/wasm-sdk/src/queries/data_contract.rs +++ b/packages/wasm-sdk/src/queries/data_contract.rs @@ -36,10 +36,12 @@ impl WasmSdk { ) .map_err(|e| WasmSdkError::invalid_argument(format!("Invalid data contract ID: {}", e)))?; - DataContract::fetch_by_identifier(self.as_ref(), id) + let contract = DataContract::fetch_by_identifier(self.as_ref(), id) .await? - .ok_or_else(|| WasmSdkError::not_found("Data contract not found")) - .map(Into::into) + .ok_or_else(|| WasmSdkError::not_found("Data contract not found"))?; + + let platform_version = dash_sdk::dpp::version::PlatformVersion::get(self.version()).unwrap(); + Ok(DataContractWasm::new(contract, platform_version)) } #[wasm_bindgen(js_name = "getDataContractWithProofInfo")] diff --git a/packages/wasm-sdk/src/verify.rs b/packages/wasm-sdk/src/verify.rs index 012c63a5977..f68c86074e9 100644 --- a/packages/wasm-sdk/src/verify.rs +++ b/packages/wasm-sdk/src/verify.rs @@ -122,7 +122,7 @@ pub async fn verify_data_contract() -> Option { ) .expect("parse proof"); - response.map(DataContractWasm::from) + response.map(|contract| DataContractWasm::new(contract, PlatformVersion::latest())) } #[wasm_bindgen(js_name = "verifyDocuments")] From 90451af812fe4c5c03652cb46adaef017dd7939f Mon Sep 17 00:00:00 2001 From: thephez Date: Wed, 1 Oct 2025 12:50:50 -0400 Subject: [PATCH 2/6] chore: cargo fmt --- packages/wasm-sdk/src/queries/data_contract.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/wasm-sdk/src/queries/data_contract.rs b/packages/wasm-sdk/src/queries/data_contract.rs index 4a908b34c54..76593ee494c 100644 --- a/packages/wasm-sdk/src/queries/data_contract.rs +++ b/packages/wasm-sdk/src/queries/data_contract.rs @@ -40,7 +40,8 @@ impl WasmSdk { .await? .ok_or_else(|| WasmSdkError::not_found("Data contract not found"))?; - let platform_version = dash_sdk::dpp::version::PlatformVersion::get(self.version()).unwrap(); + let platform_version = + dash_sdk::dpp::version::PlatformVersion::get(self.version()).unwrap(); Ok(DataContractWasm::new(contract, platform_version)) } From 19ecdda3f0ed548a99284d3d86d64f1423659f25 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 2 Oct 2025 09:56:41 -0400 Subject: [PATCH 3/6] fix(wasm-sdk): require explicit platform version for DataContractWasm methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove unsafe platform version fallback from DataContractWasm: - Remove stored &'static PlatformVersion field from struct - Remove From trait implementation using PlatformVersion::first() - Update toJSON method to accept platform_version parameter - Add internal from_data_contract helper for codebase use This ensures platform version is always passed explicitly to methods that require it, following the same pattern as Rust DPP implementation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/wasm-sdk/src/dpp.rs | 23 +++++++++---------- .../wasm-sdk/src/queries/data_contract.rs | 4 +--- packages/wasm-sdk/src/verify.rs | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/wasm-sdk/src/dpp.rs b/packages/wasm-sdk/src/dpp.rs index 2c4c0d11066..ac10f70b4d6 100644 --- a/packages/wasm-sdk/src/dpp.rs +++ b/packages/wasm-sdk/src/dpp.rs @@ -295,18 +295,11 @@ impl IdentityWasm { // } #[wasm_bindgen] -pub struct DataContractWasm(DataContract, &'static PlatformVersion); +pub struct DataContractWasm(DataContract); impl DataContractWasm { - pub fn new(data_contract: DataContract, platform_version: &'static PlatformVersion) -> Self { - Self(data_contract, platform_version) - } -} - -impl From for DataContractWasm { - fn from(value: DataContract) -> Self { - // Use first version as fallback for backward compatibility - Self(value, PlatformVersion::first()) + pub(crate) fn from_data_contract(data_contract: DataContract) -> Self { + Self(data_contract) } } @@ -317,8 +310,14 @@ impl DataContractWasm { } #[wasm_bindgen(js_name=toJSON)] - pub fn to_json(&self) -> Result { - let json = self.0.to_json(self.1).map_err(|e| { + pub fn to_json(&self, platform_version: u32) -> Result { + let platform_version = &PlatformVersion::get(platform_version).map_err(|e| { + WasmSdkError::invalid_argument(format!( + "unknown platform version {platform_version}: {e}" + )) + })?; + + let json = self.0.to_json(platform_version).map_err(|e| { WasmSdkError::serialization(format!( "failed to convert data contract convert to json: {}", e diff --git a/packages/wasm-sdk/src/queries/data_contract.rs b/packages/wasm-sdk/src/queries/data_contract.rs index 76593ee494c..224eec09690 100644 --- a/packages/wasm-sdk/src/queries/data_contract.rs +++ b/packages/wasm-sdk/src/queries/data_contract.rs @@ -40,9 +40,7 @@ impl WasmSdk { .await? .ok_or_else(|| WasmSdkError::not_found("Data contract not found"))?; - let platform_version = - dash_sdk::dpp::version::PlatformVersion::get(self.version()).unwrap(); - Ok(DataContractWasm::new(contract, platform_version)) + Ok(DataContractWasm::from_data_contract(contract)) } #[wasm_bindgen(js_name = "getDataContractWithProofInfo")] diff --git a/packages/wasm-sdk/src/verify.rs b/packages/wasm-sdk/src/verify.rs index f68c86074e9..15b7d94b97b 100644 --- a/packages/wasm-sdk/src/verify.rs +++ b/packages/wasm-sdk/src/verify.rs @@ -122,7 +122,7 @@ pub async fn verify_data_contract() -> Option { ) .expect("parse proof"); - response.map(|contract| DataContractWasm::new(contract, PlatformVersion::latest())) + response.map(DataContractWasm::from_data_contract) } #[wasm_bindgen(js_name = "verifyDocuments")] From ce715489933d77ed1979e17188ecf6aecca59b4b Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 2 Oct 2025 10:20:30 -0400 Subject: [PATCH 4/6] doc: add comment --- packages/wasm-sdk/src/dpp.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/wasm-sdk/src/dpp.rs b/packages/wasm-sdk/src/dpp.rs index ac10f70b4d6..94c268e8df2 100644 --- a/packages/wasm-sdk/src/dpp.rs +++ b/packages/wasm-sdk/src/dpp.rs @@ -298,6 +298,15 @@ impl IdentityWasm { pub struct DataContractWasm(DataContract); impl DataContractWasm { + /// Create a DataContractWasm from a DataContract. + /// + /// This is the primary constructor for wrapping a data contract. + /// Note that serialization via `to_json()` requires providing an explicit + /// platform version to ensure version-specific fields (e.g., `groups` and + /// `tokens` for token contracts) are correctly included. + /// + /// # Arguments + /// * `data_contract` - The data contract to wrap pub(crate) fn from_data_contract(data_contract: DataContract) -> Self { Self(data_contract) } From 74a10aa0acc395e09df18bea55663a27d4265dfe Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 6 Oct 2025 16:53:09 -0400 Subject: [PATCH 5/6] fix(wasm-sdk): use proper DataContractWasm constructor in from_json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace direct Into conversion with from_data_contract method to ensure proper initialization of DataContractWasm wrapper. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/wasm-sdk/src/dpp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-sdk/src/dpp.rs b/packages/wasm-sdk/src/dpp.rs index ccd9aaf61e8..b850ef25187 100644 --- a/packages/wasm-sdk/src/dpp.rs +++ b/packages/wasm-sdk/src/dpp.rs @@ -340,7 +340,7 @@ impl DataContractWasm { WasmSdkError::serialization(format!("failed to create DataContract from json: {}", e)) })?; - Ok(data_contract.into()) + Ok(DataContractWasm::from_data_contract(data_contract)) } #[wasm_bindgen(js_name=toJSON)] From fd435e37ce7ec8abf82923654c73cca9278ad666 Mon Sep 17 00:00:00 2001 From: thephez Date: Mon, 6 Oct 2025 17:06:16 -0400 Subject: [PATCH 6/6] fix(wasm-sdk): store platform version in DataContractWasm struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DataContractWasm now stores platform_version internally as u32, ensuring consistent version handling across all operations. The toJSON method no longer requires a platform_version parameter since it uses the stored value. All constructors now require explicit platform version, following the pattern that platform version should never use defaults. BREAKING CHANGE: DataContractWasm.toJSON() no longer accepts a platform_version parameter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/wasm-sdk/src/dpp.rs | 37 ++++++++++++------- .../wasm-sdk/src/queries/data_contract.rs | 5 ++- packages/wasm-sdk/src/verify.rs | 4 +- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/packages/wasm-sdk/src/dpp.rs b/packages/wasm-sdk/src/dpp.rs index b850ef25187..d411b6c55cd 100644 --- a/packages/wasm-sdk/src/dpp.rs +++ b/packages/wasm-sdk/src/dpp.rs @@ -295,27 +295,34 @@ impl IdentityWasm { // } #[wasm_bindgen(js_name=DataContract)] -pub struct DataContractWasm(DataContract); +pub struct DataContractWasm { + contract: DataContract, + platform_version: u32, +} impl DataContractWasm { - /// Create a DataContractWasm from a DataContract. + /// Create a DataContractWasm from a DataContract with platform version. /// /// This is the primary constructor for wrapping a data contract. - /// Note that serialization via `to_json()` requires providing an explicit - /// platform version to ensure version-specific fields (e.g., `groups` and - /// `tokens` for token contracts) are correctly included. + /// The platform version is stored and used for consistent serialization + /// to ensure version-specific fields (e.g., `groups` and `tokens` for + /// token contracts) are correctly included. /// /// # Arguments /// * `data_contract` - The data contract to wrap - pub(crate) fn from_data_contract(data_contract: DataContract) -> Self { - Self(data_contract) + /// * `platform_version` - The platform version to use for operations + pub(crate) fn from_data_contract(data_contract: DataContract, platform_version: u32) -> Self { + Self { + contract: data_contract, + platform_version, + } } } #[wasm_bindgen(js_class=DataContract)] impl DataContractWasm { pub fn id(&self) -> String { - self.0.id().to_string(Encoding::Base58) + self.contract.id().to_string(Encoding::Base58) } #[wasm_bindgen(js_name=fromJSON)] @@ -340,18 +347,22 @@ impl DataContractWasm { WasmSdkError::serialization(format!("failed to create DataContract from json: {}", e)) })?; - Ok(DataContractWasm::from_data_contract(data_contract)) + Ok(DataContractWasm::from_data_contract( + data_contract, + platform_version.protocol_version, + )) } #[wasm_bindgen(js_name=toJSON)] - pub fn to_json(&self, platform_version: u32) -> Result { - let platform_version = &PlatformVersion::get(platform_version).map_err(|e| { + pub fn to_json(&self) -> Result { + let platform_version = &PlatformVersion::get(self.platform_version).map_err(|e| { WasmSdkError::invalid_argument(format!( - "unknown platform version {platform_version}: {e}" + "unknown platform version {}: {e}", + self.platform_version )) })?; - let json = self.0.to_json(platform_version).map_err(|e| { + let json = self.contract.to_json(platform_version).map_err(|e| { WasmSdkError::serialization(format!( "failed to convert data contract convert to json: {}", e diff --git a/packages/wasm-sdk/src/queries/data_contract.rs b/packages/wasm-sdk/src/queries/data_contract.rs index 224eec09690..6757829e3c6 100644 --- a/packages/wasm-sdk/src/queries/data_contract.rs +++ b/packages/wasm-sdk/src/queries/data_contract.rs @@ -40,7 +40,10 @@ impl WasmSdk { .await? .ok_or_else(|| WasmSdkError::not_found("Data contract not found"))?; - Ok(DataContractWasm::from_data_contract(contract)) + Ok(DataContractWasm::from_data_contract( + contract, + self.version(), + )) } #[wasm_bindgen(js_name = "getDataContractWithProofInfo")] diff --git a/packages/wasm-sdk/src/verify.rs b/packages/wasm-sdk/src/verify.rs index 15b7d94b97b..42bda6fa41c 100644 --- a/packages/wasm-sdk/src/verify.rs +++ b/packages/wasm-sdk/src/verify.rs @@ -122,7 +122,9 @@ pub async fn verify_data_contract() -> Option { ) .expect("parse proof"); - response.map(DataContractWasm::from_data_contract) + response.map(|contract| { + DataContractWasm::from_data_contract(contract, PlatformVersion::latest().protocol_version) + }) } #[wasm_bindgen(js_name = "verifyDocuments")]