Skip to content

Commit a4ad291

Browse files
thepastaclawclaude
andcommitted
fix(wasm-sdk): reject create-eligible documents in prepare_document_replace
Add a guard in prepare_document_replace to reject documents with no revision or INITIAL_REVISION, which would otherwise silently produce a create transition instead of a replace. Also move the inline DocumentTypeV0Getters import to module-level. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 75621ba commit a4ad291

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

packages/wasm-sdk/src/state_transitions/document.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use crate::settings::PutSettingsInput;
2222
use dash_sdk::dpp::dashcore::secp256k1::rand::rngs::StdRng;
2323
use dash_sdk::dpp::dashcore::secp256k1::rand::{Rng, SeedableRng};
2424
use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters;
25+
use dash_sdk::dpp::data_contract::document_type::accessors::DocumentTypeV0Getters;
2526
use dash_sdk::dpp::data_contract::document_type::DocumentType;
2627
use dash_sdk::dpp::document::{Document, DocumentV0Getters, DocumentV0Setters, INITIAL_REVISION};
2728
use dash_sdk::dpp::fee::Credits;
@@ -570,6 +571,18 @@ impl WasmSdk {
570571
let document_wasm = DocumentWasm::try_from_options(&options, "document")?;
571572
let document: Document = document_wasm.clone().into();
572573

574+
// Guard: reject documents with no revision or INITIAL_REVISION — those are creates, not replaces
575+
let revision = document.revision().ok_or_else(|| {
576+
WasmSdkError::invalid_argument(
577+
"Document must have a revision set for replace. Use prepareDocumentCreate for new documents.",
578+
)
579+
})?;
580+
if revision == INITIAL_REVISION {
581+
return Err(WasmSdkError::invalid_argument(
582+
"Document revision is INITIAL_REVISION (1). Replace requires revision > 1. Use prepareDocumentCreate for new documents.",
583+
));
584+
}
585+
573586
// Get metadata from document
574587
let contract_id: Identifier = document_wasm.data_contract_id().into();
575588
let document_type_name = document_wasm.document_type_name();
@@ -1105,8 +1118,6 @@ async fn build_document_create_or_replace_transition(
11051118
sdk: &dash_sdk::Sdk,
11061119
settings: Option<dash_sdk::platform::transition::put_settings::PutSettings>,
11071120
) -> Result<dash_sdk::dpp::state_transition::StateTransition, WasmSdkError> {
1108-
use dash_sdk::dpp::data_contract::document_type::accessors::DocumentTypeV0Getters;
1109-
11101121
let new_identity_contract_nonce = sdk
11111122
.get_identity_contract_nonce(
11121123
document.owner_id(),

0 commit comments

Comments
 (0)