Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add token transitions to SDK and DAPI #2434

Open
wants to merge 9 commits into
base: v2.0-tokens-dev
Choose a base branch
from

Conversation

shumkov
Copy link
Member

@shumkov shumkov commented Jan 22, 2025

Issue being fixed or feature implemented

What was done?

How Has This Been Tested?

Breaking Changes

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

Based on the comprehensive summary, here are the concise release notes:

  • New Features

    • Added comprehensive support for fungible token operations in SDK
    • Introduced token transition types for Burn, Mint, Transfer, Freeze, Unfreeze, Destroy, and Emergency actions
    • Enhanced WebAssembly (Wasm) bindings for token-related transitions
  • Improvements

    • Refined type handling for encrypted notes in token transitions
    • Improved token configuration and contract position management
    • Added more robust error handling for token-related operations
  • Technical Updates

    • Updated method signatures across multiple modules to support new token functionality
    • Expanded WebAssembly compatibility for token transitions
    • Added new type aliases and conversion traits for better type safety

Copy link
Contributor

coderabbitai bot commented Jan 22, 2025

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

This pull request introduces comprehensive enhancements to token-related functionality across multiple packages in the Dash Platform codebase. The changes span Rust and WebAssembly implementations, focusing on improving token transition handling, adding new builder patterns for token operations, and creating WebAssembly bindings for token-related transitions. The modifications enable more robust and flexible token management, including minting, burning, transferring, freezing, and emergency actions.

Changes

File/Module Change Summary
packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js Updated function signature to accept dpp parameter, expanded logic for handling various token transition types
packages/rs-dpp/src/data_contract/mod.rs Made TokenConfiguration publicly accessible
packages/rs-dpp/src/state_transition/... Updated type aliases and method signatures for encrypted notes using SharedEncryptedNote and PrivateEncryptedNote
packages/rs-sdk/src/platform/transition/fungible_tokens/ Added new modules for token operations: burn, mint, transfer, freeze, unfreeze, destroy, emergency
packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/ Introduced WebAssembly bindings for various token transition types

Sequence Diagram

sequenceDiagram
    participant SDK as Token SDK
    participant Builder as Token Operation Builder
    participant Platform as Dash Platform
    
    SDK->>Builder: Create operation builder
    Builder->>Builder: Configure operation parameters
    Builder->>Platform: Broadcast transition
    Platform-->>Builder: Return transition result
    Builder-->>SDK: Return operation result
Loading

Possibly related PRs

Suggested reviewers

  • lklimek

Poem

🐰 Tokens dance, a digital ballet
Rust and WebAssembly pave the way
Freeze, mint, and burn with grace so light
Platform's tokens take their flight! 🚀


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

using_group_info: Option<GroupStateTransitionInfoStatus>,
}

impl<'a> TokenEmergencyActionBuilder<'a> {
Copy link
Member

Choose a reason for hiding this comment

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

file should be called emergency_action

Copy link
Member

@QuantumExplorer QuantumExplorer left a comment

Choose a reason for hiding this comment

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

I'm not sure we should call these things builders, as they would be for single use.

@QuantumExplorer
Copy link
Member

@coderabbitai review

Copy link
Contributor

coderabbitai bot commented Jan 24, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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: 7

🧹 Nitpick comments (37)
packages/rs-sdk/src/platform/transition/fungible_tokens/emergency.rs (3)

19-19: Clarify the doc comment to accurately reflect the emergency context rather than minting tokens.

Currently, the doc comment says "A builder to configure minting tokens," but this code handles emergency actions.

-/// A builder to configure minting tokens.
+/// A builder to configure emergency token actions.

38-39: Implement the token position validation to address the TODO.

The TODO comment indicates that token position validation is pending. This is important to ensure the correct token contract position is used during the pause operation.

Do you want me to propose code for performing this validation and open a new issue to track it?


84-85: Offer to handle automatic group info resolution.

The TODO mentions simplifying group actions by automatically finding the token position if a group action is required. Handling this logic within a helper function or the builder itself may reduce duplication and minimize user error.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mod.rs (1)

93-114: Consider avoiding unnecessary cloning in the match arms.

Cloning large data structures in each branch may incur performance overhead. Where possible, pass references or clone lazily (only when needed).

packages/rs-sdk/src/platform/transition/fungible_tokens/unfreeze.rs (3)

18-18: Update the struct-level documentation.

The doc comment says “A builder to configure minting tokens,” but this structure is for unfreezing tokens.

-/// A builder to configure minting tokens.
+/// A builder to configure unfreezing tokens.

38-38: Address the TODO to validate token position.

This is critical to prevent invalid token positions from being used, which could lead to logic errors downstream.

Do you want me to generate a helper function or open a new issue to track and implement the validation step?


75-117: Add error handling for broadcast failures.

Currently, the code logs the error (by using ?), but consider adding a retry mechanism or more specific error details in certain scenarios (e.g., insufficient fees, invalid token state).

packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js (2)

17-17: Document the new dpp parameter.

Ensure function-level JSDoc or inline documentation clarifies the usage of dpp.


133-145: Provide consistent error messages.

In case of an unsupported transition type, the error message is helpful. Ensure uniform error reporting format across all batched transition checks.

packages/wasm-dpp/src/data_contract/tokens.rs (2)

1-3: Consider adding documentation comments.

These imports and the bridging logic could benefit from Rust doc comments (e.g., ///) explaining how this Wasm-bound wrapper should be used from JavaScript.


14-18: Prefer implementing From<TokenConfigurationWasm> for TokenConfiguration.

In Rust, Into<T> is automatically derived if From<U> for T is implemented. Hence, it’s often more idiomatic to implement only From<TokenConfigurationWasm> for TokenConfiguration and omit Into(TokenConfiguration).

-impl Into<TokenConfiguration> for TokenConfigurationWasm {
-    fn into(self) -> TokenConfiguration {
-        self.0
-    }
-}
+impl From<TokenConfigurationWasm> for TokenConfiguration {
+    fn from(value: TokenConfigurationWasm) -> Self {
+        value.0
+    }
+}
packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs (1)

16-22: Add documentation to clarify usage.

Adding a doc comment or short description explaining what getFrozenIdentityId does can help JavaScript consumers quickly understand the method’s purpose.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs (1)

16-22: Enhance clarity with doc comments.

Providing a short doc comment for getRecipientId can guide JS developers on what the method returns and how to properly use it.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs (1)

16-22: Add doc comments for clarity.

A short Rust doc comment elaborating on the purpose of getFrozenIdentityId would be beneficial, ensuring developers have immediate context in the generated TypeScript definitions.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destory.rs (1)

1-5: Typo in the filename
The file name is spelled "destory.rs" instead of "destroy.rs". Please rename the file to maintain clarity and consistency.

- packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destory.rs
+ packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destroy.rs
packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs (4)

1-17: Ensure consistent error handling & logging imports
The list of imports looks good, covering necessary traits and modules. However, consider adding a common logging crate if you plan to emit logs or debug information during the burn operation. This helps with observability if errors occur downstream and might simplify debugging.


18-28: Clarify docstring for BurnTokensBuilder
The docstring states "A builder to configure and broadcast burning tokens transition," which is clear. For completeness, consider adding a high-level usage example or any prerequisites (like verifying the caller’s identity) to guide new developers.


30-49: Address the TODO comment for validating token position
You have a TODO (line 37) to validate the token position. This is critical to avoid scenarios where invalid positions cause runtime failures or security issues.

Would you like me to generate a quick helper function that checks valid positions for you?


61-67: Resolve the TODO regarding group info
Similar to the earlier validation TODO, the note here implies automatically detecting position if group action is required. This might significantly reduce boilerplate for clients.

Let me know if you need a prototype or a separate utility function to streamline group logic.

packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs (2)

29-49: Graceful error handling around token position
You have another TODO (line 37) to validate token position. Ensure consistent logic across the entire token-lifecycle code, so invalid positions fail early with a clear error.


61-67: Group info comment
Again, a TODO suggests potential automation. You might consider a shared helper used by both BurnTokensBuilder and DestroyFrozenTokensBuilder if the logic overlaps.

packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs (3)

30-49: Add token position checks
As with the other transitions, line 38 has a TODO for validating the token position. Addressing this helps avoid passing invalid configuration values.


61-67: Group info
Similar suggestion: a shared helper to auto-detect group usage is a good practice.


119-132: Mention side effects in doc
When tokens are frozen, consider indicating the side effects left on downstream states, so callers know the impact. Otherwise, the code is well-structured.

packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs (4)

18-29: Confirm default values and add field-level documentation.
While the struct is clearly defined, consider documenting each field's intended usage, especially for optional fields like public_note and settings, to guide other developers.


54-60: Clarify the conditions for destination issuance.
The TODO at line 57 notes minting_allow_choosing_destination. Ensure the final builder logic aligns with the contract’s constraints regarding recipient IDs.


72-78: Simplify group actions logic.
The TODO at line 75 suggests automatically determining the token position if group actions are required. This can reduce complexity for callers.


85-129: Consider advanced error handling and a final check.
Upon constructing the state transition, consider verifying any last-minute constraints (e.g., max token supply or contract-limited minting) to fail early if the request is invalid.

packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs (4)

21-34: Update the doc comment to match “Transfer” context.
Line 36 refers to “Start building a mint tokens request.” Change it to reflect token transfers for clarity.

- /// Start building a mint tokens request for the provided DataContract.
+ /// Start building a token transfer request for the provided DataContract.

60-66: Encourage encryption usage checks.
with_shared_encrypted_note is optional. If certain contract rules mandate encryption, consider adding a warning or a built-in safeguard.


92-136: Strengthen transfer constraints.
When doing a token transfer, confirm that the sender has sufficient balance or ownership. Ensure the logic calls or enforces checks to avoid partial or failing transitions down the line.


138-151: Document usage of the returned BTreeMap.
broadcast_and_wait_for_result returns a map of identifiers to token amounts. Provide guidance or doc comments on how to interpret multiple recipients if relevant.

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs (2)

48-54: Add doc references to structured note types.
Now that shared_encrypted_note is an Option<&SharedEncryptedNote>, consider referencing the new type’s docs to help other developers.


132-140: Document usage of “as_ref” vs. owned calls.
Line 136 ensures an owned return for the shared note, while 132 returns a reference. Clarify guidelines on when to consume vs. borrow.

packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs (1)

91-97: Encourage additional docstrings.
For these note-related methods, docstrings clarifying how these notes are encrypted or used in transitions help maintain code clarity.

packages/rs-dpp/src/tokens/token_event.rs (1)

18-24: Consistent use of strongly typed SharedEncryptedNote

Switching from raw tuples to a strongly typed SharedEncryptedNote enhances maintainability. Consider extending this approach to TokenEventPersonalEncryptedNote for a uniform, strongly typed codebase.

packages/wasm-dpp/src/document/state_transition/batch_transition/mod.rs (1)

111-115: Consider improving variable naming within the match arms for clarity.
The variables doc in Token(doc) and tok in Document(tok) can cause confusion due to the mismatch in naming. Renaming them to token_transition and document_transition or similar will make the code more readable.

 match tr.to_owned_transition() {
-    BatchedTransition::Token(doc) => TokenTransitionWasm::from(doc).into(),
-    BatchedTransition::Document(tok) => DocumentTransitionWasm::from(tok).into(),
+    BatchedTransition::Token(token_transition) => TokenTransitionWasm::from(token_transition).into(),
+    BatchedTransition::Document(document_transition) => DocumentTransitionWasm::from(document_transition).into(),
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3733f56 and 24ef6b0.

📒 Files selected for processing (34)
  • packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js (2 hunks)
  • packages/rs-dpp/src/data_contract/mod.rs (1 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs (2 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs (5 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0_methods.rs (4 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (2 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs (2 hunks)
  • packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs (2 hunks)
  • packages/rs-dpp/src/tokens/token_event.rs (1 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/mod.rs (5 hunks)
  • packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs (7 hunks)
  • packages/rs-sdk/src/platform/transition.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/emergency.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/mod.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs (1 hunks)
  • packages/rs-sdk/src/platform/transition/fungible_tokens/unfreeze.rs (1 hunks)
  • packages/wasm-dpp/Cargo.toml (1 hunks)
  • packages/wasm-dpp/src/data_contract/data_contract.rs (3 hunks)
  • packages/wasm-dpp/src/data_contract/mod.rs (1 hunks)
  • packages/wasm-dpp/src/data_contract/tokens.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/mod.rs (2 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/burn.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/config.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destory.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/emergency.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mint.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mod.rs (2 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs (1 hunks)
  • packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • packages/rs-sdk/src/platform/transition.rs
  • packages/wasm-dpp/src/data_contract/mod.rs
🔇 Additional comments (77)
packages/rs-sdk/src/platform/transition/fungible_tokens/emergency.rs (1)

31-31: Rename the file to match the intended naming.

Past feedback from QuantumExplorer suggests renaming the file from emergency.rs to emergency_action.rs for clarity.

packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js (1)

47-49: Validate the presence of token transitions before processing.

Explicitly guarding against empty or invalid transitions can enhance code clarity and reduce unexpected edge cases.

packages/rs-sdk/src/platform/transition/fungible_tokens/mod.rs (1)

1-7: Modules introduction looks consistent

The addition of these modules cleanly organizes different token operations (burn, destroy, emergency, freeze, mint, transfer, unfreeze). This modular architecture promotes maintainability and clarity within the codebase.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/burn.rs (3)

1-2: Imports are valid

The dependencies on TokenBurnTransition and wasm_bindgen are correctly declared to facilitate bridging Rust and WASM.


4-6: Struct wrapper definition is straightforward

The wasm-bindgen annotation and struct definition effectively wrap the underlying TokenBurnTransition for use in a JavaScript/WASM context.


8-12: Conversion trait logic is appropriate

The From trait implementation correctly enables seamless conversion from the core TokenBurnTransition to the wasm wrapper. If certain validations become necessary, consider using TryFrom in the future.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/config.rs (3)

1-2: Imports are valid

Appropriate imports for bridging Rust and WASM.


4-6: WASM struct wrapper is well-defined

Encapsulating TokenConfigUpdateTransition in a wrapper preserves existing functionality while enabling cross-language interaction.


8-12: Conversion trait usage is consistent

This straightforward From trait implementation simplifies the creation of a WASM wrapper for config transitions.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/emergency.rs (3)

1-2: Imports are valid

Dependencies are well-organized for bridging Rust’s TokenEmergencyActionTransition with WASM code.


4-6: Emergency action wrapper is clearly structured

The annotation and struct definition follow the established pattern, ensuring consistency in emergency action handling.


8-12: Seamless conversion

Using From ensures straightforward interoperability with consumers expecting the WASM wrapper.

packages/wasm-dpp/src/data_contract/tokens.rs (1)

4-7: Struct naming alignment.

Wrapping the underlying TokenConfiguration in a tuple struct named TokenConfigurationWasm is consistent with typical Wasm-bound patterns. Good job on maintaining naming clarity and ensuring it’s discoverable as an exported entity for JavaScript.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs (2)

6-8: Wrapper struct naming is consistent and clear.

This tuple struct pattern nicely reflects the underlying TokenFreezeTransition and ensures minimal overhead while bridging to JS.


10-14: Conversion trait implementation is consistent.

You provide a straightforward From<TokenFreezeTransition> implementation, which is concise and idiomatic for data bridging.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs (2)

6-8: Struct definition is aligned with best practices.

This pattern is consistent with other token transition WASM wrappers. The design fosters a straightforward integration of Rust and JavaScript code.


10-14: Conversion approach reaffirms consistency.

The From<TokenTransferTransition> implementation parallels the freeze transition pattern, making the codebase uniform and easier to maintain.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs (2)

6-8: Good use of consistent naming across transitions.

Leveraging TokenUnfreezeTransitionWasm parallels the existing freeze transition design. This makes the API intuitive for those already familiar with the freezing feature.


10-14: Straightforward bridging logic.

As with other transitions, the From<TokenUnfreezeTransition> implementation is concise and maintains consistency throughout the codebase.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destory.rs (3)

6-9: Struct naming
The suffix Wasm on the struct highlights that it is a WebAssembly wrapper. This naming pattern appears consistent with the rest of the codebase.


10-14: From trait usage
Implementing From<TokenDestroyFrozenFundsTransition> is a straightforward way to safely wrap the underlying struct. No issues here.


16-22: Getter method
The method frozen_identity_id exposes the internal ID as expected and is properly annotated for JavaScript (js_name=getFrozenIdentityId). This looks good.

packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mint.rs (4)

1-8: Use of WithJsError
The import of WithJsError suggests you're consistently handling Rust errors in a JavaScript-friendly manner. This is a good practice for bridging the two environments.


9-11: New struct for Wasm bridging
Defining TokenMintTransitionWasm with the #[wasm_bindgen(js_name=TokenMintTransition)] attribute properly exposes the struct to JavaScript.


13-17: Conversion trait
Using impl From<TokenMintTransition> ensures an ergonomic way to create the Wasm wrapper. No concerns.


19-31: Signature requiring TokenConfigurationWasm
pub fn recipient_id(&self, token_configuration: TokenConfigurationWasm) -> Result<IdentifierWrapper, JsValue> suggests the recipient ID depends on the provided token configuration. Verify that passing a configuration here is necessary instead of using internal struct data, especially if multiple transitions or different states might need distinct configurations.

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs (3)

15-20: New type aliases for encrypted notes
Defining SharedEncryptedNote and PrivateEncryptedNote clarifies the meaning of the tuple fields, improving readability and maintainability.


63-63: shared_encrypted_note field
Using Option<SharedEncryptedNote> aligns with the new type alias, reducing ambiguity and clarifying the intent of the note.


69-69: private_encrypted_note field
Similarly, switching to Option<PrivateEncryptedNote> makes it clearer that this note is distinct from the shared one, and is not always present.

packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/mod.rs (7)

6-6: Referencing new note aliases
Importing SharedEncryptedNote and PrivateEncryptedNote ensures code consistency across modules.


65-65: shared_encrypted_note getter
Returning Option<&SharedEncryptedNote> is appropriate for safe, read-only access to a potentially absent value.


71-71: shared_encrypted_note_owned method
Providing an owned version of the note is valuable for scenarios where a consuming function needs full ownership.


77-77: set_shared_encrypted_note method
Accepting an Option<SharedEncryptedNote> enforces flexibility in either storing a new note or clearing the field if None is provided.


109-109: Setter for private note
Consistently adopting the same pattern as with shared_encrypted_note ensures a uniform API for setting optional data.


121-122: notes() method return value
Exposing the collected optional notes in a tuple helps to retrieve all note-related data together, which can simplify external usage.


133-134: notes_owned() method return value
Similarly returning owned data for all notes is convenient for cases where external code needs to consume or modify them independently.

packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs (4)

51-59: Fluent builder pattern is well-implemented
These methods follow the standard Rust builder pattern, ensuring optional fields are handled gracefully. Looks good!


69-72: Settings integration
Using an optional PutSettings is an elegant approach. The code is consistent with the rest of the builder pattern.


74-116: Confirm user_fee_increase usage
The method applies unwrap_or_default() for user fee increases (line 105). Verify that default values align with chain or contract policy. Also, consider logging the final user fee if dynamic fees can affect user balances significantly.


118-131: Clean pattern for awaiting response
broadcast_and_wait_for_result is straightforward and consistent with the rest of the codebase. Good job providing a succinct, chained flow for finalizing the operation.

packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs (5)

17-27: Confirm naming alignment
The struct is called DestroyFrozenTokensBuilder, which is descriptive. Confirm that all calls to this builder are similarly named for consistency, e.g., “destroy_frozen_tokens”.


51-59: Good approach for optional fields
Having builder methods like with_public_note clarifies the code. No issues spotted here.


69-72: Optional PutSettings
Same pattern as the burn builder: simple and effective.


74-116: Check broadcast flow for partial success
Unlike minting or burning, destroying frozen tokens might need special attention to partial or multi-step transitions in complex scenarios. Ensure no partial states are left if an error occurs after some tokens are destroyed.


118-131: Asynchronous response handling
broadcast_and_wait_for_result is consistent with the approach from other token transition builders. This uniformity eases maintenance.

packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs (4)

18-28: Builder struct naming is correct
FreezeTokensBuilder aligns well with the file’s purpose, contrasting with the doc comment mismatch above.


51-59: Optional note & user fee
No issues here. The builder pattern is consistent.


69-72: Optional settings
Same usage as in other modules. Continues the consistent approach for optional fields.


75-117: Check error propagation
The broadcast method calls BatchTransition::new_token_freeze_transition(...) and then broadcasts. Confirm all ? error paths clearly indicate context (e.g., “failed to freeze tokens”). Logging or wrapping the error helps.

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0_methods.rs (6)

7-7: Using more expressive type aliases
Refactoring the previously used tuple into SharedEncryptedNote is a good improvement in readability and maintainability.


79-84: Check for version mismatches
When returning Option<&SharedEncryptedNote>, ensure that any new note version changes do not cause round-trip serialization issues.


85-90: Ownership approach
shared_encrypted_note_owned returning Option<SharedEncryptedNote> cleanly transfers ownership. This pattern is consistent with Rust best practices.


91-91: Consistent setter
set_shared_encrypted_note aligns well with the new typed approach.


121-121: Replace private tuple with PrivateEncryptedNote
Good job standardizing the private note approach, just like the shared note.


132-133: Consistent use of typed notes
Returning Option<SharedEncryptedNote> and Option<PrivateEncryptedNote> in notes_owned is a logical extension of your typed note approach. No major issues here.

packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs (2)

1-17: Ensure imports are used consistently and cautiously.
All imports appear relevant to state transitions, resulting objects, and errors.


130-143: Validate broadcast result usage.
Ensure consumers of broadcast_and_wait_for_result handle the tuple (Identifier, TokenAmount) correctly, especially evaluating success/failure states.

packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs (1)

1-20: Confirm all imports are utilized and secure.
These imports are standard for bridging transitions and token ID calculations. No issues found.

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs (3)

6-6: Unified note type usage.
Replacing tuples with structured types (SharedEncryptedNote, PrivateEncryptedNote) improves readability and maintainability.


75-75: Check consistency of encrypted note usage.
If the private note is now also a structured type, ensure upstream or downstream code has aligned usage.

Also applies to: 82-83


164-164: Validate partial or missing note states.
When “notes_owned” or “notes” omit one or more notes, confirm if partial encryption fields can cause confusion or errors.

Also applies to: 172-173

packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs (3)

10-10: Approve type usage for shared/private notes.
Using SharedEncryptedNote and PrivateEncryptedNote fosters clarity.


118-118: Ensure optional fields remain in sync.
When shared_encrypted_note is updated, confirm no mismatch with private note usage.

Also applies to: 125-126, 133-134


167-175: Verify null states for notes.
Where notes() and notes_owned() handle None fields, ensure downstream logic handles partially absent notes gracefully.

Also applies to: 199-199, 207-208, 221-222

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs (2)

17-19: Well-structured approach for typed encryption note usage

Replacing the raw tuple-based approach for shared & private notes with dedicated types is a significant improvement in both clarity and maintainability. Great job streamlining these imports.


82-83: Improved function signature readability

This new signature is more intuitive thanks to SharedEncryptedNote and PrivateEncryptedNote. Just ensure all call sites pass the correct structure and that older tuple-based usage is updated accordingly.

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

53-53: Publicly exposing TokenConfiguration

Making TokenConfiguration public is justified to enable broader usage across the codebase. Confirm the interface is stable and well-documented to safeguard external consumers from unexpected changes.

packages/wasm-dpp/src/data_contract/data_contract.rs (4)

10-10: Importing TokenContractPosition for modular token management

Enabling this import for referencing token configurations is aligned with the new feature set. Looks good for maintainability.


14-14: Utilizing DataContractV1Getters

Adding DataContractV1Getters is a positive step, ensuring a clearer, type-safe interface for the WASM environment. Nicely done.


454-464: New token_configuration method

This method cleanly exposes token configuration to external consumers under WASM. Consider adding tests for edge cases, such as an invalid or missing token_contract_position.


26-26: Import of TokenConfigurationWasm

Please confirm there are no naming collisions or overshadowed symbols across the crate. Usage looks straightforward, but verifying references helps ensure consistency.

✅ Verification successful

Import verified - no naming conflicts or inconsistencies
The TokenConfigurationWasm import is properly scoped and consistently used across the codebase as a wrapper type with clear conversion paths to/from the inner TokenConfiguration type.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Checking for references to TokenConfigurationWasm
rg -A 5 'TokenConfigurationWasm'

Length of output: 3805

packages/wasm-dpp/src/document/state_transition/batch_transition/mod.rs (1)

33-34: Imports for Document and Token transitions look straightforward.

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs (2)

27-29: Newly imported PrivateEncryptedNote and SharedEncryptedNote appear consistent with typed transitions.


567-568: Transition signature change to typed encrypted notes is a positive improvement.
Replacing tuple-based parameters with named types improves readability and type safety. Ensure all test fixtures or calls are updated accordingly.

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs (2)

82-83: Reusing PrivateEncryptedNote and SharedEncryptedNote across transitions is a good approach.


587-588: Typed parameters enhance maintainability.

packages/wasm-dpp/Cargo.toml (1)

43-43: Confirmed addition of system_contracts feature.
It's recommended to verify that enabling this feature meets the intended use case, ensuring no unexpected side effects.

Comment on lines 57 to 58
// TODO: Validate token position

Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Likewise, add missing token position validation for the resume flow.

Similar to the pause operation, the resume operation also includes a TODO for token position validation.

// Example: you can unify pause/resume validation in a helper method
fn validate_token_position(token_position: TokenContractPosition) -> Result<(), Error> {
    // implement the checks you need here
}

...

// usage inside resume
Self {
    data_contract,
    token_position: {
        validate_token_position(token_position)?;
        token_position
    },
    ...
}

Committable suggestion skipped: line range outside the PR's diff.


use crate::batch_transition::token_transition::burn::TokenBurnTransitionWasm;
use crate::batch_transition::token_transition::config::TokenConfigUpdateTransitionWasm;
use crate::batch_transition::token_transition::destory::TokenDestroyFrozenFundsTransitionWasm;
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix the import path to reflect the corrected module name.

Ensure that the destory reference aligns with the corrected spelling.

-use crate::batch_transition::token_transition::destory::TokenDestroyFrozenFundsTransitionWasm;
+use crate::batch_transition::token_transition::destroy::TokenDestroyFrozenFundsTransitionWasm;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
use crate::batch_transition::token_transition::destory::TokenDestroyFrozenFundsTransitionWasm;
use crate::batch_transition::token_transition::destroy::TokenDestroyFrozenFundsTransitionWasm;

use dpp::state_transition::batch_transition::batched_transition::token_transition::TokenTransition;
mod burn;
mod config;
mod destory;
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Correct the spelling in the module name.

The filename and references use destory instead of destroy. This inconsistency can cause confusion and maintenance difficulties.

-mod destory;
+mod destroy;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
mod destory;
mod destroy;

Comment on lines 64 to 78
const dataContractRequestV0 = new GetDataContractRequest.GetDataContractRequestV0({
id: dataContractId.toBuffer(),
});

const dataContractRequest = new GetDataContractRequest();
dataContractRequest.setV0(dataContractRequestV0);

const dataContractResponse = await driveClient.getDataContract(dataContractRequest);

const dataContractBuffer = Buffer.from(
dataContractResponse.getV0().getDataContract_asU8(),
);

const dataContract = await dpp.dataContract.createFromBuffer(dataContractBuffer);

Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Cache or reuse data contract retrieval results.

When multiple transitions share the same data contract, repeatedly querying and creating a data contract object may be expensive. Consider caching it to improve performance.

Comment on lines +33 to +52
pub fn new(
data_contract: &'a DataContract,
token_position: TokenContractPosition,
issuer_id: Identifier,
amount: TokenAmount,
) -> Self {
// TODO: Validate token position

Self {
data_contract,
token_position,
issuer_id,
amount,
recipient_id: None,
public_note: None,
settings: None,
user_fee_increase: None,
using_group_info: None,
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Validate token position prior to building.
A TODO at line 39 indicates missing validation logic. Consider adding checks for valid token positions, especially if out-of-range or negative values would cause downstream errors.

Comment on lines +36 to +58
/// Start building a mint tokens request for the provided DataContract.
pub fn new(
data_contract: &'a DataContract,
token_position: TokenContractPosition,
sender_id: Identifier,
recipient_id: Identifier,
amount: TokenAmount,
) -> Self {
// TODO: Validate token position

Self {
data_contract,
token_position,
issuer_id: sender_id,
amount,
recipient_id,
public_note: None,
settings: None,
user_fee_increase: None,
private_encrypted_note: None,
shared_encrypted_note: None,
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Validate token position.
Similar to MintTokensBuilder, the TODO at line 44 references missing position validation. Consider adding checks to prevent invalid positions from proceeding.

@@ -25,7 +25,7 @@ pub struct TokenTransferTransitionActionV0 {
/// The public note
pub public_note: Option<String>,
/// An optional shared encrypted note
pub shared_encrypted_note: Option<(SenderKeyIndex, RecipientKeyIndex, Vec<u8>)>,
pub shared_encrypted_note: Option<SharedEncryptedNote>,
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Double-check the combination of advanced note fields.
The struct redefines private_encrypted_note in a partial format. Consider updating it to be fully consistent with the new type.

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