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

fix(torii-grpc): handle case token id for erc20 #3041

Merged
merged 6 commits into from
Feb 17, 2025

Conversation

Larkooo
Copy link
Collaborator

@Larkooo Larkooo commented Feb 17, 2025

Summary by CodeRabbit

  • Bug Fixes
    • Enhanced token balance subscription processing with improved validation of token identifiers, ensuring more consistent and reliable balance updates for end-users.
    • Updated SQL query logic for retrieving token balances to improve accuracy based on token ID format.

Copy link

coderabbitai bot commented Feb 17, 2025

Ohayo sensei! Here’s the breakdown of the changes:

Walkthrough

The update refines how token IDs are handled within the process_balance_update function of the Service struct. Instead of converting the entire hexadecimal string, the token ID is now split by a colon, and only the second component is converted to a U256 if available; otherwise, it defaults to None. The subscriber filter check is adjusted to execute only when a valid token ID exists, and the response construction now conditionally maps the token ID to its byte representation or returns an empty vector. No public API changes were made.

Changes

File Path Change Summary
crates/torii/.../token_balance.rs Modified process_balance_update to split the token ID by ":"; converts the second element to U256 if valid, adjusts subscriber filter checks, and conditionally maps the token ID to a byte vector in the response.
crates/torii/.../mod.rs Updated SQL query in retrieve_token_balances to extract a substring from token_id starting after the first colon and check its membership in the specified list.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Service
    participant Subscriber
    Client->>Service: Send balance update (token_id string)
    Service->>Service: Split token_id by ":" and check for two parts
    alt Valid format
        Service->>Service: Convert second part to U256
    else Invalid format
        Service->>Service: Set token_id to None
    end
    Service->>Service: Verify existence and membership of token_id
    Service->>Subscriber: Process and prepare response (token_id bytes or empty vector)
    Subscriber-->>Client: Return SubscribeTokenBalancesResponse
Loading

Possibly related PRs

Suggested reviewers

  • glihm

📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 55a7ef5 and e718d70.

📒 Files selected for processing (1)
  • crates/torii/grpc/src/server/mod.rs (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/torii/grpc/src/server/mod.rs

🪧 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.

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.

Copy link

@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

🧹 Nitpick comments (1)
crates/torii/grpc/src/server/subscriptions/token_balance.rs (1)

146-151: Ohayo sensei! Consider enhancing the token ID parsing logic.

While the changes handle the ERC20 token ID case well, we could make the code more robust and clearer:

-        let id: Vec<&str> = balance.token_id.split(':').collect();
-        let token_id: Option<U256> = if id.len() == 2 {
-            Some(U256::from_be_hex(id[1].trim_start_matches("0x")))
-        } else {
-            None
-        };
+        let token_id: Option<U256> = balance.token_id
+            .split(':')
+            .nth(1)
+            .map(|id| U256::from_be_hex(id.trim_start_matches("0x")));
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ce8c3f7 and ee66706.

📒 Files selected for processing (1)
  • crates/torii/grpc/src/server/subscriptions/token_balance.rs (3 hunks)
🔇 Additional comments (2)
crates/torii/grpc/src/server/subscriptions/token_balance.rs (2)

170-174: LGTM! Clean handling of optional token ID in filter check.

The filter check correctly handles the optional token ID case while maintaining the existing filtering logic.


182-182: LGTM! Idiomatic handling of optional token ID in response.

The response construction elegantly handles the optional token ID using idiomatic Rust patterns.

Copy link

@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

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ee66706 and 21a9c12.

📒 Files selected for processing (1)
  • crates/torii/grpc/src/server/mod.rs (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: docs
  • GitHub Check: ensure-wasm
  • GitHub Check: build
  • GitHub Check: clippy
🔇 Additional comments (1)
crates/torii/grpc/src/server/mod.rs (1)

130-132:

❓ Verification inconclusive

Ensure consistent token ID handling across the codebase.

The token ID handling in the From implementation doesn't align with the new SQL filtering logic. While the SQL query splits the token ID by colon, this conversion processes the entire token ID as a hex string.

Please verify if the token ID conversion should also consider the colon separator:


🏁 Script executed:

#!/bin/bash
# Description: Search for other token ID processing instances
# to ensure consistent handling

echo "Searching for token_id processing in the codebase..."
rg -A 5 'token_id.*trim_start_matches\("0x"\)' 

Length of output: 1667


Ohayo, sensei! Heads up on token ID consistency.

It appears that both crates/torii/grpc/src/server/mod.rs and crates/torii/grpc/src/server/subscriptions/token.rs use the same token conversion with .trim_start_matches("0x"), which currently does not account for any colon-separated values like those applied in the SQL filtering. This discrepancy might lead to token balance mismatches. Please verify if the conversion logic should also split the token ID by a colon to ensure consistency with the SQL query.

Comment on lines +879 to +880
conditions
.push(format!("SUBSTR(token_id, INSTR(token_id, ':') + 1) IN ({})", placeholders));
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Ohayo sensei! Consider handling cases where token_id doesn't contain a colon.

The current implementation assumes all token IDs contain a colon, but this might not always be true. If a token_id doesn't contain a colon, INSTR(token_id, ':') will return 0, making SUBSTR start from position 1, which could lead to incorrect matches.

Consider using a CASE statement to handle both formats:

-conditions.push(format!("SUBSTR(token_id, INSTR(token_id, ':') + 1) IN ({})", placeholders));
+conditions.push(format!(
+    "CASE 
+        WHEN INSTR(token_id, ':') > 0 THEN SUBSTR(token_id, INSTR(token_id, ':') + 1)
+        ELSE token_id 
+    END IN ({})", 
+    placeholders
+));
📝 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
conditions
.push(format!("SUBSTR(token_id, INSTR(token_id, ':') + 1) IN ({})", placeholders));
conditions
.push(format!(
"CASE
WHEN INSTR(token_id, ':') > 0 THEN SUBSTR(token_id, INSTR(token_id, ':') + 1)
ELSE token_id
END IN ({})",
placeholders
));

@Larkooo Larkooo enabled auto-merge (squash) February 17, 2025 02:17
Copy link

codecov bot commented Feb 17, 2025

Codecov Report

Attention: Patch coverage is 0% with 18 lines in your changes missing coverage. Please review.

Project coverage is 56.20%. Comparing base (ce8c3f7) to head (e718d70).
Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
crates/torii/grpc/src/server/mod.rs 0.00% 9 Missing ⚠️
...rii/grpc/src/server/subscriptions/token_balance.rs 0.00% 9 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main    #3041   +/-   ##
=======================================
  Coverage   56.19%   56.20%           
=======================================
  Files         437      437           
  Lines       58821    58822    +1     
=======================================
+ Hits        33057    33058    +1     
  Misses      25764    25764           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

@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

🧹 Nitpick comments (1)
crates/torii/grpc/src/server/mod.rs (1)

121-138: Ohayo sensei! Consider handling potential hex prefix inconsistencies.

The token ID parsing logic assumes the hex string will have a "0x" prefix, but this might not always be true. Consider normalizing the hex string before parsing.

-                U256::from_be_hex(id[1].trim_start_matches("0x"))
+                U256::from_be_hex(id[1].trim_start_matches("0x").trim_start_matches("0X"))
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3803a03 and 55a7ef5.

📒 Files selected for processing (1)
  • crates/torii/grpc/src/server/mod.rs (4 hunks)
🔇 Additional comments (1)
crates/torii/grpc/src/server/mod.rs (1)

882-884: Ohayo sensei! This SQL query might fail for token IDs without colons.

The current implementation assumes all token IDs contain a colon, but this might not always be true. If a token_id doesn't contain a colon, SUBSTR(token_id, INSTR(token_id, ':') + 1) will return an empty string, which could lead to incorrect matches.

Consider using a CASE statement to handle both formats:

-                .push(format!("SUBSTR(token_id, INSTR(token_id, ':') + 1) IN ({})", placeholders));
+                .push(format!(
+                    "CASE 
+                        WHEN INSTR(token_id, ':') > 0 THEN SUBSTR(token_id, INSTR(token_id, ':') + 1)
+                        ELSE token_id 
+                    END IN ({})", 
+                    placeholders
+                ));

@Larkooo Larkooo merged commit e724b0a into dojoengine:main Feb 17, 2025
14 of 15 checks passed
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