Skip to content

Comments

Removed fee UI info and fixed native swap with fee#370

Merged
RanaBug merged 2 commits intostagingfrom
feat/PRO-3384/fee-capure-the-exchange
Jul 15, 2025
Merged

Removed fee UI info and fixed native swap with fee#370
RanaBug merged 2 commits intostagingfrom
feat/PRO-3384/fee-capure-the-exchange

Conversation

@RanaBug
Copy link
Collaborator

@RanaBug RanaBug commented Jul 15, 2025

Description

  • Removed fee UI information display
  • Fix native swaps with capturing fee

How Has This Been Tested?

  • Existing Unit Tests and manual testing

Screenshots (if appropriate):

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Summary by CodeRabbit

  • Bug Fixes

    • Removed all fee estimation and display features from the exchange interface.
    • The UI no longer shows swap fee information under the "You receive" section.
  • Refactor

    • Simplified transaction preparation by removing fee-specific logic.
    • Improved balance validation and error handling for swap transactions.
    • Enhanced fee calculation and approval logic with clearer token-type distinctions.
  • Tests

    • Deleted tests related to fee information display.
    • Updated error handling tests to match new error messages.
  • New Features

    • Added utilities for extracting token and native balances from user portfolios and converting amounts to smallest units.

@RanaBug RanaBug requested a review from IAmKio July 15, 2025 13:57
@RanaBug RanaBug self-assigned this Jul 15, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 15, 2025

Walkthrough

This change removes all fee estimation, calculation, and display logic from the ExchangeAction component and its tests. It refactors transaction preparation to use the user's portfolio instead of a cached native balance. Supporting utility functions for extracting balances from the portfolio are added, and the getStepTransactions function is updated to handle balances and fees based on the user's portfolio.

Changes

File(s) Change Summary
src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx Removed all fee info logic, UI, and related imports; refactored to use portfolio tokens for transaction preparation.
src/apps/the-exchange/components/ExchangeAction/test/ExchangeAction.test.tsx Deleted all fee display tests; updated error test to match new error text and interaction pattern.
src/apps/the-exchange/hooks/useOffer.tsx Refactored getStepTransactions to use user portfolio for balance checks and fee logic; improved error propagation.
src/apps/the-exchange/utils/blockchain.ts Added utility functions for extracting token/native balances from portfolio and converting to wei.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ExchangeAction
    participant useOffer
    participant BlockchainUtils

    User->>ExchangeAction: Click "Exchange"
    ExchangeAction->>useOffer: getStepTransactions(token, route, account, portfolio)
    useOffer->>BlockchainUtils: getTokenBalanceFromPortfolio / getNativeBalanceFromPortfolio
    BlockchainUtils-->>useOffer: Return balances
    useOffer-->>ExchangeAction: Return prepared transactions or error
    ExchangeAction-->>User: Show result or error message
Loading

Possibly related PRs

Suggested reviewers

  • IAmKio

Poem

A carrot for code, a hop for delight,
The fees have all vanished, gone out of sight!
Now swaps are much simpler, with tokens in tow,
Through portfolios we wander, with balances in flow.
🥕 No more fee fuss, just swift rabbit cheer—
Exchange with a wiggle, your tokens are here!

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

npm error Exit handler never called!
npm error This is an error with npm itself. Please report this error at:
npm error https://github.com/npm/cli/issues
npm error A complete log of this run can be found in: /.npm/_logs/2025-07-15T15_49_12_388Z-debug-0.log

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

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Jul 15, 2025

Deploying x with  Cloudflare Pages  Cloudflare Pages

Latest commit: 4760f9f
Status: ✅  Deploy successful!
Preview URL: https://90df8ae8.x-e62.pages.dev
Branch Preview URL: https://feat-pro-3384-fee-capure-the.x-e62.pages.dev

View logs

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/apps/the-exchange/components/ExchangeAction/test/ExchangeAction.test.tsx (1)

241-241: Remove debug statement before merging.

The screen.debug() call should be removed as it's typically used only during test development.

-    screen.debug();
src/apps/the-exchange/hooks/useOffer.tsx (1)

333-334: Consider using optional chaining for cleaner code.

The static analysis tool correctly identifies an opportunity to use optional chaining here.

-        if (nativeFeeRoute && nativeFeeRoute.toAmount) {
+        if (nativeFeeRoute?.toAmount) {
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8a25e4e and 2b59a29.

📒 Files selected for processing (4)
  • src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx (4 hunks)
  • src/apps/the-exchange/components/ExchangeAction/test/ExchangeAction.test.tsx (1 hunks)
  • src/apps/the-exchange/hooks/useOffer.tsx (8 hunks)
  • src/apps/the-exchange/utils/blockchain.ts (2 hunks)
🧰 Additional context used
🧠 Learnings (4)
src/apps/the-exchange/utils/blockchain.ts (1)
Learnt from: RanaBug
PR: pillarwallet/x#275
File: src/apps/the-exchange/components/DropdownTokensList/DropdownTokenList.tsx:180-195
Timestamp: 2025-03-28T09:22:22.712Z
Learning: In the Exchange app, `swapTokenList` and `receiveTokenList` are derived from `searchTokenResult` when search is active, so including `searchToken` in the useEffect dependency array that uses these lists would be redundant as the lists will update when search results change.
src/apps/the-exchange/components/ExchangeAction/test/ExchangeAction.test.tsx (1)
Learnt from: RanaBug
PR: pillarwallet/x#275
File: src/apps/the-exchange/components/DropdownTokensList/DropdownTokenList.tsx:180-195
Timestamp: 2025-03-28T09:22:22.712Z
Learning: In the Exchange app, `swapTokenList` and `receiveTokenList` are derived from `searchTokenResult` when search is active, so including `searchToken` in the useEffect dependency array that uses these lists would be redundant as the lists will update when search results change.
src/apps/the-exchange/hooks/useOffer.tsx (2)
Learnt from: RanaBug
PR: pillarwallet/x#275
File: src/apps/the-exchange/components/DropdownTokensList/DropdownTokenList.tsx:180-195
Timestamp: 2025-03-28T09:22:22.712Z
Learning: In the Exchange app, `swapTokenList` and `receiveTokenList` are derived from `searchTokenResult` when search is active, so including `searchToken` in the useEffect dependency array that uses these lists would be redundant as the lists will update when search results change.
Learnt from: RanaBug
PR: pillarwallet/x#334
File: src/apps/leaderboard/utils/index.tsx:91-94
Timestamp: 2025-06-17T09:20:44.533Z
Learning: In src/apps/leaderboard/utils/index.tsx, the getLastWeekMigrationData function intentionally uses currentWeek (not lastWeek) for the completedSwapWeek lookup. This is correct business logic - when retrieving last week's migration data, the function should check swap completion against the current week while using lastWeek for points and USD calculations.
src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx (1)
Learnt from: RanaBug
PR: pillarwallet/x#275
File: src/apps/the-exchange/components/DropdownTokensList/DropdownTokenList.tsx:180-195
Timestamp: 2025-03-28T09:22:22.712Z
Learning: In the Exchange app, `swapTokenList` and `receiveTokenList` are derived from `searchTokenResult` when search is active, so including `searchToken` in the useEffect dependency array that uses these lists would be redundant as the lists will update when search results change.
🧬 Code Graph Analysis (2)
src/apps/the-exchange/utils/blockchain.ts (2)
src/services/tokensData.ts (2)
  • Token (19-29)
  • chainNameToChainIdTokensData (234-255)
src/apps/the-exchange/utils/wrappedTokens.ts (1)
  • isNativeToken (30-31)
src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx (1)
src/services/tokensData.ts (1)
  • convertPortfolioAPIResponseToToken (97-121)
🪛 Biome (1.9.4)
src/apps/the-exchange/hooks/useOffer.tsx

[error] 333-333: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: lint
  • GitHub Check: unit-tests
  • GitHub Check: build
🔇 Additional comments (8)
src/apps/the-exchange/utils/blockchain.ts (3)

103-115: LGTM!

The function correctly retrieves token balance from the portfolio by matching contract address and chain ID. The case-insensitive comparison and proper string conversion are implemented correctly.


118-120: LGTM!

The utility correctly converts amounts to wei using viem's parseUnits with proper type handling.


123-135: LGTM!

The function correctly identifies and retrieves native token balance using the isNativeToken utility.

src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx (2)

101-110: LGTM!

The portfolio conversion is implemented correctly, using the appropriate utility function and handling the undefined case properly.


159-161: Good improvement to error handling.

Moving setIsAddingToBatch(false) to the finally block ensures the loading state is always cleared, even if an error occurs.

src/apps/the-exchange/hooks/useOffer.tsx (3)

248-268: LGTM!

The balance sufficiency checks correctly calculate required amounts for both native and ERC20 tokens, with clear error messages for insufficient balances.


393-416: Good improvement to approval logic.

The updated logic correctly skips approval checks for native tokens, which never require allowance. This prevents unnecessary blockchain calls and improves efficiency.


497-498: Good improvement to error handling.

Re-throwing the error allows the UI to handle it properly, which aligns with the error handling in the ExchangeAction component.

Comment on lines 235 to 243
if (!userSelectedNative) {
const tokenBalance =
getTokenBalanceFromPortfolio(
userPortfolio,
tokenToSwap.contract,
fromTokenChainId
) || '0';
userTokenBalance = BigInt(tokenBalance);
}
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 incorrect token balance conversion.

The token balance is being converted directly to BigInt without considering the token's decimals. This will cause incorrect balance comparisons for tokens with decimals.

-        userTokenBalance = BigInt(tokenBalance);
+        userTokenBalance = toWei(tokenBalance, tokenToSwap.decimals);
📝 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
if (!userSelectedNative) {
const tokenBalance =
getTokenBalanceFromPortfolio(
userPortfolio,
tokenToSwap.contract,
fromTokenChainId
) || '0';
userTokenBalance = BigInt(tokenBalance);
}
if (!userSelectedNative) {
const tokenBalance =
getTokenBalanceFromPortfolio(
userPortfolio,
tokenToSwap.contract,
fromTokenChainId
) || '0';
userTokenBalance = toWei(tokenBalance, tokenToSwap.decimals);
}
🤖 Prompt for AI Agents
In src/apps/the-exchange/hooks/useOffer.tsx between lines 235 and 243, the token
balance string is converted directly to BigInt without adjusting for the token's
decimals, leading to incorrect balance values. To fix this, parse the token
balance as a decimal number and scale it appropriately by the token's decimals
before converting to BigInt, ensuring accurate balance representation for tokens
with decimals.

Copy link
Collaborator

@IAmKio IAmKio left a comment

Choose a reason for hiding this comment

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

LGTM!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/apps/the-exchange/hooks/useOffer.tsx (1)

324-324: Apply optional chaining for safer property access.

The static analysis tool correctly identified that optional chaining should be used here for safer property access.

-        if (nativeFeeRoute && nativeFeeRoute.toAmount) {
+        if (nativeFeeRoute?.toAmount) {
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 2b59a29 and 4760f9f.

📒 Files selected for processing (2)
  • src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx (4 hunks)
  • src/apps/the-exchange/hooks/useOffer.tsx (8 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/apps/the-exchange/components/ExchangeAction/ExchangeAction.tsx
🧰 Additional context used
🧠 Learnings (1)
src/apps/the-exchange/hooks/useOffer.tsx (2)
Learnt from: RanaBug
PR: pillarwallet/x#275
File: src/apps/the-exchange/components/DropdownTokensList/DropdownTokenList.tsx:180-195
Timestamp: 2025-03-28T09:22:22.712Z
Learning: In the Exchange app, `swapTokenList` and `receiveTokenList` are derived from `searchTokenResult` when search is active, so including `searchToken` in the useEffect dependency array that uses these lists would be redundant as the lists will update when search results change.
Learnt from: RanaBug
PR: pillarwallet/x#334
File: src/apps/leaderboard/utils/index.tsx:91-94
Timestamp: 2025-06-17T09:20:44.533Z
Learning: In src/apps/leaderboard/utils/index.tsx, the getLastWeekMigrationData function intentionally uses currentWeek (not lastWeek) for the completedSwapWeek lookup. This is correct business logic - when retrieving last week's migration data, the function should check swap completion against the current week while using lastWeek for points and USD calculations.
🪛 Biome (1.9.4)
src/apps/the-exchange/hooks/useOffer.tsx

[error] 324-324: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: unit-tests
  • GitHub Check: lint
  • GitHub Check: build
🔇 Additional comments (8)
src/apps/the-exchange/hooks/useOffer.tsx (8)

31-36: Import additions look good.

The new utility functions imported from blockchain utils will support the enhanced balance and fee calculations implemented in this hook.


194-195: Function signature change improves precision.

The updated signature now accepts the full user portfolio and original input amount, enabling more accurate fee calculations and balance validations compared to the previous cached native balance approach.


206-210: Proper decimal handling for amount conversion.

The conversion now correctly uses parseUnits with the token's decimal places, addressing the previous issue where token balances were converted directly to BigInt without considering decimals.


215-230: Enhanced token type detection improves fee logic.

The explicit categorization of token types (native, wrapped, stablecoin) provides better clarity for fee calculation logic and reduces ambiguity in the fee handling process.


267-353: Fee step logic is comprehensive and well-structured.

The fee calculation logic properly handles different token types with appropriate fee payment methods. The native fee estimation for non-stable ERC20 tokens includes a reasonable 1% buffer for slippage.


373-377: Wrapping logic correctly uses route amounts.

The wrapping step properly uses the route's fromAmount for the deposit transaction, maintaining consistency with the routing logic.


383-407: Approval logic correctly excludes native tokens.

The refined approval logic properly distinguishes between native and ERC20 tokens, correctly skipping allowance checks for native tokens while maintaining proper approval flow for ERC20 tokens.


489-489: Error re-throwing enables proper UI handling.

Re-throwing errors after logging allows the UI layer to handle errors appropriately, which aligns with the PR objective of removing fee display logic from the UI components.

Comment on lines +232 to +259
// --- BALANCE CHECKS ---
// For native: need enough for swap + fee
// For ERC20: need enough ERC20 for swap
let userNativeBalance = BigInt(0);
try {
// Get native balance from portfolio
const nativeBalance =
getNativeBalanceFromPortfolio(userPortfolio, fromTokenChainId) || '0';
userNativeBalance = toWei(nativeBalance, 18);
} catch (e) {
throw new Error('Unable to fetch balances for swap.');
}

// Calculate total required
let totalNativeRequired = BigInt(0);
if (userSelectedNative) {
// Native: swap amount + fee
// Use fromAmountBigInt for total required
totalNativeRequired = fromAmountBigInt;
if (isWrapRequired) {
totalNativeRequired += fromAmountBigInt - feeAmount; // wrapping step uses swap amount
}
if (userNativeBalance < totalNativeRequired) {
throw new Error(
'Insufficient native token balance to cover swap and fee.'
);
}
}
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

Balance validation logic needs refinement.

The balance checking logic has an issue with ERC20 token validation. For non-native tokens, you're only checking native balance but not validating if the user has sufficient ERC20 tokens for the swap.

Add ERC20 token balance validation:

    // Calculate total required
    let totalNativeRequired = BigInt(0);
    if (userSelectedNative) {
      // Native: swap amount + fee
      // Use fromAmountBigInt for total required
      totalNativeRequired = fromAmountBigInt;
      if (isWrapRequired) {
        totalNativeRequired += fromAmountBigInt - feeAmount; // wrapping step uses swap amount
      }
      if (userNativeBalance < totalNativeRequired) {
        throw new Error(
          'Insufficient native token balance to cover swap and fee.'
        );
      }
+    } else {
+      // ERC20 tokens: check if user has enough ERC20 tokens for swap
+      const tokenBalance = getTokenBalanceFromPortfolio(userPortfolio, tokenToSwap.contract, fromTokenChainId) || '0';
+      const userTokenBalance = toWei(tokenBalance, tokenToSwap.decimals);
+      if (userTokenBalance < fromAmountBigInt) {
+        throw new Error('Insufficient token balance for swap.');
+      }
    }
📝 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
// --- BALANCE CHECKS ---
// For native: need enough for swap + fee
// For ERC20: need enough ERC20 for swap
let userNativeBalance = BigInt(0);
try {
// Get native balance from portfolio
const nativeBalance =
getNativeBalanceFromPortfolio(userPortfolio, fromTokenChainId) || '0';
userNativeBalance = toWei(nativeBalance, 18);
} catch (e) {
throw new Error('Unable to fetch balances for swap.');
}
// Calculate total required
let totalNativeRequired = BigInt(0);
if (userSelectedNative) {
// Native: swap amount + fee
// Use fromAmountBigInt for total required
totalNativeRequired = fromAmountBigInt;
if (isWrapRequired) {
totalNativeRequired += fromAmountBigInt - feeAmount; // wrapping step uses swap amount
}
if (userNativeBalance < totalNativeRequired) {
throw new Error(
'Insufficient native token balance to cover swap and fee.'
);
}
}
// Calculate total required
let totalNativeRequired = BigInt(0);
if (userSelectedNative) {
// Native: swap amount + fee
// Use fromAmountBigInt for total required
totalNativeRequired = fromAmountBigInt;
if (isWrapRequired) {
totalNativeRequired += fromAmountBigInt - feeAmount; // wrapping step uses swap amount
}
if (userNativeBalance < totalNativeRequired) {
throw new Error(
'Insufficient native token balance to cover swap and fee.'
);
}
} else {
// ERC20 tokens: check if user has enough ERC20 tokens for swap
const tokenBalance = getTokenBalanceFromPortfolio(
userPortfolio,
tokenToSwap.contract,
fromTokenChainId
) || '0';
const userTokenBalance = toWei(tokenBalance, tokenToSwap.decimals);
if (userTokenBalance < fromAmountBigInt) {
throw new Error('Insufficient token balance for swap.');
}
}
🤖 Prompt for AI Agents
In src/apps/the-exchange/hooks/useOffer.tsx around lines 232 to 259, the current
balance check only validates native token balances but does not verify if the
user has enough ERC20 tokens for the swap. To fix this, add logic to fetch the
user's ERC20 token balance from their portfolio and compare it against the
required swap amount. If the ERC20 balance is insufficient, throw an error
indicating the user lacks enough ERC20 tokens for the swap.

Copy link
Collaborator

@IAmKio IAmKio left a comment

Choose a reason for hiding this comment

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

LGTM

@RanaBug RanaBug merged commit e7ccd4a into staging Jul 15, 2025
6 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Aug 7, 2025
3 tasks
@coderabbitai coderabbitai bot mentioned this pull request Oct 8, 2025
3 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