Skip to content

feat(sdk): fetch last distribution claim moment#2566

Merged
QuantumExplorer merged 20 commits into
v2.0-devfrom
feat/claim-sdk
Apr 23, 2025
Merged

feat(sdk): fetch last distribution claim moment#2566
QuantumExplorer merged 20 commits into
v2.0-devfrom
feat/claim-sdk

Conversation

@pauldelucia
Copy link
Copy Markdown
Member

@pauldelucia pauldelucia commented Apr 22, 2025

Issue being fixed or feature implemented

Implemented Fetch for getting the last distribution claim moment

What was done?

Add a new struct in SDK query.rs TokenLastClaimQuery with token ID and identity ID, implement Query, Fetch, and FromProof for GetTokenPerpetualDistributionLastClaimRequest.

How Has This Been Tested?

Not yet

Breaking Changes

None

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

    • Introduced support for fetching and verifying the last claim information for perpetual token distributions.
    • Added a new query struct to facilitate requests for token perpetual distribution last claim data.
    • Implemented a new enum representing various formats of last claim data (timestamp, block height, epoch, or raw).
    • Enabled mocking and fetching capabilities for token perpetual distribution last claim data.
    • Made the query module public to allow external access to query functionality.
  • Bug Fixes

    • None.
  • Tests

    • Added a new module placeholder and test file for token perpetual distribution last claim functionality.
  • Chores

    • Publicly re-exported relevant error types for easier access in dependent projects.
    • Added token configuration fetching support to context providers and caching layers.
    • Enhanced SDK builder and example setup to include token configuration cache sizing.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 22, 2025

## Walkthrough

This set of changes introduces support for the `get_token_perpetual_distribution_last_claim` request and response across multiple Rust packages. It adds a new gRPC transport implementation for this method, defines the associated types and enums, and integrates the request into the SDK's fetch and query traits. The proof verifier gains logic to parse and verify responses, while mock support and testing scaffolding are also established. Public API exports are updated to include the new types and error handling.

## Changes

| File(s)                                                                                                         | Change Summary                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|-----------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `packages/rs-dapi-client/src/transport/grpc.rs`                                                                | Added gRPC transport request implementation for `get_token_perpetual_distribution_last_claim` using the corresponding request and response types.                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `packages/rs-drive-proof-verifier/src/lib.rs`                                                                  | Publicly re-exported `ProtocolError` from the `dpp` crate.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `packages/rs-drive-proof-verifier/src/proof.rs`                                                                | Declared new public module `token_perpetual_distribution_last_claim`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs`                        | Added `FromProof` implementation for `RewardDistributionMoment` handling versioning, token and identity ID validation, proof verification, and conversion to public enum.                                                                                                                                                                                                                                                                                                                                                                                                |
| `packages/rs-drive-proof-verifier/src/types.rs`                                                                | Removed redundant import of `ProtocolError` under mocks and imported it directly from `dpp`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `packages/rs-drive-proof-verifier/src/error.rs`                                                                 | Added `TokenConfigurationFailure(String)` variant to `ContextProviderError` enum for token configuration retrieval errors.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `packages/rs-drive-proof-verifier/src/provider.rs`                                                              | Added `get_token_configuration` method to `ContextProvider` trait and implementations, including mock stub returning `None`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `packages/rs-sdk/src/mock/requests.rs`                                                                         | Added `MockResponse` trait implementation for `RewardDistributionMoment` using macro.                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `packages/rs-sdk/src/mock/sdk.rs`                                                                              | Integrated `GetTokenPerpetualDistributionLastClaimRequest` into mock expectations loader.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `packages/rs-sdk/src/mock/provider.rs`                                                                          | Extended `GrpcContextProvider` with `token_configurations_cache` and implemented `get_token_configuration` method with cache lookup and warning on miss.                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `packages/rs-sdk/src/platform/fetch.rs`                                                                        | Implemented `Fetch` trait for `RewardDistributionMoment` associating it with `GetTokenPerpetualDistributionLastClaimRequest`.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `packages/rs-sdk/src/platform/query.rs`                                                                        | Added `TokenLastClaimQuery` struct with `token_id` and `identity_id` fields; implemented `Query` trait for `GetTokenPerpetualDistributionLastClaimRequest` constructing request with proof requirement and contract info set to `None`.                                                                                                                                                                                                                                                                                                                                                                             |
| `packages/rs-sdk/tests/fetch/tokens/mod.rs`                                                                    | Added module declaration for `token_perpetual_distribution_last_claim`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs`                                | Added new test file with commented-out async tests for fetching last claim with and without proof, and for never-claimed identity.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `packages/rs-sdk/src/platform.rs`                                                                               | Changed `query` module visibility from private to public.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `packages/rs-sdk/examples/read_contract.rs`                                                                     | Added cache size parameter for token configurations when creating `GrpcContextProvider` in `setup_sdk`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `packages/rs-sdk/src/sdk.rs`                                                                                    | Added `DEFAULT_TOKEN_CONFIG_CACHE_SIZE` constant and `token_config_cache_size` field to `SdkBuilder`; passed new cache size to `GrpcContextProvider::new` in build method.                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_moment/mod.rs` | Added derives `PlatformSerialize` and `PlatformDeserialize` with attribute `#[platform_serialize(unversioned)]` to `RewardDistributionMoment` enum.                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs`                                 | Removed trailing blank line after `TokenConfiguration` enum definition; no functional changes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Client
    participant SDK
    participant DAPI
    participant ProofVerifier

    Client->>SDK: Create TokenLastClaimQuery
    SDK->>DAPI: Send GetTokenPerpetualDistributionLastClaimRequest (gRPC)
    DAPI-->>SDK: GetTokenPerpetualDistributionLastClaimResponse (with proof or value)
    SDK->>ProofVerifier: maybe_from_proof_with_metadata(request, response, ...)
    ProofVerifier-->>SDK: (Option<RewardDistributionMoment>, metadata, proof)
    SDK-->>Client: Return last claim info and metadata

Possibly related PRs

Suggested labels

dapi-endpoint

Suggested reviewers

  • QuantumExplorer
  • shumkov

Poem

In fields of Rust, a new claim appears,
Tokens and proofs, dispelling old fears.
With enums and traits, the SDK grows,
Last-claim requests now everyone knows!
Mock bunnies hop, tests soon to run—
Our code garden blooms, the work is well done.
🐇✨


<!-- walkthrough_end -->
<!-- internal state start -->


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

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

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.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=dashpay/platform&utm_content=2566):

- 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](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@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](https://docs.coderabbit.ai/guides/configure-coderabbit) 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](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link
Copy Markdown
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: 3

🧹 Nitpick comments (4)
packages/rs-dapi-client/src/transport/grpc.rs (1)

601-608: gRPC transport implementation is correctly defined.

The implementation of the transport request for GetTokenPerpetualDistributionLastClaimRequest follows the established pattern using the impl_transport_request_grpc! macro with appropriate types and default settings.

Minor nitpick: The comment on line 601 includes "Request" in the method name which is slightly inconsistent with other similar comments in this file. Consider aligning it with other comments for better consistency.

-// rpc getTokenPerpetualDistributionLastClaimRequest(GetTokenPerpetualDistributionLastClaimRequest) returns (GetTokenPerpetualDistributionLastClaimResponse);
+// rpc getTokenPerpetualDistributionLastClaim(GetTokenPerpetualDistributionLastClaimRequest) returns (GetTokenPerpetualDistributionLastClaimResponse);
packages/rs-drive-proof-verifier/src/types.rs (1)

637-653: Well-designed enum with appropriate variants.

The TokenPerpetualDistributionLastClaim enum is well-defined with variants that cover different ways of representing the last claim moment (timestamp, block height, epoch, or raw data). The documentation is clear, and the necessary derive attributes for serialization are included.

Consider adding helper methods for common operations, such as converting between variant types or extracting the value in a standardized format.

impl TokenPerpetualDistributionLastClaim {
    /// Attempts to convert to a timestamp in milliseconds
    pub fn as_timestamp_ms(&self) -> Option<u64> {
        match self {
            Self::TimestampMs(ms) => Some(*ms),
            // Add conversions from other formats if needed
            _ => None,
        }
    }
    
    /// Attempts to convert to a block height
    pub fn as_block_height(&self) -> Option<u64> {
        match self {
            Self::BlockHeight(height) => Some(*height),
            // Add conversions from other formats if needed
            _ => None,
        }
    }
    
    // Add more helper methods as needed
}
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (2)

31-33: Minor: consolidate duplicate use paths

get_token_perpetual_distribution_last_claim_response_v0 is imported twice (lines 4‑8 and 31‑33).
You can fold the Result alias into the first use to keep the prelude concise:

-            get_token_perpetual_distribution_last_claim_response_v0::{
-                self, last_claim_info::PaidAt,
-            },
+            get_token_perpetual_distribution_last_claim_response_v0::{
+                self, last_claim_info::PaidAt, Result as RespResult,
+            },

This removes the second standalone use statement.


131-136: Early‑exit with clearer error message when proof verification is impossible

When contract_info is missing the function errors deep inside the proof path.
Returning a dedicated error before attempting verification makes the cause obvious.

Consider introducing a specialised Error::MissingContractInfo variant and using it here; this avoids embedding a long explanatory string in the generic variant.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between ad05271 and e3b6fe4.

📒 Files selected for processing (11)
  • packages/rs-dapi-client/src/transport/grpc.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/lib.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/proof.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/types.rs (3 hunks)
  • packages/rs-sdk/src/mock/requests.rs (2 hunks)
  • packages/rs-sdk/src/mock/sdk.rs (1 hunks)
  • packages/rs-sdk/src/platform/fetch.rs (1 hunks)
  • packages/rs-sdk/src/platform/query.rs (2 hunks)
  • packages/rs-sdk/tests/fetch/tokens/mod.rs (1 hunks)
  • packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
packages/rs-sdk/src/mock/sdk.rs (1)
Learnt from: lklimek
PR: dashpay/platform#2232
File: packages/rs-sdk/src/mock/sdk.rs:90-95
Timestamp: 2024-10-10T10:30:19.883Z
Learning: In `packages/rs-sdk/src/mock/sdk.rs`, the `load_expectations` method in `MockDashPlatformSdk` remains asynchronous (`async`) for backward compatibility, even though it now delegates to the synchronous `load_expectations_sync` method.
🧬 Code Graph Analysis (1)
packages/rs-dapi-client/src/transport/grpc.rs (1)
packages/rs-drive-abci/src/query/service.rs (1)
  • get_token_perpetual_distribution_last_claim (769-779)
⏰ Context from checks skipped due to timeout of 90000ms (11)
  • GitHub Check: Rust packages (rs-dapi-client) / Linting
  • GitHub Check: Rust packages (rs-dapi-client) / Tests
  • GitHub Check: Rust packages (rs-dapi-client) / Check each feature
  • GitHub Check: Rust packages (dash-sdk) / Tests
  • GitHub Check: Rust packages (dash-sdk) / Check each feature
  • GitHub Check: Rust packages (dash-sdk) / Linting
  • GitHub Check: Build Docker images (DAPI, dapi, dapi) / Build DAPI image
  • 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 JS packages / Build JS
  • GitHub Check: Rust crates security audit
🔇 Additional comments (9)
packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs (1)

1-2: Implementation needed: Add actual test cases for the token perpetual distribution last claim functionality.

This file currently contains only a placeholder comment without any actual test implementation. Since the PR introduces a new feature for fetching the last distribution claim moment, comprehensive test coverage is essential.

According to the PR description, the feature hasn't been tested yet. Consider implementing test cases that cover:

  • Basic fetch functionality for existing claims
  • Behavior when no claim exists
  • Error handling scenarios
  • Proof verification logic

Would you like me to help generate a skeleton implementation for these test cases?

packages/rs-drive-proof-verifier/src/proof.rs (1)

5-5: LGTM: Module declaration follows existing pattern.

The new module declaration for token_perpetual_distribution_last_claim follows the established pattern in this file and properly integrates the new proof verification functionality.

packages/rs-sdk/tests/fetch/tokens/mod.rs (1)

3-3: LGTM: Module declaration properly integrates the new test file.

The new module declaration correctly integrates the token perpetual distribution last claim test file into the test suite.

packages/rs-drive-proof-verifier/src/lib.rs (1)

11-11: LGTM: Appropriate re-export of the ProtocolError type.

The re-export of ProtocolError from the dpp crate makes it available to consumers of this library without requiring them to import it directly. This is consistent with the library's export pattern and necessary for the new proof verification functionality.

packages/rs-sdk/src/mock/sdk.rs (1)

235-239: LGTM: Mock expectation handler follows existing pattern.

The new match arm for handling GetTokenPerpetualDistributionLastClaimRequest correctly follows the established pattern in the load_expectations_sync method. This enables proper mocking support for the new request type.

packages/rs-sdk/src/platform/fetch.rs (1)

296-299: Implementation looks correct and follows established patterns.

This implementation of the Fetch trait for TokenPerpetualDistributionLastClaim correctly associates it with the corresponding request type. It follows the same pattern as other implementations in this file.

packages/rs-sdk/src/mock/requests.rs (2)

35-36: Import additions look good.

The addition of TokenPerpetualDistributionLastClaim to the imports list is correctly placed.


451-451: Mock implementation looks correct.

Using the impl_mock_response! macro for TokenPerpetualDistributionLastClaim is the right approach and follows the standard pattern used for other types in this file.

packages/rs-drive-proof-verifier/src/types.rs (1)

41-41: Import looks good.

The addition of ProtocolError from the dpp crate is appropriate.

Comment thread packages/rs-sdk/src/platform/query.rs
Comment thread packages/rs-sdk/src/platform/query.rs
Copy link
Copy Markdown
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

♻️ Duplicate comments (1)
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1)

102-108: ⚠️ Potential issue

Lossy cast from u32 to u16 can select the wrong token

The token_contract_position arrives as u32 from the protobuf but the contract's tokens() map is keyed by u16. Blindly casting (as u16) truncates values > 65,535 without error, which will lead to wrong or None look-ups.

-    let pos = cti.token_contract_position as u16;
+    let pos_u32 = cti.token_contract_position;
+    if pos_u32 > u16::MAX as u32 {
+        return Err(Error::RequestError {
+            error: format!(
+                "token_contract_position {} exceeds u16::MAX",
+                pos_u32
+            ),
+        });
+    }
+    let pos = pos_u32 as u16;
🧹 Nitpick comments (4)
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (4)

190-190: Add context to unreachable! macro

While the current implementation handles all variants, providing more context in the unreachable macro would improve debugging if enum variants are added in the future.

-        unreachable!("`result` covers all variants; qed")
+        unreachable!("Unhandled RespResult variant - all known variants (Proof, LastClaim) are covered above")

48-57: Consider adding documentation for trait method parameters

The maybe_from_proof_with_metadata method has several parameters but lacks documentation describing what each one does and what the return values represent.

Consider adding documentation to clarify the purpose of each parameter and the return value structure:

+    /// Parses and optionally verifies a token perpetual distribution last claim response
+    ///
+    /// # Parameters
+    /// * `request` - The original request for token perpetual distribution last claim
+    /// * `response` - The response from the platform containing last claim data
+    /// * `_network` - The Dash network being used
+    /// * `platform_version` - Version information for the platform
+    /// * `provider` - Provider for accessing contracts and verification context
+    ///
+    /// # Returns
+    /// A tuple containing:
+    /// * Optional TokenPerpetualDistributionLastClaim - The parsed last claim data if present
+    /// * ResponseMetadata - Metadata from the response
+    /// * Proof - The proof data (empty for unproved responses)
     fn maybe_from_proof_with_metadata<'a, I: Into<Self::Request>, O: Into<Self::Response>>(

131-136: Improve error message for missing distribution type

The current error could be more specific about what the caller needs to provide.

-                return Err(Error::RequestError {
-                    error: "cannot verify GroveDB proof without contract_info / distribution_type"
-                        .into(),
-                });
+                return Err(Error::RequestError {
+                    error: "cannot verify GroveDB proof without contract_info in request; add contract_id and token_contract_position".into(),
+                });

83-124: Consider refactoring to avoid nested blocks and reduce complexity

The token and identity ID extraction code could be refactored into helper functions to improve readability and maintainability.

+        fn extract_identifier(bytes: &[u8], field_name: &str) -> Result<[u8; 32], Error> {
+            <[u8; 32]>::try_from(bytes).map_err(|_| {
+                Error::RequestError {
+                    error: format!("{field_name} must be 32 bytes"),
+                }
+            })
+        }
+
         let (token_id, identity_id, distribution_type) = match request
             .version
             .ok_or(Error::EmptyVersion)?
         {
             RequestVersion::V0(req_v0) => {
-                let tok = <[u8; 32]>::try_from(req_v0.token_id.as_slice()).map_err(|_| {
-                    Error::RequestError {
-                        error: "token_id must be 32 bytes".into(),
-                    }
-                })?;
-                let ide = <[u8; 32]>::try_from(req_v0.identity_id.as_slice()).map_err(|_| {
-                    Error::RequestError {
-                        error: "identity_id must be 32 bytes".into(),
-                    }
-                })?;
+                let tok = extract_identifier(req_v0.token_id.as_slice(), "token_id")?;
+                let ide = extract_identifier(req_v0.identity_id.as_slice(), "identity_id")?;
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between e3b6fe4 and c0708f1.

📒 Files selected for processing (4)
  • packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1 hunks)
  • packages/rs-sdk/src/platform.rs (1 hunks)
  • packages/rs-sdk/src/platform/query.rs (2 hunks)
  • packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/rs-sdk/src/platform/query.rs
  • packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs
⏰ Context from checks skipped due to timeout of 90000ms (12)
  • GitHub Check: Rust packages (dash-sdk) / Tests
  • GitHub Check: Rust packages (dash-sdk) / Formatting
  • GitHub Check: Rust packages (rs-dapi-client) / Formatting
  • GitHub Check: Rust packages (dash-sdk) / Check each feature
  • GitHub Check: Rust packages (rs-dapi-client) / Check each feature
  • GitHub Check: Rust packages (rs-dapi-client) / Unused dependencies
  • GitHub Check: Rust packages (rs-dapi-client) / 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: Rust crates security audit
  • GitHub Check: Build JS packages / Build JS
🔇 Additional comments (3)
packages/rs-sdk/src/platform.rs (1)

16-16: Appropriately exposing the query module

Making the query module public is necessary for exposing the new TokenLastClaimQuery implementation and related functionality to external code, which supports the token perpetual distribution last claim feature.

packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (2)

1-192: Well-structured implementation with comprehensive error handling

The overall implementation of the FromProof trait for TokenPerpetualDistributionLastClaim is well-structured with thorough error handling, proper verification of both GroveDB and Tendermint proofs, and appropriate handling of both proved and direct response paths.


165-165:

Details

✅ Verification successful

Potential data loss in epoch conversion

The RewardDistributionMoment::EpochBasedMoment value is cast from what appears to be a larger integer type to u32 without bounds checking.

Verify the actual type of the epoch value in RewardDistributionMoment::EpochBasedMoment and ensure that casting to u32 doesn't lose data:


🏁 Script executed:

#!/bin/bash
# Find the definition of RewardDistributionMoment to check epoch type
rg -A 10 "enum RewardDistributionMoment" --type rust

Length of output: 1703


🏁 Script executed:

#!/bin/bash
# Locate the definition of EpochIndex to determine its underlying type
rg -n --type rust "type EpochIndex" 
rg -n --type rust "struct EpochIndex"

Length of output: 277


Epoch conversion is safe; no data loss
The EpochIndex type is defined as a u16 (packages/rs-dpp/src/block/epoch/mod.rs:12), so casting it to u32 cannot overflow. You can keep the existing conversion:

TokenPerpetualDistributionLastClaim::Epoch(e as u32)

Copy link
Copy Markdown
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: 0

♻️ Duplicate comments (1)
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1)

85-85: Use a more descriptive error for missing result.

The error NoProofInResult doesn't accurately describe this situation - you're checking if the result field exists in the response, not if there's a proof in the result.

-        let result = resp_v0.result.clone().ok_or(Error::NoProofInResult)?;
+        let result = resp_v0.result.clone().ok_or(Error::RequestError {
+            error: "missing result in response".into(),
+        })?;
🧹 Nitpick comments (3)
packages/rs-sdk/src/mock/provider.rs (1)

228-238: Consider fetching token configurations like data contracts.

The implementation for get_token_configuration only checks the cache and returns None on a miss, unlike get_data_contract which attempts to fetch missing contracts using the SDK when available.

Consider implementing a similar pattern to fetch missing token configurations when SDK is available:

fn get_token_configuration(
    &self,
    token_id: &Identifier,
) -> Result<Option<TokenConfiguration>, ContextProviderError> {
    if let Some(config) = self.token_configurations_cache.get(token_id) {
        Ok(Some((*config).clone()))
    } else {
-        tracing::warn!("token config cache miss");
-        Ok(None)
+        let sdk_guard = self.sdk.load();
+
+        let sdk = match sdk_guard.as_ref() {
+            Some(sdk) => sdk,
+            None => {
+                tracing::warn!("token config cache miss and no sdk provided, skipping fetch");
+                return Ok(None);
+            }
+        };
+
+        // Implement token configuration fetching logic here or return None
+        // for now if fetching is not yet supported
+        tracing::warn!("token config cache miss, fetching not yet implemented");
+        Ok(None)
    }
}
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1)

90-104: Avoid redundant token ID validation.

The code validates the token ID twice - once when extracting it from the request at lines 58-65, and again when creating the identifier at lines 91-94.

        let maybe_distribution_type = {
-            let token_id_identifier = Identifier::from_vec(req_v0.token_id.clone())
-                .map_err(|_| Error::RequestError {
-                    error: "token_id must be 32 bytes".into(),
-                })?;
+            // Create identifier from already-validated token_id
+            let token_id_identifier = Identifier::new(token_id);

            let maybe_token_config =
                provider.get_token_configuration(&token_id_identifier)?;
            let maybe_dist_type = maybe_token_config
                .as_ref()
                .and_then(|cfg| cfg.distribution_rules().perpetual_distribution())
                .map(|perp| perp.distribution_type().clone());

            maybe_dist_type
        };
packages/rs-drive-proof-verifier/src/provider.rs (1)

43-60: Documentation contains incorrect return type description.

The documentation comment mentions returning an Arc<TokenConfiguration> but the actual return type is Option<TokenConfiguration> without Arc-wrapping.

    /// # Returns
    ///
    /// * `Ok(Option<TokenConfiguration>)`: On success, returns the token configuration if it exists, or `None` if it does not.
-    ///   We use Arc to avoid copying the token configuration.
+    ///   Unlike data contracts, token configurations are not Arc-wrapped to avoid copying.
    /// * `Err(Error)`: On failure, returns an error indicating why the operation failed.
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between c0708f1 and 66267d8.

📒 Files selected for processing (13)
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs (0 hunks)
  • packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_moment/mod.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/error.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1 hunks)
  • packages/rs-drive-proof-verifier/src/provider.rs (5 hunks)
  • packages/rs-drive-proof-verifier/src/types.rs (2 hunks)
  • packages/rs-sdk/examples/read_contract.rs (1 hunks)
  • packages/rs-sdk/src/mock/provider.rs (6 hunks)
  • packages/rs-sdk/src/mock/requests.rs (2 hunks)
  • packages/rs-sdk/src/platform/fetch.rs (2 hunks)
  • packages/rs-sdk/src/platform/query.rs (2 hunks)
  • packages/rs-sdk/src/sdk.rs (4 hunks)
  • packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs (1 hunks)
💤 Files with no reviewable changes (1)
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs
✅ Files skipped from review due to trivial changes (3)
  • packages/rs-sdk/tests/fetch/tokens/token_perpetual_distribution_last_claim.rs
  • packages/rs-sdk/src/mock/requests.rs
  • packages/rs-drive-proof-verifier/src/types.rs
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/rs-sdk/src/platform/fetch.rs
  • packages/rs-sdk/src/platform/query.rs
🧰 Additional context used
🧠 Learnings (1)
packages/rs-drive-proof-verifier/src/error.rs (1)
Learnt from: lklimek
PR: dashpay/platform#2380
File: packages/rs-drive-proof-verifier/src/error.rs:122-125
Timestamp: 2024-12-06T14:15:49.367Z
Learning: All error variants in `ContextProviderError` within `packages/rs-drive-proof-verifier/src/error.rs` are designed to take `String` as their parameter.
🧬 Code Graph Analysis (2)
packages/rs-sdk/src/mock/provider.rs (1)
packages/rs-drive-proof-verifier/src/provider.rs (5)
  • new (204-208)
  • get_token_configuration (57-60)
  • get_token_configuration (99-104)
  • get_token_configuration (134-140)
  • get_token_configuration (314-320)
packages/rs-drive-proof-verifier/src/provider.rs (1)
packages/rs-sdk/src/mock/provider.rs (3)
  • get_token_configuration (228-238)
  • get_quorum_public_key (166-188)
  • get_data_contract (190-226)
⏰ Context from checks skipped due to timeout of 90000ms (16)
  • GitHub Check: Rust packages (dpp) / Unused dependencies
  • GitHub Check: Rust packages (rs-dapi-client) / Tests
  • GitHub Check: Rust packages (rs-dapi-client) / Check each feature
  • GitHub Check: Rust packages (rs-dapi-client) / Linting
  • GitHub Check: Rust packages (dash-sdk) / Tests
  • GitHub Check: Rust packages (dash-sdk) / Linting
  • GitHub Check: Rust packages (dash-sdk) / Check each feature
  • GitHub Check: Rust packages (drive-abci) / Check each feature
  • GitHub Check: Rust packages (drive-abci) / Tests
  • GitHub Check: Rust packages (drive) / Linting
  • GitHub Check: Rust packages (drive-abci) / Linting
  • GitHub Check: Rust packages (drive) / Tests
  • 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
🔇 Additional comments (19)
packages/rs-sdk/examples/read_contract.rs (1)

77-77: LGTM: Added token config cache parameter

The new parameter for token configuration cache size aligns with the broader changes in the SDK builder and mock provider. This ensures that the example correctly initializes the GrpcContextProvider with the necessary caching support for token configurations.

packages/rs-drive-proof-verifier/src/error.rs (1)

115-117: LGTM: Error variant for token configuration failures

The new TokenConfigurationFailure error variant follows the established pattern of other variants in this enum, taking a String parameter for the error message. This addition properly supports error handling for the token configuration retrieval operations.

packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_moment/mod.rs (2)

4-4: LGTM: Platform serialization support imports

Added the necessary imports from platform_serialization_derive to support serialization and deserialization of the RewardDistributionMoment enum.


12-26: LGTM: Enhanced serialization support for RewardDistributionMoment

Added PlatformSerialize and PlatformDeserialize traits to enable platform-specific serialization mechanisms for this enum. The #[platform_serialize(unversioned)] attribute aligns with serialization requirements for this data type.

packages/rs-sdk/src/sdk.rs (4)

50-51: LGTM: New constant for token config cache size

Added a new constant DEFAULT_TOKEN_CONFIG_CACHE_SIZE with value 100, which matches the existing pattern for other cache size constants in this file.


737-739: LGTM: Added token_config_cache_size field to SdkBuilder

This field properly supports the token configuration cache needed for the new token perpetual distribution claim feature, consistent with existing caching fields.


791-793: LGTM: Initialized token_config_cache_size in Default implementation

This initialization ensures the field is properly set to the default constant value when creating a new SdkBuilder instance.


1067-1067: LGTM: Updated GrpcContextProvider initialization

The GrpcContextProvider constructor now receives the token configuration cache size parameter, ensuring that token configurations can be properly cached when using the fallback context provider.

packages/rs-sdk/src/mock/provider.rs (4)

35-39: Properly documented cache field.

The documentation for the new token_configurations_cache is clear and follows the same style as the existing cache fields, which maintains consistency across the codebase.


71-71: This parameter adds consistency with other cache sizes.

The new parameter token_config_cache_size follows the established pattern for configuring cache sizes.


80-80: Cache initialization is consistent with existing caches.

The initialization uses the same approach as other caches, maintaining a consistent implementation pattern.


62-62: Good use of compiler directive to suppress warning.

The #[allow(clippy::too_many_arguments)] directive is appropriate here given the new parameter addition pushed the function over Clippy's threshold.

packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (3)

1-27: Well-organized imports with logical grouping.

The imports are organized in a clean and logical manner, separating gRPC-related imports from DPP and Drive components.


29-41: Comprehensive documentation explaining implementation cases.

The implementation documentation clearly outlines the three cases handled by this method, which is important for understanding the logic flow.


131-136: Good preparation for future functionality.

The error message clearly indicates that non-proof LastClaim responses are not yet supported, signaling that this functionality might be implemented in the future.

packages/rs-drive-proof-verifier/src/provider.rs (4)

3-3: Appropriate import of TokenConfiguration.

Adding the TokenConfiguration import is necessary for the new trait method.


99-104: Implementation follows established pattern.

The forwarding implementation for get_token_configuration correctly delegates to the inner reference, matching the pattern used for other methods.


134-140: Mutex implementation is consistent with other methods.

The implementation for std::sync::Mutex<T> correctly acquires the lock and delegates to the inner implementation.


314-320: Clear documentation for mock implementation.

The comment explaining that "Token configuration files are never generated" is helpful for understanding why this implementation always returns None.

Copy link
Copy Markdown
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

♻️ Duplicate comments (1)
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1)

74-74: Use a more descriptive error for missing result

The error NoProofInResult doesn't accurately describe this situation - you're checking for a missing result field, not necessarily a missing proof.

- let result = resp_v0.result.clone().ok_or(Error::NoProofInResult)?;
+ let result = resp_v0.result.clone().ok_or(Error::RequestError {
+     error: "missing result in last claim response".into(),
+ })?;
🧹 Nitpick comments (6)
packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (6)

54-56: Duplicate error message for token_id validation

The same error message for token_id validation appears twice in the code. Consider extracting this into a constant or creating a helper function to avoid duplication.

+ const TOKEN_ID_SIZE_ERROR: &str = "token_id must be 32 bytes";

// Then use this constant in both error locations:
- .map_err(|_| Error::RequestError {
-     error: "token_id must be 32 bytes".into(),
- })?;
+ .map_err(|_| Error::RequestError {
+     error: TOKEN_ID_SIZE_ERROR.into(),
+ })?;

Also applies to: 80-82


72-72: Avoid unnecessary cloning of response fields

The clone() calls on response fields could be inefficient, especially if these structures are large. Consider using references where possible.

- let metadata = resp_v0
-     .metadata
-     .clone()
-     .ok_or(Error::EmptyResponseMetadata)?;
+ let metadata = resp_v0
+     .metadata
+     .as_ref()
+     .ok_or(Error::EmptyResponseMetadata)?
+     .clone();

- let result = resp_v0.result.clone().ok_or(Error::NoProofInResult)?;
+ let result = resp_v0.result.as_ref().ok_or(Error::NoProofInResult)?.clone();

Also applies to: 74-74


79-82: Avoid unnecessary cloning of request data

The clone() call on req_v0.token_id could be inefficient. Use references instead of cloning data.

- let token_id_identifier = Identifier::from_vec(req_v0.token_id.clone())
+ let token_id_identifier = Identifier::from_vec(&req_v0.token_id)
      .map_err(|_| Error::RequestError {
          error: "token_id must be 32 bytes".into(),
      })?;

96-104: Document the purpose of the false parameter

The boolean parameter false in the verify_token_perpetual_distribution_last_paid_time call is not self-explanatory. Consider adding a comment to clarify its purpose or use a named constant to make the code more readable.

+ // false parameter indicates we don't need to enforce existence of the last paid time
  let (root_hash, moment_opt) =
      Drive::verify_token_perpetual_distribution_last_paid_time(
          &proof_msg.grovedb_proof,
          token_id,
          identity_id,
          &distribution_type,
          false,
          platform_version,
      )?;

118-120: Plan for supporting non-proof LastClaim responses

The code currently returns an error for non-proof LastClaim responses, but it would be helpful to add a TODO comment with information about when this will be supported or what's needed to implement it.

  RespResult::LastClaim(_) => Err(Error::RequestError {
-     error: "Non-proof LastClaim response is not supported in rs-sdk".into(),
+     error: "Non-proof LastClaim response is not yet supported in rs-sdk".into(),
+     // TODO: Implement support for direct LastClaim responses in a future update
  }),

33-123: Add more comprehensive documentation

The implementation could benefit from more detailed documentation explaining:

  1. When will this method return None vs Some(RewardDistributionMoment)
  2. What happens if an identity has never claimed
  3. What's the relationship between the RewardDistributionMoment and the proof

The method has a brief doc comment but would benefit from more detailed documentation covering edge cases and return value semantics.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 66267d8 and 93cf995.

📒 Files selected for processing (1)
  • packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (20)
  • GitHub Check: Rust packages (wasm-dpp) / Detect immutable structure changes
  • GitHub Check: Rust packages (wasm-dpp) / Formatting
  • 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 (drive) / Formatting
  • GitHub Check: Rust packages (dash-sdk) / Check each feature
  • GitHub Check: Rust packages (dash-sdk) / Tests
  • GitHub Check: Rust packages (dash-sdk) / Unused dependencies
  • GitHub Check: Rust packages (dash-sdk) / Linting
  • GitHub Check: Rust packages (dpp) / Tests
  • GitHub Check: Rust packages (dpp) / Linting
  • GitHub Check: Rust packages (dpp) / Check each feature
  • GitHub Check: Rust packages (drive-abci) / Linting
  • GitHub Check: Rust packages (drive-abci) / Check each feature
  • GitHub Check: Rust packages (drive-abci) / Tests
  • GitHub Check: Rust packages (rs-dapi-client) / Check each feature
  • GitHub Check: Build Docker images (Drive, drive, drive-abci) / Build Drive image
  • GitHub Check: Build JS packages / Build JS

@QuantumExplorer QuantumExplorer added this to the v2.0.0 milestone Apr 23, 2025
@QuantumExplorer QuantumExplorer merged commit 396abd8 into v2.0-dev Apr 23, 2025
138 of 139 checks passed
@QuantumExplorer QuantumExplorer deleted the feat/claim-sdk branch April 23, 2025 12:00
@coderabbitai coderabbitai Bot mentioned this pull request Jul 29, 2025
12 tasks
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