From d957e43490f70d54bf00bdd2ba621e675babcea3 Mon Sep 17 00:00:00 2001 From: pasta Date: Tue, 13 Jan 2026 17:11:54 -0600 Subject: [PATCH 1/2] feat(wasm-sdk): auto-generate entropy for document creation when not provided Previously, documentCreate() would throw an error if the Document didn't have entropy set. This was a breaking change for SDKs that create documents via fromObject(), fromJSON(), or fromBytes() which don't auto-generate entropy. Now entropy is auto-generated at the wasm-sdk level when not provided, making it truly optional while maintaining backward compatibility. Co-Authored-By: Claude Opus 4.5 --- .../src/state_transitions/document.rs | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/wasm-sdk/src/state_transitions/document.rs b/packages/wasm-sdk/src/state_transitions/document.rs index 44197daf1f9..78d5aaaa4ea 100644 --- a/packages/wasm-sdk/src/state_transitions/document.rs +++ b/packages/wasm-sdk/src/state_transitions/document.rs @@ -51,7 +51,8 @@ export interface DocumentCreateOptions { /** * The document to create. * Use `new Document(...)` or `Document.fromJSON(...)` to construct it. - * Must include dataContractId, documentTypeName, ownerId, and entropy. + * Must include dataContractId, documentTypeName, and ownerId. + * Entropy is optional - if not set, it will be auto-generated. */ document: Document; @@ -108,19 +109,23 @@ impl WasmSdk { let contract_id: Identifier = document_wasm.get_data_contract_id().into(); let document_type_name = document_wasm.get_document_type_name(); - // Get entropy from document - let entropy = document_wasm.get_entropy().ok_or_else(|| { - WasmSdkError::invalid_argument("Document must have entropy set for creation") - })?; - - if entropy.len() != 32 { - return Err(WasmSdkError::invalid_argument( - "Document entropy must be exactly 32 bytes", - )); - } - - let mut entropy_array = [0u8; 32]; - entropy_array.copy_from_slice(&entropy); + // Get entropy from document, or generate if not set + let entropy_array = match document_wasm.get_entropy() { + Some(entropy) if entropy.len() == 32 => { + let mut arr = [0u8; 32]; + arr.copy_from_slice(&entropy); + arr + } + _ => { + // Auto-generate entropy if not provided + use dash_sdk::dpp::util::entropy_generator::{ + DefaultEntropyGenerator, EntropyGenerator, + }; + DefaultEntropyGenerator.generate().map_err(|e| { + WasmSdkError::generic(format!("Failed to generate entropy: {}", e)) + })? + } + }; // Extract identity key from options let identity_key_wasm = From 603ec603fcb256061709d2706b377829b0fcc44f Mon Sep 17 00:00:00 2001 From: pasta Date: Tue, 13 Jan 2026 17:38:48 -0600 Subject: [PATCH 2/2] refactor(wasm-sdk): delegate entropy generation to rs-sdk Instead of generating entropy in wasm-sdk, pass None to rs-sdk when entropy is not set. This lets rs-sdk handle both entropy generation and document ID regeneration correctly. Co-Authored-By: Claude Opus 4.5 --- .../src/state_transitions/document.rs | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/wasm-sdk/src/state_transitions/document.rs b/packages/wasm-sdk/src/state_transitions/document.rs index 78d5aaaa4ea..253520f0aa4 100644 --- a/packages/wasm-sdk/src/state_transitions/document.rs +++ b/packages/wasm-sdk/src/state_transitions/document.rs @@ -109,23 +109,16 @@ impl WasmSdk { let contract_id: Identifier = document_wasm.get_data_contract_id().into(); let document_type_name = document_wasm.get_document_type_name(); - // Get entropy from document, or generate if not set - let entropy_array = match document_wasm.get_entropy() { - Some(entropy) if entropy.len() == 32 => { + // Get entropy from document if set, otherwise let rs-sdk generate it + let entropy = document_wasm.get_entropy().and_then(|e| { + if e.len() == 32 { let mut arr = [0u8; 32]; - arr.copy_from_slice(&entropy); - arr + arr.copy_from_slice(&e); + Some(arr) + } else { + None } - _ => { - // Auto-generate entropy if not provided - use dash_sdk::dpp::util::entropy_generator::{ - DefaultEntropyGenerator, EntropyGenerator, - }; - DefaultEntropyGenerator.generate().map_err(|e| { - WasmSdkError::generic(format!("Failed to generate entropy: {}", e)) - })? - } - }; + }); // Extract identity key from options let identity_key_wasm = @@ -149,7 +142,7 @@ impl WasmSdk { .put_to_platform_and_wait_for_response( self.inner_sdk(), document_type, - Some(entropy_array), + entropy, identity_key, None, // token_payment_info &signer,