Skip to content

fix: replace token properly after config update#270

Merged
pauldelucia merged 1 commit into
v0.9-devfrom
fix/replace-token-after-config-update
May 19, 2025
Merged

fix: replace token properly after config update#270
pauldelucia merged 1 commit into
v0.9-devfrom
fix/replace-token-after-config-update

Conversation

@pauldelucia
Copy link
Copy Markdown
Member

@pauldelucia pauldelucia commented May 13, 2025

We were replacing the contract from the local DB after config update, which used to replace tokens too, but not anymore, so now we replace the tokens too.

Summary by CodeRabbit

  • New Features

    • Added the ability to remove tokens from the local database.
  • Bug Fixes

    • Improved synchronization of token information between the local database and the platform, ensuring updates are accurately reflected.
  • Other

    • Enhanced error handling for database operations related to token updates.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 13, 2025

Walkthrough

The updates introduce a new public method, remove_token, to the AppContext struct for token removal by ID. The update_token_config method is enhanced to fetch updated token data from the platform, replace the contract, remove the old token, and insert the updated token into the local database, with improved error handling and updated imports.

Changes

File(s) Change Summary
src/context.rs Added a new public method remove_token to AppContext, delegating token removal to the database layer.
src/backend_task/tokens/update_token_config.rs Enhanced update_token_config to fetch updated token data, replace contract, remove old token, insert updated token, and improved error handling and comments. Updated imports.

Poem

In the warren of code, a token hops free,
With a new remove method, as swift as can be.
Contracts refreshed, old tokens replaced,
Errors now handled, no step misplaced.
The database garden, so tidy and neat—
Every update a carrot-flavored treat! 🥕

Note

⚡️ AI Code Reviews for VS Code, Cursor, Windsurf

CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
Learn more here.


Note

⚡️ Faster reviews with caching

CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure Review - Disable Cache at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the Data Retention setting under your Organization Settings.
Enjoy the performance boost—your workflow just got faster.

✨ Finishing Touches
  • 📝 Generate Docstrings

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

❤️ Share
🪧 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.
    • Explain this complex logic.
    • 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 explain this code block.
    • @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 explain its main purpose.
    • @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.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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.
  • @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 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.

Copy link
Copy Markdown
Contributor

@lklimek lklimek left a comment

Choose a reason for hiding this comment

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

@coderabbitai review

@lklimek lklimek assigned pauldelucia and unassigned lklimek May 15, 2025
@lklimek
Copy link
Copy Markdown
Contributor

lklimek commented May 15, 2025

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 15, 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
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

🔭 Outside diff range comments (1)
src/backend_task/tokens/update_token_config.rs (1)

110-161: 💡 Verification agent

❓ Verification inconclusive

Make contract replacement + token update atomic to avoid partial DB state

The sequence
replace_contract → remove_token → insert_token
spans three independent writes. If the process crashes or any step errors, the local DB can become inconsistent:

  • contract updated but old token still present (if remove_token fails);
  • token deleted with no replacement (if insert_token fails);
  • token definition updated while contract is still old (if replace_contract fails after the deletion in a future refactor).

Wrapping the three statements in a single SQL transaction eliminates the risk:

- // Then replace the contract in the local database
- self.replace_contract(...)?;
- self.remove_token(...)?;
- self.insert_token(...)?;
+ self.db.with_transaction(|tx, ctx| {
+     ctx.replace_contract_tx(tx, contract_id, &data_contract)?;
+     ctx.remove_token_tx(tx, &identity_token_balance.token_id)?;
+     ctx.insert_token_tx(
+         tx,
+         &identity_token_balance.token_id,
+         &identity_token_balance.token_alias,
+         token.clone(),
+         &identity_token_balance.data_contract_id,
+         identity_token_balance.token_position,
+     )
+ })

(Names *_tx are illustrative; adapt to your DB helper API).

Additionally, you reuse identity_token_balance.token_id when reinserting. If the token ID were changed by the config update (unlikely but possible if the token list was recreated), this would re-insert stale data. Consider pulling the ID from token.id() (if available) or at least assert equality and surface a clear error when they differ.


Wrap contract replacement and token updates in a single transaction

Performing replace_contract, remove_token, and insert_token as three separate calls can leave the database in an inconsistent state if one of them fails. Wrap these operations in your DB crate’s transaction API so that either all three succeed or none are applied. For example, in src/backend_task/tokens/update_token_config.rs around lines 110–161:

- // Then replace the contract in the local database
- self.replace_contract(identity_token_balance.data_contract_id, &data_contract)?
-     .map_err(|e| format!("Error replacing contract: {}", e))?;
-
- self.remove_token(&identity_token_balance.token_id)?
-     .map_err(|e| format!("Error removing token: {}", e))?;
-
- self.insert_token(
-     &identity_token_balance.token_id,
-     &identity_token_balance.token_alias,
-     token.clone(),
-     &identity_token_balance.data_contract_id,
-     identity_token_balance.token_position,
- )?
-     .map_err(|e| format!("Error inserting token: {}", e))?;
+ // Atomically replace the contract and update the token
+ self.db.transaction::<_, _, _>(|tx| {
+     tx.replace_contract_tx(identity_token_balance.data_contract_id, &data_contract)?;
+     tx.remove_token_tx(&identity_token_balance.token_id)?;
+     tx.insert_token_tx(
+         &identity_token_balance.token_id,
+         &identity_token_balance.token_alias,
+         token.clone(),
+         &identity_token_balance.data_contract_id,
+         identity_token_balance.token_position,
+     )?;
+     Ok(())
+ })?;

Additionally, rather than reusing the old identity_token_balance.token_id, consider pulling the ID from the freshly fetched token (e.g. token.id()) or assert that they match, so you never insert a stale identifier when the platform’s token list has been modified.

🧹 Nitpick comments (1)
src/context.rs (1)

668-670: Consider transactional removal and clearer naming for newly-added remove_token

The helper simply delegates to the DB layer, which is fine, but:

  1. Removing a token is often followed by inserting a replacement (see update_token_config). If the later insert fails, the token will be permanently missing. Exposing a DB-level transaction (or accepting a &rusqlite::Transaction) would allow callers to make the whole “remove → insert” sequence atomic.
  2. The crate already exposes remove_token_balance; adding another public remove_token with a different semantic can be confusing. A more explicit name such as delete_token_by_id (or purge_token_definition) would make intent unmistakable.

Neither point is blocking, but addressing them will strengthen consistency and failure-safety.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge Base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between 1b8fb0f and 1f26902.

📒 Files selected for processing (2)
  • src/backend_task/tokens/update_token_config.rs (3 hunks)
  • src/context.rs (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/context.rs (1)
src/database/tokens.rs (1)
  • remove_token (318-332)

@pauldelucia pauldelucia merged commit 2f2ba86 into v0.9-dev May 19, 2025
1 check passed
@pauldelucia pauldelucia deleted the fix/replace-token-after-config-update branch May 19, 2025 05:43
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