Skip to content

Conversation

QuantumExplorer
Copy link
Member

@QuantumExplorer QuantumExplorer commented Sep 30, 2025

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have added "!" to the title and described breaking changes in the corresponding section if my code contains any
  • I have made corresponding changes to the documentation if needed

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

Summary by CodeRabbit

  • New Features

    • Documents gain an optional creatorId and support a v2 document serialization format.
    • Document-type helpers now provide system and contract config version info during schema creation.
  • Improvements

    • Uniqueness and validation flows updated to respect creatorId with versioned validation paths.
    • Queries treat creatorId as an identifier for indexing and lookups.
  • SDK/WASM

    • CreatorId is propagated through document transition flows (create/replace/transfer/purchase/delete/set-price).
  • Tests

    • Expanded coverage for creatorId indexes, transfers, purchases, and protocol-version scenarios.

Copy link
Contributor

coderabbitai bot commented Sep 30, 2025

Walkthrough

Adds creator_id support to DocumentV0 (field, accessors, CBOR/JSON and v2 serialization), threads data-contract system/config version into DocumentType schema builders and try_from_schema, implements versioned system_property/creator logic, and propagates these through state transitions, Drive uniqueness validation, platform versions, SDK/FFI, and tests.

Changes

Cohort / File(s) Summary
Data contract version accessors
packages/rs-dpp/src/data_contract/accessors/mod.rs, packages/rs-dpp/src/data_contract/accessors/v0/mod.rs, packages/rs-dpp/src/data_contract/accessors/v1/mod.rs, packages/rs-dpp/src/data_contract/config/mod.rs
Add system_version_type() (DataContract V0→0, V1→1) and DataContractConfig::version() numeric accessor.
DocumentType API & system-property logic
packages/rs-dpp/src/data_contract/document_type/class_methods/mod.rs, .../system_properties/mod.rs, .../should_use_creator_id/mod.rs, .../try_from_schema/*, .../create_document_types_from_document_schemas/*
Thread data_contract_system_version and contract_config_version into create/try_from_schema flows; add system_properties_contains and should_use_creator_id; remove direct SYSTEM_PROPERTIES checks in versioned paths.
DocumentV0: creator_id, accessors & conversions
packages/rs-dpp/src/document/v0/mod.rs, .../v0/cbor_conversion.rs, .../v0/json_conversion.rs, packages/rs-dpp/src/document/accessors/*, packages/rs-dpp/src/document/fields.rs, packages/rs-dpp/src/document/extended_document/*
Introduce creator_id: Option<Identifier> on DocumentV0, add getters/setters, include CREATOR_ID constant, wire CBOR/JSON conversions and extended-document JSON.
Document serialization v2
packages/rs-dpp/src/document/v0/serialize.rs, .../serialization_traits/.../serialize/v0/mod.rs, .../deserialize/v0/mod.rs
Add serialize_v2 / from_bytes_v2 and dispatch for document serialization version 2 (supports optional creator_id and related fields).
DataContract schema wiring & callsites
packages/rs-dpp/src/data_contract/v0/methods/schema.rs, .../v1/methods/schema.rs, .../v0/serialization/mod.rs, .../v1/serialization/mod.rs, many call sites (packages/rs-dpp/src/util/json_schema.rs, packages/rs-drive/src/query/test_index.rs, packages/rs-sdk/tests/fetch/common.rs, packages/strategy-tests/src/operations.rs, ...)
Update many call sites to pass system/config version args into DocumentType::create_document_types_from_document_schemas and try_from_schema (new arity).
State transitions: create/replace/transfer
packages/rs-dpp/src/state_transition/.../document_create_transition/*, .../document_replace_transition/*, .../v0/*
Thread &DataContract into create transition APIs; add optional creator_id to replace APIs; compute and inject creator_id during create flows when contract/platform indicate.
Drive actions & verification
packages/rs-drive/src/state_transition_action/.../document_create_transition_action/*, .../document_replace_transition_action/*, .../verify_state_transition_was_executed_with_proof/v0/mod.rs
Compute/preserve creator_id in actions, add accessors (creator_id, changed_data_fields), propagate creator_id through replace-action types and verification comparisons.
Uniqueness & query logic (creator support, v1)
packages/rs-drive/src/drive/document/index_uniqueness/**, .../internal/validate_uniqueness_of_data/v1/mod.rs, packages/rs-drive/src/query/conditions.rs, packages/rs-drive/src/util/object_size_info/document_info.rs
Introduce UniquenessOfDataRequestV1 (with creator_id and update-type), add validate_uniqueness_of_data_v1, treat $creatorId as Identifier in queries, include $creatorId in size/key estimates.
Platform/versioning updates
packages/rs-platform-version/src/version/dpp_versions/*, .../dpp_document_versions/*, .../v10.rs, packages/rs-platform-version/src/version/drive_versions/*
Add DPP contract/document versions v3 (adds should_add_creator_id flag) and Drive v5; update PLATFORM_V10 to use new versions.
SDK / FFI / WASM propagation
packages/rs-sdk-ffi/src/document/*.rs, packages/rs-sdk/src/platform/documents/transitions/*, packages/wasm-sdk/src/state_transitions/documents/mod.rs, packages/wasm-sdk/Cargo.toml
Update DocumentV0 constructions across SDK/FFI/WASM to include creator_id (often None or propagated); add wasm-sdk dev-dependency.
Tests, ABCI and contract JSONs
packages/rs-drive-abci/tests/**, packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/*
Add/update tests and contract JSONs to exercise $creatorId indices, unique-creator constraints, and serialization variants; update many tests to new DocumentV0 shape and expected hashes.
Document factories & misc callsite updates
packages/rs-dpp/src/.../random_document.rs, .../document_factory/*, packages/rs-drive/src/drive/contract/insert/*, test helpers, SDK tests
Update many DocumentV0 literals to include creator_id (mostly None); remove some internal key constants from factories.
Index-uniqueness refactor & v1 wiring
packages/rs-drive/src/drive/document/index_uniqueness/*
Add v1 variants for multiple uniqueness validators, switch to V0/V1 request types and enum dispatch, remove older validate_document_uniqueness module.
Minor / formatting
packages/rs-drive-abci/src/execution/validation/.../advanced_structure_v0/mod.rs
Whitespace/comment adjustment only.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Client
  participant SDK
  participant DPP as DPP
  participant ST as StateTransition
  participant Drive as Drive
  participant PV as PlatformVersion

  Client->>SDK: Build DocumentCreateTransition
  SDK->>DPP: Construct DocumentV0 (creator_id optional)
  SDK->>ST: try_from_create_transition(..., contract, document_type, PV)
  ST->>DPP: should_use_creator_id(contract_system_ver, contract_config_ver, PV)
  DPP-->>ST: bool
  alt true
    ST->>DPP: Insert $creatorId = owner_id into document/properties
  end
  ST->>Drive: validate_uniqueness_of_data_v1(request with creator_id)
  Drive-->>ST: Ok / DuplicateUniqueIndexError
  ST-->>Client: Transition result
Loading
sequenceDiagram
  autonumber
  participant DC as DataContract
  participant DTP as DocumentType
  participant PV as PlatformVersion

  DC->>DTP: create_document_types_from_document_schemas(id, system_ver, config_ver, schemas...)
  DTP->>DTP: try_from_schema(system_ver, config_ver, name, schema...)
  DTP->>DTP: system_properties_contains(system_ver, config_ver, transferable, trade_mode, prop, PV)
  alt should_add_creator_id enabled
    DTP-->>DC: treat CREATOR_ID as system property (disallow/index logic)
  else
    DTP-->>DC: default system properties only
  end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

enhancement, rs-sdk

Suggested reviewers

  • pauldelucia

Poem

"I hopped through code with tiny paws,
added creators, checked the laws. 🐇
Versions whispered, indices hum,
v2 serialization—here I come!
Contracts and hashes held in dance,
a rabbit's hop gave creator a chance."

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Title Check ✅ Passed The title clearly and concisely reflects the primary changes introduced in the pull request—adding support for a creator ID and enhancing the document uniqueness verification logic before insertion—using a conventional commit style that signals a breaking change. It is specific enough for a teammate to understand the main features at a glance without extraneous details.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/CreatorID

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

github-actions bot commented Sep 30, 2025

✅ gRPC Query Coverage Report

================================================================================
gRPC Query Coverage Report - NEW QUERIES ONLY
================================================================================

Total queries in proto: 47
Previously known queries: 47
New queries found: 0


================================================================================
Summary:
--------------------------------------------------------------------------------
No new queries found

Total known queries: 47
  - Implemented: 44
  - Not implemented: 2
  - Excluded: 1

Not implemented queries:
  - getConsensusParams
  - getTokenPreProgrammedDistributions

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
packages/rs-dpp/src/data_contract/v0/serialization/mod.rs (2)

79-119: Potential compilation error: data_contract_data used after destructuring.

At line 97, data_contract_data.config.version() is referenced, but data_contract_data was already destructured at lines 85-92. This should cause a compilation error since data_contract_data is no longer available after being moved/destructured.

Apply this fix:

     let document_types = DocumentType::create_document_types_from_document_schemas(
         id,
         0,
-        data_contract_data.config.version(),
+        config.version(),
         document_schemas,
         schema_defs.as_ref(),
         &BTreeMap::new(),

121-162: Potential compilation error: data_contract_data used after destructuring.

At line 140, data_contract_data.config.version() is referenced, but data_contract_data was already destructured at lines 127-135. This should cause a compilation error since data_contract_data is no longer available after being moved/destructured.

Apply this fix:

     let document_types = DocumentType::create_document_types_from_document_schemas(
         id,
         0,
-        data_contract_data.config.version(),
+        config.version(),
         document_schemas,
         schema_defs.as_ref(),
         &BTreeMap::new(),
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs (1)

27-32: Complete the parameter documentation.

The docstring at line 27 documents data_contract_system_version but line 42 adds contract_config_version without corresponding documentation. Add a docstring entry for contract_config_version to maintain consistency.

Apply this diff to complete the documentation:

 /// * `data_contract_system_version`: The version of the data contract
+/// * `contract_config_version`: The version of the contract configuration
 /// * `contract_document_types_raw`: Vector representing the raw contract document types.
🧹 Nitpick comments (13)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs (1)

4687-4753: LGTM! Test correctly validates backward compatibility.

This test ensures that data contracts using the creator_id index fail appropriately on protocol version 9, which does not support this feature. The test structure is clear and follows established patterns.

Optional refactor: The two tests in this module share significant boilerplate. If you add more protocol-version tests in the future, consider extracting a helper function to reduce duplication.

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (1)

677-920: LGTM! Test correctly validates v0 contract compatibility.

The test appropriately verifies that when using a v0 contract config (even with the latest platform version), the system correctly omits creatorId to maintain compatibility with v0 document serialization. The fee assertions match the pre-creatorId test, confirming consistent behavior.

Note: This test shares significant code with test_document_transfer_on_document_type_that_is_transferable_before_creator_id. Consider extracting common setup/assertion logic into a helper function to reduce duplication.

packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)

14-14: Add documentation comment for system_version_type method.

The new system_version_type method is missing a documentation comment, while all other methods in the DataContractV0Getters trait have doc comments (e.g., lines 10-11, 16-17, 19-20). This makes the purpose and return values unclear to users of the trait.

Apply this diff to add documentation:

     fn id_ref(&self) -> &Identifier;
+    /// Returns the system version type of the data contract (0 for V0, 1 for V1).
     fn system_version_type(&self) -> u16;
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (1)

157-163: Consider extracting duplicated creator ID logic.

The same creator ID insertion logic appears in both try_from_owned_create_transition_action_v0 (lines 157-163) and try_from_create_transition_action_v0 (lines 286-292). Consider extracting this into a helper function to reduce duplication and improve maintainability.

For example, introduce a helper in this module:

fn maybe_insert_creator_id(
    data: &mut BTreeMap<String, Value>,
    document_type: &DocumentType,
    system_version: u16,
    config_version: u16,
    owner_id: Identifier,
    platform_version: &PlatformVersion,
) -> Result<(), ProtocolError> {
    if document_type.should_use_creator_id(system_version, config_version, platform_version)? {
        data.insert(CREATOR_ID.to_string(), owner_id.into());
    }
    Ok(())
}

Then call it in both functions:

-                if document_type.should_use_creator_id(
-                    data_contract.contract.system_version_type(),
-                    data_contract.contract.config().version(),
-                    platform_version,
-                )? {
-                    data.insert(CREATOR_ID.to_string(), owner_id.into());
-                }
+                maybe_insert_creator_id(
+                    &mut data,
+                    &document_type,
+                    data_contract.contract.system_version_type(),
+                    data_contract.contract.config().version(),
+                    owner_id,
+                    platform_version,
+                )?;

Also applies to: 286-292

packages/rs-dpp/src/util/json_schema.rs (1)

185-186: Consider documenting the hardcoded system version.

The hardcoded literal 1 for data_contract_system_version may benefit from a brief comment explaining its choice in this test context.

         let document_type = DocumentType::try_from_schema(
             Identifier::random(),
+            // System version 1 used for this test
             1,
             config.version(),
             "doc",
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs (2)

201-201: Minor: Consider documenting the mutability change.

The data variable is now mutable (owned path) and properties is introduced (non-owned path) to support conditional CREATOR_ID insertion. This is a subtle but important change in the data flow.

Consider adding a brief inline comment explaining why data must be mutable:

// Make data mutable to conditionally insert CREATOR_ID before constructing the document
let DocumentCreateTransitionV0 { base, mut data, .. } = v0;

Also applies to: 314-314


190-215: Add rs-dpp tests for $creatorId insertion

  • Cover should_use_creator_id behavior for protocol versions 0 and 1 in DocumentCreateTransition v0.
  • $creatorId is defined in document/fields.rs and only inserted when the DataContract schema includes that system property, with downstream validation still applied.
  • Insertion deliberately overrides any user‐supplied $creatorId; confirm this matches the protocol specification.
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs (1)

108-113: Good: Sanitizing CREATOR_ID from user input before validation.

The code correctly:

  1. Clones the data to avoid mutating the original
  2. Removes CREATOR_ID to prevent user manipulation
  3. Validates only the user-defined properties

This ensures CREATOR_ID is system-managed and not user-settable during document creation.

Minor: Consider performance impact of cloning.

The .clone() on line 108 creates a copy of the entire data map just to remove one entry. If the data is large, this could be inefficient.

If performance becomes a concern, consider passing a sanitization predicate to the validation function instead:

// Alternative approach (if the validation API supports it):
data_contract
    .validate_document_properties_filtered(
        document_type_name, 
        self.data(), 
        |key| key != CREATOR_ID,
        platform_version
    )
    .map_err(Error::Protocol)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (1)

99-118: Consider the data cloning cost.

Similar to the create transition validation, the code clones the entire data map on line 99. For large documents, this could have performance implications.

If the transition's data is not used elsewhere after this point, consider taking ownership or using a mutable reference to avoid the clone. Alternatively, if performance profiling shows this is a hotspot, the data structure could be modified in-place if ownership allows.

packages/rs-sdk/tests/fetch/common.rs (1)

40-41: Parameterize test utility’s system version
Replace the hardcoded 1 in DocumentType::try_from_schema with the current constant (PlatformVersionCurrentVersion::VERSION) or accept it as an argument, ensuring tests automatically track future protocol version bumps. (common.rs)

packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs (1)

23-30: Consider simplifying the parameter list.

The function signature takes 6 parameters, several of which are only used in the version 1 branch. Consider whether transferable and trade_mode could be combined into a single enum or struct to reduce parameter count and improve maintainability.

packages/strategy-tests/src/operations.rs (1)

429-442: Call site correctly updated, but error handling could be improved.

The DocumentType::try_from_schema call correctly includes the two new version parameters (contract.system_version_type() and contract.config().version()) before the name_str argument, aligning with the updated signature.

However, the .expect() on line 442 will panic on deserialization failure. Consider propagating the error properly instead:

         let document_type = deserialized.document_type.and_then(|value| {
             match value {
                 Value::Map(map) => {
-                    map.into_iter()
+                    let result: Result<Option<DocumentType>, ProtocolError> = map.into_iter()
                         .map(|(name, schema_json)| {
                             let name_str = name.to_str().expect(
                                 "Couldn't convert document type name to str in deserialization",
                             );
                             let owner_id = contract.owner_id();
                             DocumentType::try_from_schema(
                                 owner_id,
                                 contract.system_version_type(),
                                 contract.config().version(),
                                 name_str,
                                 schema_json,
                                 None,
                                 contract.tokens(),
                                 contract.config(),
                                 full_validation,
                                 &mut vec![],
                                 platform_version,
                             )
-                            .expect("Failed to reconstruct DocumentType from schema")
                         })
-                        .next()
+                        .next()
+                        .transpose();
+                    result.ok()?
                 }
                 _ => None,
             }
         });

Or return the error from the outer function if this deserialization failure should be fatal.

packages/rs-dpp/src/document/extended_document/v0/mod.rs (1)

385-387: Keep the conditional for "$creatorId" and add tests

The conditional is correct — Value::replace_at_path can error if the key is missing and serialize.rs treats $creatorId as optional. Add unit tests covering both presence and absence of "$creatorId" (from_untrusted_platform_value path and serialization round-trip).

Files to check: packages/rs-dpp/src/document/extended_document/v0/mod.rs, packages/rs-platform-value/src/replace.rs, packages/rs-dpp/src/document/v0/serialize.rs.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f9d09e7 and 5134a40.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (56)
  • packages/rs-dpp/src/data_contract/accessors/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/config/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs (4 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs (3 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs (2 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/should_use_creator_id/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs (4 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs (8 hunks)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v1/mod.rs (8 hunks)
  • packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs (22 hunks)
  • packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs (2 hunks)
  • packages/rs-dpp/src/data_contract/methods/validate_document/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/v0/methods/schema.rs (3 hunks)
  • packages/rs-dpp/src/data_contract/v0/serialization/mod.rs (2 hunks)
  • packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/v1/methods/schema.rs (3 hunks)
  • packages/rs-dpp/src/data_contract/v1/serialization/mod.rs (2 hunks)
  • packages/rs-dpp/src/document/document_factory/v0/mod.rs (0 hunks)
  • packages/rs-dpp/src/document/extended_document/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/document/fields.rs (1 hunks)
  • packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs (0 hunks)
  • packages/rs-dpp/src/document/v0/serialize.rs (8 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/mod.rs (7 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs (7 hunks)
  • packages/rs-dpp/src/util/json_schema.rs (1 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs (2 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/advanced_structure_v0/mod.rs (2 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (6 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (3 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs (1 hunks)
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-format-version-0.json (1 hunks)
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json (2 hunks)
  • packages/rs-drive/src/query/conditions.rs (1 hunks)
  • packages/rs-drive/src/query/test_index.rs (1 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (2 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (4 hunks)
  • packages/rs-drive/src/util/object_size_info/document_info.rs (1 hunks)
  • packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs (1 hunks)
  • packages/rs-drive/tests/query_tests.rs (3 hunks)
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs (2 hunks)
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs (1 hunks)
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs (1 hunks)
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v3.rs (1 hunks)
  • packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs (1 hunks)
  • packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v3.rs (1 hunks)
  • packages/rs-platform-version/src/version/v10.rs (2 hunks)
  • packages/rs-sdk/tests/fetch/common.rs (1 hunks)
  • packages/strategy-tests/src/operations.rs (1 hunks)
  • packages/wasm-sdk/Cargo.toml (1 hunks)
💤 Files with no reviewable changes (2)
  • packages/rs-dpp/src/document/document_factory/v0/mod.rs
  • packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs
🧰 Additional context used
📓 Path-based instructions (5)
**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.rs: Format Rust code with cargo fmt
Run Clippy linter for Rust code

Files:

  • packages/rs-dpp/src/document/fields.rs
  • packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs
  • packages/rs-dpp/src/data_contract/accessors/v0/mod.rs
  • packages/rs-dpp/src/data_contract/v0/accessors/mod.rs
  • packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs
  • packages/rs-dpp/src/document/extended_document/v0/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs
  • packages/rs-dpp/src/data_contract/accessors/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs
  • packages/rs-drive/src/query/conditions.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs
  • packages/rs-dpp/src/data_contract/v1/accessors/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs
  • packages/rs-dpp/src/data_contract/config/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/util/object_size_info/document_info.rs
  • packages/rs-dpp/src/data_contract/v0/serialization/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs
  • packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/advanced_structure_v0/mod.rs
  • packages/rs-drive/tests/query_tests.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v1/mod.rs
  • packages/strategy-tests/src/operations.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs
  • packages/rs-drive/src/query/test_index.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v3.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs
  • packages/rs-sdk/tests/fetch/common.rs
  • packages/rs-dpp/src/data_contract/v1/methods/schema.rs
  • packages/rs-platform-version/src/version/v10.rs
  • packages/rs-dpp/src/data_contract/methods/validate_document/v0/mod.rs
  • packages/rs-dpp/src/data_contract/v0/methods/schema.rs
  • packages/rs-dpp/src/util/json_schema.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v3.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/should_use_creator_id/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs
  • packages/rs-dpp/src/data_contract/v1/serialization/mod.rs
  • packages/rs-dpp/src/document/v0/serialize.rs
packages/rs-*/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

packages/rs-*/**/*.rs: Use rustfmt defaults for Rust code (format via cargo fmt --all)
Keep Rust code clippy-clean (cargo clippy)
Name Rust modules in snake_case
Use PascalCase for Rust types
Use SCREAMING_SNAKE_CASE for Rust constants

Files:

  • packages/rs-dpp/src/document/fields.rs
  • packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs
  • packages/rs-dpp/src/data_contract/accessors/v0/mod.rs
  • packages/rs-dpp/src/data_contract/v0/accessors/mod.rs
  • packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs
  • packages/rs-dpp/src/document/extended_document/v0/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs
  • packages/rs-dpp/src/data_contract/accessors/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs
  • packages/rs-drive/src/query/conditions.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs
  • packages/rs-dpp/src/data_contract/v1/accessors/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs
  • packages/rs-dpp/src/data_contract/config/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/util/object_size_info/document_info.rs
  • packages/rs-dpp/src/data_contract/v0/serialization/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs
  • packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/advanced_structure_v0/mod.rs
  • packages/rs-drive/tests/query_tests.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v1/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/mod.rs
  • packages/rs-drive/src/query/test_index.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v3.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs
  • packages/rs-sdk/tests/fetch/common.rs
  • packages/rs-dpp/src/data_contract/v1/methods/schema.rs
  • packages/rs-platform-version/src/version/v10.rs
  • packages/rs-dpp/src/data_contract/methods/validate_document/v0/mod.rs
  • packages/rs-dpp/src/data_contract/v0/methods/schema.rs
  • packages/rs-dpp/src/util/json_schema.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs
  • packages/rs-platform-version/src/version/dpp_versions/dpp_document_versions/v3.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/should_use_creator_id/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs
  • packages/rs-dpp/src/data_contract/v1/serialization/mod.rs
  • packages/rs-dpp/src/document/v0/serialize.rs
packages/wasm-sdk/**

📄 CodeRabbit inference engine (CLAUDE.md)

Keep WASM SDK docs in sync (run generate_docs.py) when updating the WASM SDK

Files:

  • packages/wasm-sdk/Cargo.toml
packages/**/tests/**

📄 CodeRabbit inference engine (AGENTS.md)

Place unit and integration tests alongside each package in packages//tests

Files:

  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/tests/query_tests.rs
  • packages/rs-sdk/tests/fetch/common.rs
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-format-version-0.json
packages/**/tests/**/*.{js,ts,jsx,tsx,rs}

📄 CodeRabbit inference engine (AGENTS.md)

packages/**/tests/**/*.{js,ts,jsx,tsx,rs}: Name tests descriptively, starting with “should …”
Unit/integration tests must not perform network calls; mock dependencies instead

Files:

  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/tests/query_tests.rs
  • packages/rs-sdk/tests/fetch/common.rs
🧠 Learnings (4)
📓 Common learnings
Learnt from: QuantumExplorer
PR: dashpay/platform#2257
File: packages/rs-drive-abci/src/mimic/test_quorum.rs:159-164
Timestamp: 2024-11-20T16:16:01.830Z
Learning: QuantumExplorer prefers not to receive auto-generated messages asking to post on social media.
📚 Learning: 2024-11-03T10:38:00.762Z
Learnt from: shumkov
PR: dashpay/platform#2305
File: packages/rs-drive-abci/src/abci/handler/info.rs:0-0
Timestamp: 2024-11-03T10:38:00.762Z
Learning: In this context, using `.unwrap()?` on the result of `root_hash` is acceptable and will not cause a panic.

Applied to files:

  • packages/rs-drive/tests/query_tests.rs
📚 Learning: 2025-04-11T09:08:05.652Z
Learnt from: pauldelucia
PR: dashpay/platform#2523
File: packages/rs-drive/src/drive/contract/update/update_contract/v1/update_description/v1/mod.rs:147-151
Timestamp: 2025-04-11T09:08:05.652Z
Learning: Description length validation for data contracts is already handled in the data contract validation process, specifically in packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs.

Applied to files:

  • packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs
📚 Learning: 2025-04-11T09:08:05.652Z
Learnt from: pauldelucia
PR: dashpay/platform#2523
File: packages/rs-drive/src/drive/contract/update/update_contract/v1/update_description/v1/mod.rs:147-151
Timestamp: 2025-04-11T09:08:05.652Z
Learning: Description length validation for data contracts (ensuring it's between 3 and 100 characters) is already handled at the data contract validation level in packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs, making additional checks in the update operations redundant.

Applied to files:

  • packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs
🧬 Code graph analysis (27)
packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs (1)
packages/rs-dpp/src/document/v0/serialize.rs (4)
  • serialize_v2 (490-711)
  • document_type (883-915)
  • document_type (1106-1131)
  • document_type (1347-1372)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (3)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • system_version_type (41-46)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • system_version_type (24-26)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • system_version_type (33-35)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (2)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • system_version_type (41-46)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • system_version_type (33-35)
packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs (1)
packages/rs-drive/src/query/mod.rs (2)
  • contract (1040-1045)
  • contract (1143-1148)
packages/rs-dpp/src/data_contract/accessors/mod.rs (3)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • system_version_type (14-14)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • system_version_type (24-26)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • system_version_type (33-35)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (3)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • system_version_type (41-46)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • system_version_type (14-14)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • system_version_type (24-26)
packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs (3)
packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs (1)
  • system_properties_contains (23-56)
packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs (6)
  • documents_transferable (140-145)
  • documents_transferable (357-362)
  • documents_transferable (520-525)
  • trade_mode (147-152)
  • trade_mode (364-369)
  • trade_mode (527-532)
packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs (2)
  • documents_transferable (90-92)
  • trade_mode (94-96)
packages/rs-dpp/src/data_contract/config/mod.rs (5)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • version (48-53)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • version (17-17)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • version (28-30)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • version (37-39)
packages/rs-dpp/src/data_contract/serialized_version/mod.rs (1)
  • version (137-142)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (11)
packages/rs-dpp/src/data_contract/accessors/mod.rs (4)
  • system_version_type (41-46)
  • config (128-133)
  • version (48-53)
  • id (27-32)
packages/rs-dpp/src/data_contract/config/mod.rs (1)
  • version (30-35)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs (1)
  • setup_identity (135-191)
packages/rs-dpp/src/data_contract/document_type/v1/accessors.rs (1)
  • documents_mutable (85-87)
packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs (3)
  • documents_mutable (126-131)
  • documents_mutable (343-348)
  • documents_mutable (506-511)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs (2)
  • new_document_creation_transition_from_document (93-134)
  • new_document_transfer_transition_from_document (179-220)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs (2)
  • new_document_creation_transition_from_document (102-143)
  • new_document_transfer_transition_from_document (230-271)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (2)
  • new_document_creation_transition_from_document (91-145)
  • new_document_transfer_transition_from_document (204-260)
packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs (4)
  • valid_count (89-91)
  • invalid_paid_count (79-81)
  • invalid_unpaid_count (84-86)
  • aggregated_fees (99-101)
packages/rs-drive/src/query/mod.rs (1)
  • from_sql_expr (824-982)
packages/rs-dpp/src/fee/fee_result/refunds.rs (1)
  • calculate_refunds_amount_for_identity (155-164)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs (1)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (1)
  • data (55-55)
packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs (1)
packages/rs-dpp/src/document/v0/serialize.rs (4)
  • from_bytes_v2 (1155-1397)
  • document_type (883-915)
  • document_type (1106-1131)
  • document_type (1347-1372)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/advanced_structure_v0/mod.rs (1)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (1)
  • data (55-55)
packages/rs-dpp/src/data_contract/document_type/class_methods/mod.rs (1)
packages/rs-dpp/src/data_contract/document_type/class_methods/should_use_creator_id/mod.rs (3)
  • should_use_creator_id (11-24)
  • should_use_creator_id (30-43)
  • should_use_creator_id (49-62)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (1)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (1)
  • data (55-55)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (4)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs (1)
  • data_contract (14-67)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs (1)
  • data_contract (14-68)
packages/rs-dpp/src/data_contract/v0/serialization/mod.rs (3)
  • data_contract (49-77)
  • data_contract (79-119)
  • data_contract (121-162)
packages/rs-dpp/src/data_contract/v1/serialization/mod.rs (3)
  • data_contract (48-76)
  • data_contract (78-127)
  • data_contract (129-191)
packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v1/mod.rs (2)
packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs (1)
  • system_properties_contains (23-56)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • config (128-133)
packages/rs-drive/src/query/test_index.rs (4)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • config (128-133)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • config (43-43)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • config (98-100)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • config (107-109)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs (4)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • config (128-133)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • config (43-43)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • config (98-100)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • config (107-109)
packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs (4)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • config (128-133)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • config (43-43)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • config (98-100)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • config (107-109)
packages/rs-sdk/tests/fetch/common.rs (4)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • config (128-133)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • config (43-43)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • config (98-100)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • config (107-109)
packages/rs-dpp/src/data_contract/v1/methods/schema.rs (2)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs (1)
  • data_contract (14-68)
packages/rs-dpp/src/data_contract/v1/serialization/mod.rs (3)
  • data_contract (48-76)
  • data_contract (78-127)
  • data_contract (129-191)
packages/rs-dpp/src/data_contract/v0/methods/schema.rs (3)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs (1)
  • data_contract (14-67)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs (1)
  • data_contract (14-68)
packages/rs-dpp/src/data_contract/v0/serialization/mod.rs (3)
  • data_contract (49-77)
  • data_contract (79-119)
  • data_contract (121-162)
packages/rs-dpp/src/util/json_schema.rs (4)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • config (128-133)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • config (43-43)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • config (98-100)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (1)
  • config (107-109)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs (4)
packages/rs-dpp/src/data_contract/v0/serialization/mod.rs (3)
  • data_contract (49-77)
  • data_contract (79-119)
  • data_contract (121-162)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • owner_id (55-60)
packages/rs-dpp/src/data_contract/accessors/v0/mod.rs (1)
  • owner_id (20-20)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • owner_id (32-34)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs (1)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs (18)
  • execution (146-157)
  • execution (159-215)
  • execution (217-258)
  • execution (260-316)
  • execution (364-440)
  • execution (442-475)
  • execution (477-548)
  • execution (550-564)
  • execution (566-669)
  • execution (671-758)
  • execution (760-775)
  • execution (788-871)
  • execution (873-944)
  • execution (946-979)
  • execution (982-1016)
  • None (1044-1044)
  • None (1054-1054)
  • None (1399-1399)
packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs (4)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs (1)
  • data_contract (14-67)
packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs (1)
  • data_contract (14-68)
packages/rs-dpp/src/data_contract/v0/serialization/mod.rs (3)
  • data_contract (49-77)
  • data_contract (79-119)
  • data_contract (121-162)
packages/rs-dpp/src/data_contract/v1/serialization/mod.rs (3)
  • data_contract (48-76)
  • data_contract (78-127)
  • data_contract (129-191)
packages/rs-dpp/src/document/v0/serialize.rs (2)
packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs (1)
  • serialize_v2 (26-26)
packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs (1)
  • from_bytes_v2 (31-37)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (21)
  • GitHub Check: Rust packages (drive) / Tests
  • GitHub Check: Rust packages (drive) / Unused dependencies
  • GitHub Check: Rust packages (drive) / Formatting
  • GitHub Check: Rust packages (drive) / Linting
  • GitHub Check: Rust packages (wasm-dpp) / Tests
  • GitHub Check: Rust packages (rs-sdk-ffi) / Tests
  • GitHub Check: Rust packages (dash-sdk) / Unused dependencies
  • GitHub Check: Rust packages (wasm-sdk) / Unused dependencies
  • GitHub Check: Rust packages (dash-sdk) / Linting
  • GitHub Check: Rust packages (dash-sdk) / Check each feature
  • GitHub Check: Rust packages (dash-sdk) / Tests
  • GitHub Check: Rust packages (wasm-sdk) / Tests
  • GitHub Check: Rust packages (wasm-sdk) / Linting
  • GitHub Check: Build Docker images (Dashmate helper, dashmate-helper, dashmate-helper) / Build Dashmate helper image
  • GitHub Check: Build Docker images (DAPI, dapi, dapi) / Build DAPI image
  • GitHub Check: Build Docker images (Drive, drive, drive-abci) / Build Drive image
  • GitHub Check: Build JS packages / Build JS
  • GitHub Check: Rust crates security audit
  • GitHub Check: Build rs-sdk-ffi for iOS targets (aarch64-apple-ios)
  • GitHub Check: Build rs-sdk-ffi for iOS targets (aarch64-apple-ios-sim)
  • GitHub Check: Swift SDK and Example build (warnings as errors)

@QuantumExplorer QuantumExplorer added this to the v2.1.0 milestone Sep 30, 2025
}
}
version => Err(ProtocolError::UnknownVersionMismatch {
method: "DocumentType::system_properties".to_string(),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Invlid method name

contract_config_version: u16,
transferable: Transferable,
trade_mode: TradeMode,
index_name: &str,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

property_name ?

}

let mut data = self.data().clone();
data.remove(CREATOR_ID);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we remove it here?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We remove it because it's not part of the schema. So it would cause a validation issue if we would try to validate with it there.

}

let mut data = self.data().clone();
data.remove(CREATOR_ID);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed and did things a bit cleaner

};

let mut data = data.clone();
if let Some(original_creator_id) = original_creator_id {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

System field is not supposed to be in data by design, isn't?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well... if it's part of the overlying struct... we would need a new document structure version. Seemed like this was easier.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed things around. This basically means that we probably should not have DocumentV0, and should just have Document since they serialize a special way.

data_contract.contract.config().version(),
platform_version,
)? {
data.insert(CREATOR_ID.to_string(), owner_id.into());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we insert to data?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

answered above.

platform_version: &PlatformVersion,
) -> Result<SimpleConsensusValidationResult, ProtocolError> {
// Make sure that the document type is defined in the contract
let Some(document_type) = self.document_type_optional_for_name(name) else {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we remove it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It wasn't actually being used.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean validate_document_v0 is calling or we already have these checks self.validate_document_properties_v0 ?

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/wasm-sdk/src/state_transitions/documents/mod.rs (2)

930-945: Preserve creator_id in document_delete.

The document_delete method fetches the existing document (line 907-909) to get the current revision but doesn't preserve the creator_id when constructing the deletion document. The creator_id should be copied from existing_doc to maintain consistency.

Apply this diff:

         let document = Document::V0(DocumentV0 {
             id: doc_id,
             owner_id: owner_identifier,
             properties: Default::default(),
             revision: Some(current_revision), // Use the actual current revision
             created_at: None,
             updated_at: None,
             transferred_at: None,
             created_at_block_height: None,
             updated_at_block_height: None,
             transferred_at_block_height: None,
             created_at_core_block_height: None,
             updated_at_core_block_height: None,
             transferred_at_core_block_height: None,
-            creator_id: None,
+            creator_id: existing_doc.creator_id(),
         });

601-620: Preserve the original creator_id in document replace transitions.
In packages/wasm-sdk/src/state_transitions/documents/mod.rs (around the Document::V0 instantiation), replace the hard-coded creator_id: None with the original document’s creator_id (e.g. fetch the existing document and use its .creator_id()) so that immutable creator metadata isn’t inadvertently cleared.

🧹 Nitpick comments (2)
packages/rs-dpp/src/data_contract/document_type/random_document.rs (1)

351-351: Consider parameterizing or randomizing creator_id for comprehensive test coverage.

The field is hardcoded to None. While this is correct for backwards compatibility and the simplest implementation, a random document generator might benefit from optionally populating creator_id to test creator_id-aware code paths. Consider:

  1. Adding an optional creator_id parameter to random_document_with_params
  2. Randomly generating a creator_id when document_field_fill_type == FillIfNotRequired
  3. Consulting should_use_creator_id logic (mentioned in PR context) to conditionally populate the field

This would enable more comprehensive testing of the new creator_id functionality across the platform.

Example parameterization:

 fn random_document_with_params(
     &self,
     owner_id: Identifier,
     entropy: Bytes32,
+    creator_id: Option<Identifier>,
     time_ms: Option<TimestampMillis>,
     block_height: Option<BlockHeight>,
     core_block_height: Option<CoreBlockHeight>,
     document_field_fill_type: DocumentFieldFillType,
     document_field_fill_size: DocumentFieldFillSize,
     rng: &mut StdRng,
     platform_version: &PlatformVersion,
 ) -> Result<Document, ProtocolError> {
     // ...
     0 => Ok(DocumentV0 {
         id,
         properties,
         owner_id,
         revision,
         created_at,
         updated_at,
         transferred_at: None,
         created_at_block_height,
         updated_at_block_height,
         transferred_at_block_height: None,
         created_at_core_block_height,
         updated_at_core_block_height,
         transferred_at_core_block_height: None,
-        creator_id: None,
+        creator_id,
     }

And update call sites to pass None or a random identifier as needed.

packages/rs-sdk-ffi/src/document/purchase.rs (1)

398-398: Consider setting creator_id to a realistic value in test mocks.

While None is acceptable for these tests, real documents typically have a creator_id. For purchase scenarios, creator_id should remain unchanged when ownership transfers, so setting it to Some(owner_id) or a different identifier would better reflect production behavior.

Example:

-            creator_id: None,
+            creator_id: Some(owner_id), // In practice, creator is typically set
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5a6b832 and f4bd4a6.

📒 Files selected for processing (57)
  • packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs (1 hunks)
  • packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs (7 hunks)
  • packages/rs-dpp/src/data_contract/document_type/random_document.rs (1 hunks)
  • packages/rs-dpp/src/document/accessors/mod.rs (2 hunks)
  • packages/rs-dpp/src/document/accessors/v0/mod.rs (2 hunks)
  • packages/rs-dpp/src/document/document_factory/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs (1 hunks)
  • packages/rs-dpp/src/document/extended_document/mod.rs (1 hunks)
  • packages/rs-dpp/src/document/v0/accessors.rs (2 hunks)
  • packages/rs-dpp/src/document/v0/cbor_conversion.rs (5 hunks)
  • packages/rs-dpp/src/document/v0/json_conversion.rs (2 hunks)
  • packages/rs-dpp/src/document/v0/mod.rs (3 hunks)
  • packages/rs-dpp/src/document/v0/serialize.rs (8 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs (10 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/mod.rs (8 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs (6 hunks)
  • packages/rs-dpp/src/tests/json_document.rs (1 hunks)
  • packages/rs-dpp/src/tokens/token_event.rs (1 hunks)
  • packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs (1 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs (0 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs (2 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (21 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (2 hunks)
  • packages/rs-drive-abci/src/query/document_query/v0/mod.rs (5 hunks)
  • packages/rs-drive-abci/src/test/helpers/fee_pools.rs (1 hunks)
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-unique-creator-id-index.json (1 hunks)
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-unique-creator-id-with-owner-id-index.json (1 hunks)
  • packages/rs-drive/src/drive/contract/insert/add_description/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/contract/insert/add_new_keywords/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs (1 hunks)
  • packages/rs-drive/src/query/mod.rs (1 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (4 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (6 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (2 hunks)
  • packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs (2 hunks)
  • packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs (2 hunks)
  • packages/rs-sdk-ffi/src/document/create.rs (1 hunks)
  • packages/rs-sdk-ffi/src/document/delete.rs (1 hunks)
  • packages/rs-sdk-ffi/src/document/price.rs (1 hunks)
  • packages/rs-sdk-ffi/src/document/purchase.rs (1 hunks)
  • packages/rs-sdk-ffi/src/document/put.rs (1 hunks)
  • packages/rs-sdk-ffi/src/document/replace.rs (1 hunks)
  • packages/rs-sdk-ffi/src/document/transfer.rs (1 hunks)
  • packages/rs-sdk/src/platform/documents/transitions/delete.rs (1 hunks)
  • packages/rs-sdk/src/platform/documents/transitions/purchase.rs (1 hunks)
  • packages/rs-sdk/src/platform/documents/transitions/set_price.rs (1 hunks)
  • packages/rs-sdk/src/platform/documents/transitions/transfer.rs (1 hunks)
  • packages/rs-sdk/src/platform/dpns_usernames/mod.rs (2 hunks)
  • packages/wasm-sdk/src/state_transitions/documents/mod.rs (5 hunks)
💤 Files with no reviewable changes (1)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/advanced_structure_v0/mod.rs
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs
  • packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/class_methods/system_properties/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs
🧰 Additional context used
📓 Path-based instructions (7)
**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.rs: Format Rust code with cargo fmt
Run Clippy linter for Rust code

Files:

  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/mod.rs
  • packages/rs-dpp/src/document/accessors/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/transfer.rs
  • packages/rs-dpp/src/document/v0/json_conversion.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs
  • packages/rs-dpp/src/document/accessors/mod.rs
  • packages/rs-dpp/src/document/v0/mod.rs
  • packages/rs-dpp/src/document/extended_document/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/random_document.rs
  • packages/rs-sdk-ffi/src/document/delete.rs
  • packages/rs-sdk-ffi/src/document/replace.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/delete.rs
  • packages/rs-dpp/src/tokens/token_event.rs
  • packages/rs-sdk-ffi/src/document/create.rs
  • packages/rs-sdk/src/platform/dpns_usernames/mod.rs
  • packages/rs-sdk-ffi/src/document/purchase.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs
  • packages/rs-sdk-ffi/src/document/transfer.rs
  • packages/rs-drive-abci/src/query/document_query/v0/mod.rs
  • packages/rs-sdk-ffi/src/document/price.rs
  • packages/rs-drive/src/query/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs
  • packages/rs-sdk-ffi/src/document/put.rs
  • packages/rs-dpp/src/document/v0/cbor_conversion.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs
  • packages/rs-drive/src/drive/contract/insert/add_new_keywords/v0/mod.rs
  • packages/rs-dpp/src/tests/json_document.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs
  • packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs
  • packages/wasm-sdk/src/state_transitions/documents/mod.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs
  • packages/rs-drive/src/drive/contract/insert/add_description/v0/mod.rs
  • packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/purchase.rs
  • packages/rs-dpp/src/document/v0/accessors.rs
  • packages/rs-dpp/src/document/document_factory/v0/mod.rs
  • packages/rs-dpp/src/document/v0/serialize.rs
  • packages/rs-drive-abci/src/test/helpers/fee_pools.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/set_price.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs
packages/rs-*/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

packages/rs-*/**/*.rs: Use rustfmt defaults for Rust code (format via cargo fmt --all)
Keep Rust code clippy-clean (cargo clippy)
Name Rust modules in snake_case
Use PascalCase for Rust types
Use SCREAMING_SNAKE_CASE for Rust constants

Files:

  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/mod.rs
  • packages/rs-dpp/src/document/accessors/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/transfer.rs
  • packages/rs-dpp/src/document/v0/json_conversion.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs
  • packages/rs-dpp/src/document/accessors/mod.rs
  • packages/rs-dpp/src/document/v0/mod.rs
  • packages/rs-dpp/src/document/extended_document/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/random_document.rs
  • packages/rs-sdk-ffi/src/document/delete.rs
  • packages/rs-sdk-ffi/src/document/replace.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/delete.rs
  • packages/rs-dpp/src/tokens/token_event.rs
  • packages/rs-sdk-ffi/src/document/create.rs
  • packages/rs-sdk/src/platform/dpns_usernames/mod.rs
  • packages/rs-sdk-ffi/src/document/purchase.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs
  • packages/rs-sdk-ffi/src/document/transfer.rs
  • packages/rs-drive-abci/src/query/document_query/v0/mod.rs
  • packages/rs-sdk-ffi/src/document/price.rs
  • packages/rs-drive/src/query/mod.rs
  • packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs
  • packages/rs-sdk-ffi/src/document/put.rs
  • packages/rs-dpp/src/document/v0/cbor_conversion.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs
  • packages/rs-drive/src/drive/contract/insert/add_new_keywords/v0/mod.rs
  • packages/rs-dpp/src/tests/json_document.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs
  • packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs
  • packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs
  • packages/rs-drive/src/drive/contract/insert/add_description/v0/mod.rs
  • packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/purchase.rs
  • packages/rs-dpp/src/document/v0/accessors.rs
  • packages/rs-dpp/src/document/document_factory/v0/mod.rs
  • packages/rs-dpp/src/document/v0/serialize.rs
  • packages/rs-drive-abci/src/test/helpers/fee_pools.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs
  • packages/rs-sdk/src/platform/documents/transitions/set_price.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs
packages/rs-sdk-ffi/**/*.{h,rs}

📄 CodeRabbit inference engine (CLAUDE.md)

Follow unified SDK function prefixes: dash_core_sdk_* for Core, dash_sdk_* for Platform, dash_unified_sdk_* for unified APIs

Files:

  • packages/rs-sdk-ffi/src/document/delete.rs
  • packages/rs-sdk-ffi/src/document/replace.rs
  • packages/rs-sdk-ffi/src/document/create.rs
  • packages/rs-sdk-ffi/src/document/purchase.rs
  • packages/rs-sdk-ffi/src/document/transfer.rs
  • packages/rs-sdk-ffi/src/document/price.rs
  • packages/rs-sdk-ffi/src/document/put.rs
packages/rs-sdk-ffi/**

📄 CodeRabbit inference engine (AGENTS.md)

Keep iOS/FFI Rust SDK artifacts in packages/rs-sdk-ffi

Files:

  • packages/rs-sdk-ffi/src/document/delete.rs
  • packages/rs-sdk-ffi/src/document/replace.rs
  • packages/rs-sdk-ffi/src/document/create.rs
  • packages/rs-sdk-ffi/src/document/purchase.rs
  • packages/rs-sdk-ffi/src/document/transfer.rs
  • packages/rs-sdk-ffi/src/document/price.rs
  • packages/rs-sdk-ffi/src/document/put.rs
packages/**/tests/**

📄 CodeRabbit inference engine (AGENTS.md)

Place unit and integration tests alongside each package in packages//tests

Files:

  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-unique-creator-id-with-owner-id-index.json
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-unique-creator-id-index.json
  • packages/rs-dpp/src/tests/json_document.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
packages/**/tests/**/*.{js,ts,jsx,tsx,rs}

📄 CodeRabbit inference engine (AGENTS.md)

packages/**/tests/**/*.{js,ts,jsx,tsx,rs}: Name tests descriptively, starting with “should …”
Unit/integration tests must not perform network calls; mock dependencies instead

Files:

  • packages/rs-dpp/src/tests/json_document.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
packages/wasm-sdk/**

📄 CodeRabbit inference engine (CLAUDE.md)

Keep WASM SDK docs in sync (run generate_docs.py) when updating the WASM SDK

Files:

  • packages/wasm-sdk/src/state_transitions/documents/mod.rs
🧠 Learnings (3)
📓 Common learnings
Learnt from: QuantumExplorer
PR: dashpay/platform#2257
File: packages/rs-drive-abci/src/mimic/test_quorum.rs:159-164
Timestamp: 2024-11-20T16:16:01.830Z
Learning: QuantumExplorer prefers not to receive auto-generated messages asking to post on social media.
📚 Learning: 2024-10-09T00:22:57.778Z
Learnt from: shumkov
PR: dashpay/platform#2201
File: packages/rs-platform-version/src/version/v2.rs:1186-1188
Timestamp: 2024-10-09T00:22:57.778Z
Learning: In the `IdentityTransitionVersions` structure within `packages/rs-platform-version/src/version/v2.rs`, the field `credit_withdrawal` does not need the `identity_` prefix since it is already encompassed within identity state transitions.

Applied to files:

  • packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs
📚 Learning: 2025-09-30T03:30:59.551Z
Learnt from: QuantumExplorer
PR: dashpay/platform#2790
File: packages/rs-dpp/src/document/v0/serialize.rs:502-502
Timestamp: 2025-09-30T03:30:59.551Z
Learning: The `$creatorId` system property should NOT be added to NOT_ALLOWED_SYSTEM_PROPERTIES because it needs to be indexable. Only `$id` is banned from user schemas. System properties like `$creatorId`, `$ownerId`, `$transferredAt`, etc. can all be referenced in index definitions while remaining system-managed.

Applied to files:

  • packages/rs-dpp/src/document/v0/serialize.rs
🧬 Code graph analysis (18)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/mod.rs (5)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/document/accessors/v0/mod.rs (4)
packages/rs-dpp/src/document/accessors/mod.rs (2)
  • creator_id (114-118)
  • set_creator_id (211-215)
packages/rs-dpp/src/document/v0/accessors.rs (2)
  • creator_id (160-162)
  • set_creator_id (290-292)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/document/v0/json_conversion.rs (4)
packages/rs-dpp/src/document/accessors/mod.rs (4)
  • transferred_at (72-76)
  • transferred_at_block_height (90-94)
  • transferred_at_core_block_height (108-112)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (4)
  • transferred_at (34-34)
  • transferred_at_block_height (46-46)
  • transferred_at_core_block_height (49-49)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (4)
  • transferred_at (73-75)
  • transferred_at_block_height (124-126)
  • transferred_at_core_block_height (151-153)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (4)
  • transferred_at (58-62)
  • transferred_at_block_height (78-82)
  • transferred_at_core_block_height (98-102)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (4)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/document/accessors/mod.rs (4)
packages/rs-dpp/src/document/accessors/v0/mod.rs (2)
  • creator_id (50-50)
  • set_creator_id (160-160)
packages/rs-dpp/src/document/v0/accessors.rs (2)
  • creator_id (160-162)
  • set_creator_id (290-292)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/document/v0/mod.rs (3)
packages/rs-dpp/src/document/accessors/mod.rs (4)
  • transferred_at (72-76)
  • transferred_at_block_height (90-94)
  • transferred_at_core_block_height (108-112)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (4)
  • transferred_at (34-34)
  • transferred_at_block_height (46-46)
  • transferred_at_core_block_height (49-49)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (4)
  • transferred_at (73-75)
  • transferred_at_block_height (124-126)
  • transferred_at_core_block_height (151-153)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (4)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs (4)
packages/rs-dpp/src/document/accessors/mod.rs (2)
  • creator_id (114-118)
  • owner_id (24-28)
packages/rs-dpp/src/document/v0/accessors.rs (2)
  • creator_id (160-162)
  • owner_id (20-22)
packages/rs-dpp/src/data_contract/accessors/mod.rs (1)
  • owner_id (55-60)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (1)
  • owner_id (32-34)
packages/rs-dpp/src/document/v0/cbor_conversion.rs (5)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/tests/json_document.rs (3)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (1)
  • data (55-55)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • data (104-108)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • data (78-78)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs (4)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs (1)
  • setup_identity (135-191)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs (1)
  • new_document_creation_transition_from_document (93-134)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (1)
  • new_document_creation_transition_from_document (91-145)
packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs (1)
  • invalid_paid_count (79-81)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs (5)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/data_contract/document_type/methods/versioned_methods.rs (7)
packages/rs-dpp/src/document/accessors/mod.rs (2)
  • creator_id (114-118)
  • properties (36-40)
packages/rs-dpp/src/document/accessors/v0/mod.rs (2)
  • creator_id (50-50)
  • properties (19-19)
packages/rs-dpp/src/document/v0/accessors.rs (2)
  • creator_id (160-162)
  • properties (28-30)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (2)
  • creator_id (116-120)
  • data (104-108)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (2)
  • creator_id (83-83)
  • data (78-78)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs (1)
  • data (55-55)
packages/rs-dpp/src/document/extended_document/v0/mod.rs (1)
  • properties (151-153)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs (1)
packages/wasm-sdk/src/state_transitions/documents/mod.rs (1)
  • document (1157-1159)
packages/rs-dpp/src/document/v0/accessors.rs (4)
packages/rs-dpp/src/document/accessors/mod.rs (2)
  • creator_id (114-118)
  • set_creator_id (211-215)
packages/rs-dpp/src/document/accessors/v0/mod.rs (2)
  • creator_id (50-50)
  • set_creator_id (160-160)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
  • creator_id (116-120)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (1)
  • creator_id (83-83)
packages/rs-dpp/src/document/v0/serialize.rs (4)
packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs (1)
  • serialize_v2 (26-26)
packages/rs-dpp/src/document/accessors/mod.rs (2)
  • creator_id (114-118)
  • id (12-16)
packages/rs-dpp/src/document/v0/accessors.rs (2)
  • creator_id (160-162)
  • id (12-14)
packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs (1)
  • from_bytes_v2 (31-37)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (9)
packages/rs-dpp/src/tests/json_document.rs (1)
  • json_document_to_contract (66-74)
packages/rs-dpp/src/data_contract/accessors/mod.rs (5)
  • system_version_type (41-46)
  • config (128-133)
  • version (48-53)
  • id (27-32)
  • tokens (219-224)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs (1)
  • setup_identity (135-191)
packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs (3)
  • documents_mutable (126-131)
  • documents_mutable (343-348)
  • documents_mutable (506-511)
packages/rs-drive/src/query/mod.rs (1)
  • from_sql_expr (824-982)
packages/rs-dpp/src/fee/fee_result/refunds.rs (1)
  • calculate_refunds_amount_for_identity (155-164)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs (3)
  • new_document_creation_transition_from_document (102-143)
  • new_document_transfer_transition_from_document (230-271)
  • new_document_deletion_transition_from_document (188-227)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs (3)
  • new_document_creation_transition_from_document (93-134)
  • new_document_transfer_transition_from_document (179-220)
  • new_document_deletion_transition_from_document (223-262)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (3)
  • new_document_creation_transition_from_document (91-145)
  • new_document_transfer_transition_from_document (204-260)
  • new_document_deletion_transition_from_document (263-315)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs (1)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (63-232)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: Rust packages (dapi-grpc) / Tests
  • GitHub Check: Rust packages (wasm-dpp) / Tests
  • GitHub Check: Build Docker images (Dashmate helper, dashmate-helper, dashmate-helper) / Build Dashmate helper image
  • GitHub Check: Build Docker images (Drive, drive, drive-abci) / Build Drive image
  • GitHub Check: Build Docker images (DAPI, dapi, dapi) / Build DAPI image
  • GitHub Check: Build JS packages / Build JS
  • GitHub Check: Rust crates security audit
  • GitHub Check: Build rs-sdk-ffi for iOS targets (aarch64-apple-ios-sim)
  • GitHub Check: Build rs-sdk-ffi for iOS targets (aarch64-apple-ios)

Comment on lines +70 to +81
{
"name": "owner_creator",
"properties": [
{
"$ownerId": "asc"
},
{
"$creatorId": "asc"
}
],
"unique": true
},
Copy link
Contributor

@coderabbitai coderabbitai bot Sep 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Verify the unique constraint semantics for transferable documents.

The owner_creator index enforces uniqueness on the combination of $ownerId and $creatorId. For transferable documents, this constraint would prevent a single owner from holding multiple cards created by the same creator, even after legitimate transfers.

Scenario:

  1. Creator A creates card1 → transfers to Owner B
  2. Creator A creates card2 → transfers to Owner B
  3. Both cards now have (Owner B, Creator A) → unique constraint violation

This constraint typically makes sense only for non-transferable documents where creator = owner initially and transfers aren't allowed. For a transferable card game, you likely want to remove the unique: true constraint from this index to allow owners to collect multiple cards from the same creator.

If the unique constraint is intentional (e.g., limiting one card per creator per owner as a game mechanic), please add a comment in the test explaining this business rule.

🤖 Prompt for AI Agents
In
packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-unique-creator-id-with-owner-id-index.json
around lines 70 to 81, the "owner_creator" index currently sets "unique": true
which will incorrectly prevent an owner from holding multiple transferable cards
from the same creator; remove the "unique": true property from this index to
allow multiple transferable documents with the same ($ownerId, $creatorId) pair,
or if the one-card-per-creator rule is intentional, keep the constraint but add
a clear comment in the test file explaining that this is a deliberate game
mechanic enforcing one card per creator per owner.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No this is just for tests and is correct.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@QuantumExplorer, understood! Thank you for clarifying that the unique constraint on the owner_creator index is intentional for this test scenario. The filename itself (crypto-card-game-all-transferable-unique-creator-id-with-owner-id-index.json) makes it clear this is specifically testing the unique combination of owner and creator IDs, which is exactly what's implemented here.


🧠 Learnings used
Learnt from: QuantumExplorer
PR: dashpay/platform#2257
File: packages/rs-drive-abci/src/mimic/test_quorum.rs:159-164
Timestamp: 2024-11-20T16:16:01.830Z
Learning: QuantumExplorer prefers not to receive auto-generated messages asking to post on social media.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (3)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs (1)

65-74: Derive changed fields from the transition (avoid hardcoding "price").

Prefer using the action’s reported changed data set to keep logic in sync if schema evolves. If the API exposes it, switch to a borrowed set; otherwise keep current.

Example (if available):

-                changed_data_values: Cow::Owned(BTreeSet::from(["price".to_string()])),
+                changed_data_values: Cow::Borrowed(
+                    document_update_price_transition.changed_data_fields()
+                ),
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)

318-325: Use contains for set membership.

Replace changed_data_values.get(&property.name).is_some() with changed_data_values.contains(&property.name) for clarity.

-                                                if changed_data_values.get(&property.name).is_some()
+                                                if changed_data_values.contains(&property.name)
                                                 {
                                                     allow_original = false;
                                                 }
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (1)

30-30: Reconsider #[inline(always)] unless there's a measured performance reason.

The #[inline(always)] attribute forces inlining regardless of the compiler's heuristics. For a function of this size (nearly 100 lines), forced inlining can bloat binary size and potentially degrade performance if this code path isn't hot enough to justify the trade-off. Unless profiling has shown a clear win, consider removing this attribute or using #[inline] to let the compiler decide.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f4bd4a6 and b4a429f.

📒 Files selected for processing (36)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (21 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (1 hunks)
  • packages/rs-drive-abci/tests/strategy_tests/query.rs (1 hunks)
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs (1 hunks)
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (5 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/mod.rs (0 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/mod.rs (0 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs (0 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (2 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (3 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (7 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (3 hunks)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs (1 hunks)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs (0 hunks)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs (1 hunks)
  • packages/rs-platform-version/src/version/drive_versions/mod.rs (1 hunks)
  • packages/rs-platform-version/src/version/drive_versions/v5.rs (1 hunks)
  • packages/rs-platform-version/src/version/v10.rs (4 hunks)
💤 Files with no reviewable changes (4)
  • packages/rs-drive/src/drive/document/index_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs
✅ Files skipped from review due to trivial changes (1)
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs
🧰 Additional context used
📓 Path-based instructions (4)
**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.rs: Format Rust code with cargo fmt
Run Clippy linter for Rust code

Files:

  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs
  • packages/rs-platform-version/src/version/v10.rs
  • packages/rs-platform-version/src/version/drive_versions/v5.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs
packages/rs-*/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

packages/rs-*/**/*.rs: Use rustfmt defaults for Rust code (format via cargo fmt --all)
Keep Rust code clippy-clean (cargo clippy)
Name Rust modules in snake_case
Use PascalCase for Rust types
Use SCREAMING_SNAKE_CASE for Rust constants

Files:

  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs
  • packages/rs-platform-version/src/version/v10.rs
  • packages/rs-platform-version/src/version/drive_versions/v5.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs
packages/**/tests/**

📄 CodeRabbit inference engine (AGENTS.md)

Place unit and integration tests alongside each package in packages//tests

Files:

  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
packages/**/tests/**/*.{js,ts,jsx,tsx,rs}

📄 CodeRabbit inference engine (AGENTS.md)

packages/**/tests/**/*.{js,ts,jsx,tsx,rs}: Name tests descriptively, starting with “should …”
Unit/integration tests must not perform network calls; mock dependencies instead

Files:

  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
🧠 Learnings (4)
📓 Common learnings
Learnt from: QuantumExplorer
PR: dashpay/platform#2257
File: packages/rs-drive-abci/src/mimic/test_quorum.rs:159-164
Timestamp: 2024-11-20T16:16:01.830Z
Learning: QuantumExplorer prefers not to receive auto-generated messages asking to post on social media.
📚 Learning: 2024-10-08T13:28:03.529Z
Learnt from: QuantumExplorer
PR: dashpay/platform#2227
File: packages/rs-drive-abci/src/platform_types/platform_state/mod.rs:141-141
Timestamp: 2024-10-08T13:28:03.529Z
Learning: When converting `PlatformStateV0` to `PlatformStateForSavingV1` in `packages/rs-drive-abci/src/platform_types/platform_state/mod.rs`, only version `0` needs to be handled in the match on `platform_state_for_saving_structure_default` because the changes are retroactive.

Applied to files:

  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs
📚 Learning: 2024-10-09T00:22:57.778Z
Learnt from: shumkov
PR: dashpay/platform#2201
File: packages/rs-platform-version/src/version/v2.rs:1186-1188
Timestamp: 2024-10-09T00:22:57.778Z
Learning: In the `IdentityTransitionVersions` structure within `packages/rs-platform-version/src/version/v2.rs`, the field `credit_withdrawal` does not need the `identity_` prefix since it is already encompassed within identity state transitions.

Applied to files:

  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
📚 Learning: 2024-10-09T00:22:57.778Z
Learnt from: shumkov
PR: dashpay/platform#2206
File: packages/rs-drive-abci/tests/strategy_tests/main.rs:1162-1162
Timestamp: 2024-10-09T00:22:57.778Z
Learning: In the Rust test file `packages/rs-drive-abci/tests/strategy_tests/main.rs`, specific protocol versions like `PROTOCOL_VERSION_1` are intentionally used in tests instead of `PROTOCOL_VERSION_LATEST`.

Applied to files:

  • packages/rs-platform-version/src/version/v10.rs
🧬 Code graph analysis (18)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (4)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (2)
  • document_type (62-224)
  • index (70-166)
packages/rs-dpp/src/data_contract/document_type/index/mod.rs (1)
  • property_names (318-323)
packages/rs-dpp/src/validation/validation_result.rs (2)
  • new_with_error (104-109)
  • merge_many_errors (71-79)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs (1)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (3)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (3)
  • changed_data_fields (83-83)
  • data_owned (85-85)
  • creator_id (88-88)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs (1)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (1)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (1)
  • original_document (878-880)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (8)
packages/rs-dpp/src/tests/json_document.rs (1)
  • json_document_to_contract (66-74)
packages/rs-dpp/src/data_contract/accessors/mod.rs (5)
  • system_version_type (41-46)
  • config (128-133)
  • version (48-53)
  • id (27-32)
  • tokens (219-224)
packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs (3)
  • documents_mutable (126-131)
  • documents_mutable (343-348)
  • documents_mutable (506-511)
packages/rs-drive/src/query/mod.rs (1)
  • from_sql_expr (824-982)
packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs (5)
  • invalid_paid_count (79-81)
  • invalid_unpaid_count (84-86)
  • valid_count (89-91)
  • aggregated_fees (99-101)
  • execution_results (109-111)
packages/rs-dpp/src/fee/fee_result/refunds.rs (1)
  • calculate_refunds_amount_for_identity (155-164)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs (1)
  • new_document_transfer_transition_from_document (179-220)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (1)
  • new_document_transfer_transition_from_document (204-260)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (3)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-dpp/src/data_contract/document_type/index/mod.rs (1)
  • property_names (318-323)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (3)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-dpp/src/document/accessors/mod.rs (4)
  • revision (54-58)
  • updated_at (66-70)
  • updated_at_block_height (84-88)
  • updated_at_core_block_height (102-106)
packages/rs-dpp/src/document/v0/accessors.rs (4)
  • revision (46-48)
  • updated_at (64-66)
  • updated_at_block_height (115-117)
  • updated_at_core_block_height (142-144)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (4)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (3)
  • changed_data_fields (110-114)
  • data_owned (116-120)
  • creator_id (122-126)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (16)
  • GitHub Check: Rust packages (drive) / Detect immutable structure changes
  • GitHub Check: Rust packages (wasm-dpp) / Tests
  • GitHub Check: Rust packages (drive) / Unused dependencies
  • GitHub Check: Rust packages (drive) / Tests
  • GitHub Check: Rust packages (drive) / Linting
  • GitHub Check: Rust packages (dpp) / Check each feature
  • GitHub Check: Rust packages (dpp) / Unused dependencies
  • GitHub Check: Rust packages (dpp) / Formatting
  • GitHub Check: Rust packages (dpp) / Tests
  • GitHub Check: Rust packages (dpp) / Linting
  • GitHub Check: Swift SDK and Example build (warnings as errors)
  • GitHub Check: Build Docker images (Dashmate helper, dashmate-helper, dashmate-helper) / Build Dashmate helper image
  • GitHub Check: Build Docker images (DAPI, dapi, dapi) / Build DAPI image
  • GitHub Check: Build Docker images (Drive, drive, drive-abci) / Build Drive image
  • GitHub Check: Build JS packages / Build JS
  • GitHub Check: Rust crates security audit
🔇 Additional comments (53)
packages/rs-drive-abci/tests/strategy_tests/query.rs (1)

836-836: LGTM! Good cleanup of unused variable.

Prefixing root_hash with an underscore correctly signals that the value is intentionally unused. The test only needs finalized_epoch_infos (used in lines 847-852), so this silences the unused variable warning without changing behavior.

packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs (1)

1-72: LGTM! Clear versioning constant with good documentation.

The new DRIVE_DOCUMENT_METHOD_VERSIONS_V2 constant is well-structured. The doc comment clearly explains the protocol v10 context and the "Changed" annotations on lines 66-70 make it easy to identify the delta from v1 (index_uniqueness methods bumped to version 1).

packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs (2)

4-4: LGTM! Module addition is correct.

The new v2 module addition follows the existing pattern (v1 already exists on line 3).


83-89: No remaining references to removed fields. Searches for .validate_document_uniqueness\b and .validate_uniqueness_of_data\b yielded no field‐access occurrences in the codebase—only module/function names were matched previously. Removal is safe.

packages/rs-platform-version/src/version/drive_versions/mod.rs (1)

30-30: LGTM! Module addition follows the established pattern.

The new v5 module addition is consistent with the existing versioning scheme (v1-v4 already present on lines 26-29).

packages/rs-platform-version/src/version/v10.rs (2)

3-3: LGTM! Import updates are consistent with the version bumps.

The imports for CONTRACT_VERSIONS_V3, DOCUMENT_VERSIONS_V3, and DRIVE_VERSION_V5 correctly reflect the versioning changes made in this PR.

Also applies to: 5-5, 23-23


35-35: Approve version updates. Verified that DRIVE_VERSION_V5, CONTRACT_VERSIONS_V3, and DOCUMENT_VERSIONS_V3 are defined and documented, aligning with the creator_id feature enhancements.

packages/rs-platform-version/src/version/drive_versions/v5.rs (1)

1-108: LGTM! Comprehensive drive version constant with clear documentation.

The new DRIVE_VERSION_V5 constant properly defines all drive method versions for protocol v10. The doc comment (lines 22-23) provides clear context, and the "Changed" annotation on line 52 highlights the key update (DRIVE_DOCUMENT_METHOD_VERSIONS_V2). The structure is consistent with the existing versioning pattern and integrates with GROVE_V2.

packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (2)

3-3: LGTM!

The addition of BTreeSet to the imports is necessary for the new changed_data_fields accessor.


110-126: LGTM!

The two new accessor methods (changed_data_fields and creator_id) are correctly implemented and follow the established pattern of delegating to the V0 variant. These additions align with the broader creator_id support being added throughout the codebase.

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (1)

718-726: LGTM!

The refactoring to pass the entire original_document instead of individual timestamp parameters simplifies the signature and allows the callee to extract all necessary fields (including creator_id) from the document. This approach is cleaner and aligns with the broader creator_id propagation throughout the PR.

packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (1)

4-4: LGTM!

The signature change to accept original_document: &Document is consistent with the calling site and allows for cleaner extraction of document metadata including the new creator_id field. The necessary imports are correctly added.

Also applies to: 20-20, 36-36

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (9)

181-422: Good test coverage for backward compatibility.

This test verifies that document transfers work correctly with contract v0 (which does not support creator_id serialization). The test is well-structured and includes proper validation of state before and after the transfer.

Note: The fee assertions use exact values (e.g., processing_fee == 3369260), which may require updates if fee calculation logic changes in the future.


515-574: LGTM! Excellent coverage of creator_id persistence.

The test properly validates that:

  1. Documents can be queried by $creatorId
  2. The creator_id remains unchanged after transfer (still points to the original creator)
  3. Both owner and creator queries return the expected results after transfer

This is critical for ensuring creator attribution is immutable.

Also applies to: 642-657


678-920: LGTM! Important test for contract v0 behavior.

The test and inline comments clearly document that contract v0 (and config v0) should not include creator_id because document serialization v0 cannot handle it. This ensures proper version handling and backward compatibility.


1091-1112: LGTM! Proper validation of transfer restrictions.

The test correctly verifies that documents with Transferable::Never cannot be transferred, and that the state remains unchanged after the failed transfer attempt.


1116-1263: LGTM! Good edge case coverage.

The test validates that attempting to transfer a non-existent document fails appropriately, with processing fees charged but no state changes made. This is an important edge case.


1462-1510: Verify test expectations for document deletion after transfer.

The test shows that after transferring a document to the receiver, when the receiver attempts to delete it, the deletion fails (invalid_paid_count = 1, valid_count = 0).

This seems unexpected behavior for a transferable document type - typically the new owner should be able to delete their document. Please verify:

  1. Is this the intended behavior (deletion not allowed after transfer)?
  2. Or is there an issue with how the deletion transition is being constructed?

If the document type has specific deletion restrictions beyond transferability, consider adding a comment explaining the expected behavior.


1530-1774: LGTM! Excellent coverage of token payment transfers.

This test thoroughly validates the token payment functionality for document transfers, including:

  • Token contract setup
  • Document creation with token payment
  • Document transfer with token payment
  • Token balance tracking and verification

The test is well-structured and comprehensive.


1777-2284: Excellent test with outstanding documentation!

This test thoroughly validates the unique creator_id index constraint throughout the complete document lifecycle. The extensive inline comments explain:

  • The purpose and use cases for unique creator_id constraints
  • Each step in the test sequence
  • Why each operation should succeed or fail

This level of documentation makes the test easy to understand and maintain.


2287-2850: Outstanding test for compound unique index!

This test validates the complex behavior of a compound unique index on (owner_id, creator_id) with excellent inline documentation. The test demonstrates:

  • Multiple documents from same creator with different owners
  • Transfer constraints when compound uniqueness would be violated
  • Proper freeing of constraints upon deletion

The comprehensive comments explain the business logic and make this complex scenario clear.

packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (5)

9-9: LGTM!

The addition of BTreeSet to imports is necessary for the new changed_data_fields field.


41-44: LGTM!

The two new fields are properly documented and typed:

  • changed_data_fields: BTreeSet<String> for tracking modified fields
  • creator_id: Option<Identifier> for immutable creator attribution

These additions align with the broader creator_id support in the PR.


82-88: LGTM!

The new trait accessor methods are correctly defined with appropriate documentation and follow the established pattern of other accessors in the trait.


148-149: LGTM!

The creator_id is correctly extracted in the destructuring pattern and properly propagated (with dereferencing) into the DocumentV0 construction. The use of .. to ignore changed_data_fields is appropriate since it's not needed for document construction.

Also applies to: 173-173


202-203: LGTM!

The owned path correctly extracts and propagates creator_id without dereferencing (since values are moved). The implementation is consistent with the borrowed path and follows the established pattern.

Also applies to: 227-227

packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (5)

2-2: LGTM: Imports correctly extended for new functionality.

The added imports (Document, DocumentV0Getters, BTreeSet) are all necessary to support passing the original document and calculating changed fields.

Also applies to: 4-4


92-110: LGTM: Field extraction from original document is correct.

The code properly extracts all necessary fields from original_document using the accessor methods, including the new creator_id field which is central to this PR's feature.


112-137: LGTM: Changed fields calculation is comprehensive and correct.

The logic correctly identifies modified, added, and removed fields by:

  1. Comparing each new data field with the original using equal_underlying_data
  2. Detecting fields present in the original but absent in the new data

Using BTreeSet ensures deterministic ordering, which is important for consensus.


139-162: LGTM: Extracted values correctly used in action construction.

All extracted values from the original document (including the new creator_id and changed_data_fields) are properly assigned to the DocumentReplaceTransitionActionV0 instance. This correctly implements the PR's objective of preserving creator ID during document replace transitions.


22-25: All call sites updated. Verified that the sole invocation in packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs passes original_document correctly.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs (1)

56-75: Version 1 dispatch wiring looks solid.

Adding the v1 arm with matching parameters and updating the known_versions list keeps the replace-transition uniqueness validator aligned with the new platform_version metadata. Nice and consistent with the other uniqueness modules.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs (1)

56-75: Consistent v1 hookup.

The new v1 branch forwards the same arguments and keeps the UnknownVersionMismatch list current, matching the broader creator_id rollout.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs (1)

56-75: Create-path v1 dispatch matches the pattern.

Routing to the v1 implementation with the existing argument set and adjusting the known_versions vector keeps the create transition validator aligned with the new versioning strategy.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs (1)

73-73: Known versions updated correctly.

The known_versions array now includes [0, 1], matching the newly added v1 dispatch arm.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs (1)

2-2: V1 dispatch and versioning implemented correctly.

The v1 module is added, dispatch logic extended to handle version 1, and known_versions updated to [0, 1]. The v1 signature maintains parameter parity with v0, which differs from the transfer transition's approach (where v1 extracts owner_id internally).

Also applies to: 64-71, 74-74

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs (1)

5-5: Type migration to versioned request structure implemented correctly.

The change from UniquenessOfDataRequest to UniquenessOfDataRequestV0 and the addition of .into() at line 62 correctly adapt this path to the new versioned dispatch mechanism. The validate_uniqueness_of_data function now accepts a UniquenessOfDataRequest enum that wraps V0/V1 variants, so the .into() conversion is necessary.

Also applies to: 33-62

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs (1)

5-5: Type migration to versioned request structure implemented correctly.

Same versioning migration as the purchase v0 path: UniquenessOfDataRequestV0 with .into() conversion aligns with the new enum-based dispatch in validate_uniqueness_of_data.

Also applies to: 33-62

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs (2)

36-36: Creator ID support added correctly.

The inclusion of creator_id via document_transfer_transition.document().creator_id() implements the core feature of this PR. The v1 uniqueness validation can now check indexes that include the CREATOR_ID property.


60-60: No update required: ChangedDocument is appropriate for transfer transitions. It correctly flags only owner and transferred_at as changed while preserving uniqueness checks for other properties.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs (1)

35-66: LGTM; consistent flags and borrowed changed fields.

Request assembly matches replace semantics; using Cow::Borrowed(document_replace_transition.changed_data_fields()) avoids allocation.

packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)

351-412: Behavioral note: collects all index errors (intentional).

Aggregating per-index results via merge_many_errors is helpful for users. No change requested.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (5)

1-26: LGTM!

The imports are comprehensive and appropriate for the v1 uniqueness validation logic.


40-56: LGTM!

The logic correctly determines which system property fields are required based on the document type schema.


60-68: LGTM! Key new feature for creator_id support.

The logic correctly determines whether to populate creator_id by consulting the document type's should_use_creator_id method with the contract's system version, config version, and platform version. Setting creator_id to owner_id at creation time is semantically correct, as the creator is the initial owner.


70-123: LGTM!

The UniquenessOfDataRequestV1 construction correctly populates all fields conditionally based on the document type's required fields, uses appropriate block info values, and sets the update type to NewDocument as expected for a create transition.


124-124: LGTM!

The call to validate_uniqueness_of_data correctly converts the V1 request using .into() and passes the transaction and platform version.

packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (6)

1-19: LGTM!

The addition of the v1 module and new imports (Cow, From, BTreeSet) correctly supports the new versioned uniqueness validation infrastructure.


21-25: LGTM!

The UniquenessOfDataRequest enum correctly introduces versioned dispatch with V0 and V1 variants, and the From derive enables ergonomic conversion.


36-68: LGTM!

The UniquenessOfDataRequestV0 struct correctly preserves the previous single-version structure while being renamed to V0 for the new versioned dispatch.


77-131: LGTM! Key addition: creator_id support.

The UniquenessOfDataRequestV1 struct correctly extends the validation capabilities with:

  • The new creator_id field (lines 90-92) to support creator tracking across the platform.
  • The update_type field (line 130) for more granular uniqueness validation based on which fields changed.

The comprehensive doc comments clearly explain each field's purpose.


133-165: LGTM! Well-designed update type enum.

The UniquenessOfDataRequestUpdateType enum correctly distinguishes between new and changed documents for uniqueness validation. The ChangedDocument variant's design—tracking which fields changed—enables the validation logic to determine whether a unique index coupling should already exist in state, improving the accuracy of uniqueness checks.


184-197: LGTM!

The dispatch logic correctly routes UniquenessOfDataRequest::V0 and V1 variants to their respective implementation methods, cleanly separating the versioned validation paths.

Comment on lines +60 to +69
update_type: UniquenessOfDataRequestUpdateType::ChangedDocument {
changed_owner_id: true,
changed_updated_at: false,
changed_transferred_at: true,
changed_updated_at_block_height: false,
changed_transferred_at_block_height: true,
changed_updated_at_core_block_height: false,
changed_transferred_at_core_block_height: true,
changed_data_values: Default::default(),
},
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

Verify changed flags match transfer semantics.

The changed_* flags accurately reflect transfer operation semantics:

  • changed_owner_id: true – ownership changes ✓
  • changed_transferred_at: true – transfer timestamp updates ✓
  • changed_transferred_at_block_height: true – transfer block height updates ✓
  • changed_transferred_at_core_block_height: true – transfer core block height updates ✓
  • changed_updated_at: false – transfer doesn't update the "updated" timestamp ✓
  • changed_data_values: Default::default() – no data properties change ✓

Confirm that transfer operations indeed leave updated_at unchanged and don't modify any data properties. If transfers can optionally update data fields, changed_data_values would need to be computed rather than defaulted.


🏁 Script executed:

#!/bin/bash
# Search for transfer semantics and what fields are modified during transfer
echo "=== DocumentTransferTransitionAction structure and field updates ==="
ast-grep --pattern 'struct DocumentTransferTransitionAction {
  $$$
}'

echo -e "\n=== Transfer action processing - looking for field updates ==="
rg -C 5 'document_transfer_transition|DocumentTransferTransitionAction' packages/rs-drive*/src/ -g '*.rs' | rg -C 3 'updated_at|transferred_at|owner_id'

echo -e "\n=== Check if transfer can modify document data ==="
rg -C 3 'transfer.*data|data.*transfer' packages/rs-drive*/src/ -g '*.rs' | rg -i 'property|properties|data'

Length of output: 47118


🏁 Script executed:

#!/bin/bash
# Inspect setter calls in transformer V0 for DocumentTransferTransitionAction
rg -n "modified_document\.set_" -C3 packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/transformer.rs

Length of output: 913


Compute changed_data_values to include the removed PRICE property
In v1/mod.rs, the transfer transformer invokes properties_mut().remove(PRICE), so changed_data_values must be computed to capture this removal instead of using Default::default().

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the price goes to None, and because a None in a unique index makes the index not unique, well we don't need set price as changed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@QuantumExplorer, thank you for the clarification! That makes perfect sense—if None values don't participate in unique index checks, then removing the PRICE property (setting it to None) won't affect uniqueness validation. The changed_data_values: Default::default() is therefore correct as-is, since the removal doesn't need to be tracked for uniqueness purposes.

This aligns well with the other changed_* flags that only track fields that actually participate in uniqueness constraints during a transfer operation.


🧠 Learnings used
Learnt from: QuantumExplorer
PR: dashpay/platform#2257
File: packages/rs-drive-abci/src/mimic/test_quorum.rs:159-164
Timestamp: 2024-11-20T16:16:01.830Z
Learning: QuantumExplorer prefers not to receive auto-generated messages asking to post on social media.

@QuantumExplorer QuantumExplorer changed the title feat: creator id feat: creator id and improved verification of document uniqueness before insertion Oct 1, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (1)

17-24: Update all call sites for the new parameters and add ownership checks

  • In packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs, update the call to
    DocumentReplaceTransitionAction::try_from_borrowed_document_replace_transition(
    to pass original_document, block_info, user_fee_increase, and get_data_contract.
  • In packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs, do the same for
    DocumentReplaceTransitionActionV0::try_from_borrowed_document_replace_transition(.
  • Inside each implementation, add
    debug_assert_eq!(transition.document_id(), original_document.id());
    and
    debug_assert_eq!(owner_id, original_document.owner_id());
    Optional: wrap parameters into a small context struct to eliminate the clippy allow and consider adding a tracing span with the document ID.
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)

170-179: Doc param mismatch: DriveVersion vs PlatformVersion.

Update the docstring to reflect the actual parameter name/type.

- /// * `drive_version` - A `DriveVersion` object representing the version of the Drive.
+ /// * `platform_version` - A `PlatformVersion` object representing the platform version.
🧹 Nitpick comments (31)
packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-unique-creator-id-with-owner-id-index.json (2)

135-142: Requiring transfer system fields may block creates.

$transferredAt, $transferredAtBlockHeight, $transferredAtCoreBlockHeight are typically set on transfer. If documents can be created before any transfer, this requirement will fail validation. If creation always coincides with transfer in this test, ignore; otherwise consider dropping them from required.

       "required": [
         "name",
-        "$transferredAt",
-        "$transferredAtBlockHeight",
-        "$transferredAtCoreBlockHeight",
         "attack",
         "defense"
       ],

26-33: Optional: tighten imageUrl validation.

If helpful for tests, restrict to allowed schemes: http/https (or ipfs).

       "imageUrl": {
         "type": "string",
         "description": "URL of the image associated with the card",
         "maxLength": 2048,
-        "format": "uri",
+        "format": "uri",
+        "pattern": "^(https?|ipfs)://"
         "position": 2
       },
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (10)

8-178: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_transfer_document_on_transferable_type_with_no_owner_indices()

This improves readability and aligns with the project's testing conventions.

As per coding guidelines.


180-422: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_transfer_document_on_transferable_type_before_creator_id()

As per coding guidelines.


424-675: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_transfer_document_on_transferable_type()

As per coding guidelines.


677-920: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_transfer_document_on_transferable_type_with_contract_v0()

As per coding guidelines.


922-1113: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_reject_transfer_on_non_transferable_document_type()

As per coding guidelines.


1115-1263: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_reject_transfer_of_non_existent_document()

As per coding guidelines.


1265-1528: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_reject_delete_after_transfer()

Additionally, line 1422 uses BlockInfo::default_with_time(50000000). Consider adding a comment explaining why a specific time is used, if it's significant to the test logic.

As per coding guidelines.


1529-1774: Consider renaming test to follow "should" pattern.

Coding guidelines recommend naming tests descriptively, starting with "should …". For example:

fn should_transfer_document_with_token_payment()

As per coding guidelines.


1776-2284: Excellent documentation and test coverage.

The extensive comments (lines 1777-1809) clearly explain the test's purpose and scenario, making it easy to understand the complex interaction between creator_id, ownership, and unique constraints. This is a model example of well-documented test code.

However, consider renaming the test to follow the "should" pattern per coding guidelines:

fn should_enforce_unique_creator_id_index_during_transfer_and_deletion()

As per coding guidelines.


2286-2850: Excellent documentation and comprehensive test coverage.

The extensive comments (lines 2287-2327) clearly explain the test's purpose and the complex scenario involving compound unique indexes on (owner_id, creator_id). This is exemplary documentation that makes the test's intent and logic immediately clear.

However, consider renaming the test to follow the "should" pattern per coding guidelines:

fn should_enforce_unique_owner_creator_compound_index_during_transfer()

As per coding guidelines.

packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs (1)

1-1: Import path consistency for FeatureVersion.

This file uses use versioned_feature_core::FeatureVersion; while others use crate::version::FeatureVersion. Consider unifying on the crate re-export for consistency and easier future changes.

-use versioned_feature_core::FeatureVersion;
+use crate::version::FeatureVersion;
packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs (1)

12-64: Explicit zeros across nested structs — acceptable, but consider a helper in non-const code.

Given const context, explicit literals are fine. If you introduce a non-const builder later, a small constructor could reduce duplication. No change required now.

packages/rs-platform-version/src/version/drive_versions/v5.rs (1)

52-52: Inline “// Changed” comment.

Optional: move change rationale to module-level doc or commit message; the code already denotes the version.

packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-unique-creator-id-index.json (1)

132-139: Requiring $transferredAt* on all docs—validate against create flow.

With these required, every create must include $transferredAt, $transferredAtBlockHeight, and $transferredAtCoreBlockHeight. For “direct purchase” this may be intended; otherwise, creation could fail before transfer. If not strictly needed at create time, make them optional and enforce presence on transfer.

Option if needed:

-      "required": [
-        "name",
-        "$transferredAt",
-        "$transferredAtBlockHeight",
-        "$transferredAtCoreBlockHeight",
-        "attack",
-        "defense"
-      ],
+      "required": [
+        "name",
+        "attack",
+        "defense"
+      ],

Add/verify tests for both create and transfer transitions that assert required system fields at the right phase.

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs (3)

3380-3391: Standardize first buyer nonce to 1 (and keep monotonic).

Earlier tests typically start a new buyer at nonce 1. These use 2 (and deletion 3). Aligning reduces nonce‑related flakiness.

Apply these diffs:

@@
-                &buyer_key,
-                2,
+                &buyer_key,
+                1,
@@
-                &buyer_key,
-                3,
+                &buyer_key,
+                2,
@@
-                &buyer1_key,
-                2,
+                &buyer1_key,
+                1,
@@
-                &buyer2_key,
-                2,
+                &buyer2_key,
+                1,
@@
-                &buyer2_key,
-                3,
+                &buyer2_key,
+                2,

Also applies to: 3514-3521, 3940-3953, 4150-4163, 4201-4212


3423-3446: Assert creator_id immutability after purchase.

Add a direct check that the buyer‑held document still has creator_id == creator.id().

Example:

let doc = query_buyer_results.documents().first().unwrap();
assert_eq!(doc.owner_id(), buyer.id());
assert_eq!(doc.creator_id(), Some(creator.id()));

Also applies to: 4244-4278


3288-3311: Optional: DRY the “process + commit” pattern into a small helper.

Reduces repeated boilerplate and makes failures easier to instrument.

Sketch:

fn process_and_commit(
    platform: &mut TempPlatform<MockCoreRPCLike>,
    st_bytes: Vec<Vec<u8>>,
    platform_state: &PlatformState,
    block: BlockInfo,
    platform_version: &PlatformVersion,
) -> ProcessingResult {
    let tx = platform.drive.grove.start_transaction();
    let res = platform.platform.process_raw_state_transitions(
        &st_bytes, platform_state, &block, &tx, platform_version, false, None,
    ).expect("process");
    platform.drive.grove.commit_transaction(tx).unwrap().expect("commit");
    res
}

Also applies to: 3398-3422, 3484-3509, 3532-3556, 3851-3872, 4071-4094, 4171-4195, 4219-4243

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs (1)

64-70: v1 dispatch correctly drops owner_id param.
Matches v1 signature (owner_id sourced from the document). Please update the method doc to note: "owner_id is used only in v0; v1 derives it from the transition’s document," and rename “drive_version” to “platform_version” in the docs above.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs (1)

64-71: v1 dispatch parameters are consistent with v0.
All args (including owner_id) forwarded; LGTM. Consider updating the doc above to say “platform_version” instead of “drive_version.”

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs (1)

32-70: Refactor: cache doc/base to reduce repeated calls.
Small readability/micro‑perf win; fewer method calls, easier to scan.

-        let request = UniquenessOfDataRequestV1 {
+        let doc = document_transfer_transition.document();
+        let base = document_transfer_transition.base();
+        let request = UniquenessOfDataRequestV1 {
             contract,
             document_type,
-            owner_id: document_transfer_transition.document().owner_id(),
-            creator_id: document_transfer_transition.document().creator_id(),
-            document_id: document_transfer_transition.base().id(),
-            created_at: document_transfer_transition.document().created_at(),
-            updated_at: document_transfer_transition.document().updated_at(),
-            transferred_at: document_transfer_transition.document().transferred_at(),
-            created_at_block_height: document_transfer_transition
-                .document()
-                .created_at_block_height(),
-            updated_at_block_height: document_transfer_transition
-                .document()
-                .updated_at_block_height(),
-            transferred_at_block_height: document_transfer_transition
-                .document()
-                .transferred_at_block_height(),
-            created_at_core_block_height: document_transfer_transition
-                .document()
-                .created_at_core_block_height(),
-            updated_at_core_block_height: document_transfer_transition
-                .document()
-                .updated_at_core_block_height(),
-            transferred_at_core_block_height: document_transfer_transition
-                .document()
-                .transferred_at_core_block_height(),
-            data: document_transfer_transition.document().properties(),
+            owner_id: doc.owner_id(),
+            creator_id: doc.creator_id(),
+            document_id: base.id(),
+            created_at: doc.created_at(),
+            updated_at: doc.updated_at(),
+            transferred_at: doc.transferred_at(),
+            created_at_block_height: doc.created_at_block_height(),
+            updated_at_block_height: doc.updated_at_block_height(),
+            transferred_at_block_height: doc.transferred_at_block_height(),
+            created_at_core_block_height: doc.created_at_core_block_height(),
+            updated_at_core_block_height: doc.updated_at_core_block_height(),
+            transferred_at_core_block_height: doc.transferred_at_core_block_height(),
+            data: doc.properties(),
             update_type: UniquenessOfDataRequestUpdateType::ChangedDocument {
                 changed_owner_id: true,
                 changed_updated_at: false,
                 changed_transferred_at: true,
                 changed_updated_at_block_height: false,
                 changed_transferred_at_block_height: true,
                 changed_updated_at_core_block_height: false,
                 changed_transferred_at_core_block_height: true,
                 changed_data_values: Default::default(),
             },
         };
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs (2)

39-41: Creator ID source differs across modules

Here you use document_replace_transition.creator_id(), while v1 purchase/update_price use ...document().creator_id(). Validate both return the same logical value for documents with creator_id indexes; otherwise uniqueness checks referencing creator_id may be skipped.

Optionally standardize on one accessor style across v1 validators for consistency.

Also applies to: 41-49


55-62: Derive changed_* flags from the transition

Flags are hard-coded (e.g., changed_updated_at: true). If updated_at (or corresponding block/core heights) is absent/unchanged, this can unnecessarily flip allow_original and also cause early-exit on indexes including that field. Prefer computing these from the transition’s actual diff.

Would you like me to draft a helper that derives these flags from the transition?

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs (1)

65-74: Compute flags dynamically from the transition action
Static flags (price, updated_at, updated_at_block_height, updated_at_core_block_height, no transfers) match the current DocumentUpdatePriceTransitionActionV0 logic, but derive all changed_* flags and changed_data_values programmatically from its diff rather than hardcoding, to prevent drift if mutation semantics evolve.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs (1)

65-74: Changed_data_values including "price" is correct
The purchase transformer explicitly removes the price property from the document, so listing "price" in changed_data_values is required for accurate uniqueness checks.
Consider deriving the UniquenessOfDataRequestUpdateType flags dynamically—by diffing old vs. new document fields—instead of hard-coding them.

packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (1)

40-57: Trim duplication for required_ probes (optional).*

Nine contains(...) checks could be grouped (e.g., small helper/closure or array map) to cut repetition and reduce drift if system fields change.

packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (4)

319-325: Use contains() for clarity.

Use changed_data_values.contains(&property.name) instead of get(...).is_some().

- if changed_data_values.get(&property.name).is_some() {
+ if changed_data_values.contains(&property.name) {

173-180: Avoid duplicate String clones (micro).

property.name is cloned twice (map key and WhereClause.field). Capture once and reuse.

- Some((
-     property.name.clone(),
-     WhereClause {
-         field: property.name.clone(),
+ let name = property.name.clone();
+ Some((
+     name.clone(),
+     WhereClause {
+         field: name,
          operator: WhereOperator::Equal,
          value,
      },
 ))

Also applies to: 334-340


73-184: Consider a small helper to build WhereClause per property.

Both NewDocument and ChangedDocument branches repeat large match arms. A local helper (closure) returning Option<(String, WhereClause)> would reduce duplication and future drift.

Also applies to: 185-348


373-380: Operational note: add lightweight observability.

The TODO about cost is valid. Consider debug-level timing/metrics around query_documents to spot hot contracts/indexes.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f4bd4a6 and 2e3f521.

📒 Files selected for processing (39)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs (1 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (21 hunks)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (1 hunks)
  • packages/rs-drive-abci/tests/strategy_tests/query.rs (1 hunks)
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs (1 hunks)
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs (1 hunks)
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-unique-creator-id-index.json (1 hunks)
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-unique-creator-id-with-owner-id-index.json (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (5 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/mod.rs (0 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/mod.rs (0 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs (0 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs (2 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs (3 hunks)
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs (1 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (2 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (3 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (7 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (3 hunks)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs (1 hunks)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs (0 hunks)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs (1 hunks)
  • packages/rs-platform-version/src/version/drive_versions/mod.rs (1 hunks)
  • packages/rs-platform-version/src/version/drive_versions/v5.rs (1 hunks)
  • packages/rs-platform-version/src/version/v10.rs (4 hunks)
💤 Files with no reviewable changes (4)
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v1.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/mod.rs
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs
  • packages/rs-platform-version/src/version/v10.rs
🧰 Additional context used
📓 Path-based instructions (4)
**/*.rs

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.rs: Format Rust code with cargo fmt
Run Clippy linter for Rust code

Files:

  • packages/rs-platform-version/src/version/drive_versions/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/v5.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs
packages/rs-*/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

packages/rs-*/**/*.rs: Use rustfmt defaults for Rust code (format via cargo fmt --all)
Keep Rust code clippy-clean (cargo clippy)
Name Rust modules in snake_case
Use PascalCase for Rust types
Use SCREAMING_SNAKE_CASE for Rust constants

Files:

  • packages/rs-platform-version/src/version/drive_versions/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-platform-version/src/version/drive_versions/drive_document_method_versions/v2.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs
  • packages/rs-platform-version/src/version/drive_versions/v5.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs
packages/**/tests/**

📄 CodeRabbit inference engine (AGENTS.md)

Place unit and integration tests alongside each package in packages//tests

Files:

  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-unique-creator-id-with-owner-id-index.json
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs
  • packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-unique-creator-id-index.json
packages/**/tests/**/*.{js,ts,jsx,tsx,rs}

📄 CodeRabbit inference engine (AGENTS.md)

packages/**/tests/**/*.{js,ts,jsx,tsx,rs}: Name tests descriptively, starting with “should …”
Unit/integration tests must not perform network calls; mock dependencies instead

Files:

  • packages/rs-drive-abci/tests/strategy_tests/query.rs
  • packages/rs-drive-abci/tests/strategy_tests/strategy.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs
  • packages/rs-drive-abci/tests/strategy_tests/token_tests.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs
🧠 Learnings (2)
📓 Common learnings
Learnt from: QuantumExplorer
PR: dashpay/platform#2257
File: packages/rs-drive-abci/src/mimic/test_quorum.rs:159-164
Timestamp: 2024-11-20T16:16:01.830Z
Learning: QuantumExplorer prefers not to receive auto-generated messages asking to post on social media.
📚 Learning: 2024-10-08T13:28:03.529Z
Learnt from: QuantumExplorer
PR: dashpay/platform#2227
File: packages/rs-drive-abci/src/platform_types/platform_state/mod.rs:141-141
Timestamp: 2024-10-08T13:28:03.529Z
Learning: When converting `PlatformStateV0` to `PlatformStateForSavingV1` in `packages/rs-drive-abci/src/platform_types/platform_state/mod.rs`, only version `0` needs to be handled in the match on `platform_state_for_saving_structure_default` because the changes are retroactive.

Applied to files:

  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs
  • packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs
🧬 Code graph analysis (20)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v1/mod.rs (3)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (4)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (2)
  • document_type (62-224)
  • index (70-166)
packages/rs-dpp/src/data_contract/document_type/index/mod.rs (1)
  • property_names (318-323)
packages/rs-dpp/src/validation/validation_result.rs (2)
  • new_with_error (104-109)
  • merge_many_errors (71-79)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (1)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (3)
  • changed_data_fields (83-83)
  • data_owned (85-85)
  • creator_id (88-88)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs (1)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/transfer.rs (12)
packages/rs-dpp/src/tests/json_document.rs (1)
  • json_document_to_contract (66-74)
packages/rs-dpp/src/data_contract/accessors/mod.rs (5)
  • system_version_type (41-46)
  • config (128-133)
  • version (48-53)
  • id (27-32)
  • tokens (219-224)
packages/rs-dpp/src/data_contract/v0/accessors/mod.rs (4)
  • system_version_type (24-26)
  • config (98-100)
  • version (28-30)
  • id (16-18)
packages/rs-dpp/src/data_contract/v1/accessors/mod.rs (5)
  • system_version_type (33-35)
  • config (107-109)
  • version (37-39)
  • id (25-27)
  • tokens (161-163)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs (1)
  • setup_identity (135-191)
packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs (3)
  • documents_mutable (126-131)
  • documents_mutable (343-348)
  • documents_mutable (506-511)
packages/rs-drive/src/query/mod.rs (1)
  • from_sql_expr (824-982)
packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs (5)
  • invalid_paid_count (79-81)
  • invalid_unpaid_count (84-86)
  • valid_count (89-91)
  • aggregated_fees (99-101)
  • execution_results (109-111)
packages/rs-dpp/src/fee/fee_result/refunds.rs (1)
  • calculate_refunds_amount_for_identity (155-164)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs (3)
  • new_document_creation_transition_from_document (102-143)
  • new_document_transfer_transition_from_document (230-271)
  • new_document_deletion_transition_from_document (188-227)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs (3)
  • new_document_creation_transition_from_document (93-134)
  • new_document_transfer_transition_from_document (179-220)
  • new_document_deletion_transition_from_document (223-262)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (3)
  • new_document_creation_transition_from_document (91-145)
  • new_document_transfer_transition_from_document (204-260)
  • new_document_deletion_transition_from_document (263-315)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs (1)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v1/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs (1)
packages/rs-dpp/src/document/accessors/mod.rs (4)
  • revision (54-58)
  • updated_at (66-70)
  • updated_at_block_height (84-88)
  • updated_at_core_block_height (102-106)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v1/mod.rs (3)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-dpp/src/data_contract/document_type/index/mod.rs (1)
  • property_names (318-323)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/nft.rs (7)
packages/rs-dpp/src/tests/json_document.rs (1)
  • json_document_to_contract (66-74)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs (1)
  • setup_identity (135-191)
packages/rs-dpp/src/data_contract/document_type/v1/accessors.rs (1)
  • documents_mutable (85-87)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs (1)
  • new_document_purchase_transition_from_document (318-359)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs (1)
  • new_document_purchase_transition_from_document (309-350)
packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (1)
  • new_document_purchase_transition_from_document (377-435)
packages/rs-drive/src/query/mod.rs (1)
  • from_sql_expr (824-982)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs (1)
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs (1)
  • original_document (878-880)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs (1)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs (1)
  • drive (184-198)
packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs (2)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs (1)
  • document_type (62-224)
packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v1/mod.rs (1)
  • document_type (65-407)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs (4)
packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs (3)
  • changed_data_fields (110-114)
  • data_owned (116-120)
  • creator_id (122-126)
packages/rs-dpp/src/document/accessors/mod.rs (1)
  • creator_id (114-118)
packages/rs-dpp/src/document/accessors/v0/mod.rs (1)
  • creator_id (50-50)
packages/rs-dpp/src/document/v0/accessors.rs (1)
  • creator_id (160-162)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
  • GitHub Check: Rust packages (wasm-dpp) / Tests
  • GitHub Check: Rust packages (dpp) / Unused dependencies
  • GitHub Check: Rust packages (dpp) / Tests
  • GitHub Check: Rust packages (dpp) / Check each feature
  • GitHub Check: Rust packages (wasm-sdk) / Linting
  • GitHub Check: Rust packages (drive-abci) / Tests
  • GitHub Check: Rust packages (wasm-sdk) / Unused dependencies
  • GitHub Check: Rust packages (wasm-sdk) / Tests
  • GitHub Check: Rust packages (drive-abci) / Check each feature
  • GitHub Check: Rust packages (drive) / Tests
  • GitHub Check: Rust packages (rs-sdk-ffi) / Linting
  • GitHub Check: Rust packages (rs-sdk-ffi) / Tests
  • GitHub Check: Build JS packages / Build JS
  • GitHub Check: Swift SDK and Example build (warnings as errors)

Copy link
Collaborator

@shumkov shumkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@QuantumExplorer QuantumExplorer changed the title feat: creator id and improved verification of document uniqueness before insertion feat(platform): creator id and improved verification of document uniqueness before insertion Oct 2, 2025
@QuantumExplorer QuantumExplorer changed the title feat(platform): creator id and improved verification of document uniqueness before insertion feat(platform)!: creator id and improved verification of document uniqueness before insertion Oct 2, 2025
@QuantumExplorer QuantumExplorer merged commit 9e06a21 into v2.1-dev Oct 2, 2025
96 of 100 checks passed
@QuantumExplorer QuantumExplorer deleted the feat/CreatorID branch October 2, 2025 13:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants