Skip to content

feat: Add comprehensive BONK token support with multi-token swap func…#12502

Merged
faridsalau merged 12 commits into
mainfrom
pr-4-5-6-combined-frontend-updates
Jul 14, 2025
Merged

feat: Add comprehensive BONK token support with multi-token swap func…#12502
faridsalau merged 12 commits into
mainfrom
pr-4-5-6-combined-frontend-updates

Conversation

@faridsalau

@faridsalau faridsalau commented Jul 10, 2025

Copy link
Copy Markdown
Contributor

Overview

This pull request introduces a new generic useTokenBalance hook that can fetch balances for any supported token, replacing token-specific implementations with a more scalable approach. It also refactors existing token management code to use the token registry system for better maintainability.

Key Changes

New Generic Token Balance Hook

  • Added useTokenBalance hook (packages/common/src/api/tan-query/wallets/useTokenBalance.ts)
    • Generic hook that works with any token supported by the token registry (wAUDIO, USDC, BONK)
    • Uses FixedDecimal constructor with dynamic decimal places from token registry
    • Properly handles null/undefined values vs actual zero balances
    • Follows TanStack Query patterns with proper query keys and caching
    • Includes polling support and error handling

Token Registry Integration

  • Enhanced AudiusBackend (packages/common/src/services/audius-backend/AudiusBackend.ts)
    • Replaced hardcoded ternary logic for mint addresses with generic getMintAddress function
    • Uses token registry to dynamically resolve mint addresses for any supported token
    • Eliminates need for expanding ternary operators when adding new tokens

Jupiter Integration Improvements

  • Updated Jupiter constants (packages/common/src/api/tan-query/jupiter/constants.ts)
    • Refactored createUserBankManagedTokens to use token registry instead of hardcoded mappings
    • Added support for BONK token in user bank managed tokens
    • Dynamic token discovery based on registry configuration

Buy/Sell Flow Enhancements

  • Improved buy/sell swap logic (packages/common/src/store/ui/buy-sell/useBuySellSwap.ts)

    • Updated to work with dynamic token pairs instead of hardcoded AUDIO/USDC
    • Added proper token balance invalidation for the new generic hook
    • Enhanced error handling and retry logic
  • Dynamic token constants (packages/common/src/store/ui/buy-sell/constants.ts)

    • Replaced hardcoded token definitions with registry-based approach
    • Added caching for token pairs to improve performance
    • Support for generating all possible trading pairs from registry

Type System Updates

  • Extended MintName type (packages/common/src/services/audius-backend/solana.ts)

    • Added BONK support to MintName type
    • Updated ClaimableTokenMint type in Jupiter types
  • Enhanced token types (packages/common/src/store/ui/buy-sell/types.ts)

    • Added BONK to TokenType union

Query Infrastructure

  • Added tokenBalance to query keys (packages/common/src/api/tan-query/queryKeys.ts)

    • Proper query key management following established patterns
  • Exported new hook (packages/common/src/api/index.ts)

    • Made useTokenBalance available for consumption

Technical Improvements

Better Null Handling

  • Distinguishes between "no balance information" (null) and "actual zero balance" (FixedDecimal(0))
  • Uses helper function createTokenBalance to avoid complex ternary logic

Scalable Architecture

  • Adding new tokens now only requires updating the token registry
  • No need to modify multiple files with hardcoded token logic
  • Consistent decimal place handling across all tokens

Performance Optimizations

  • Added caching for token pairs to avoid repeated computation
  • Efficient lookup maps in token registry
  • Proper query invalidation strategies

How Has This Been Tested?

npm run web:prod and go to buy/sell flow

…tionality

This combined PR includes all frontend, API, and core logic updates needed for
BONK token support and dynamic token swapping. Originally planned as separate
PRs 4, 5, and 6, but combined due to tight coupling between components.

## Core Logic Updates (PR 4 scope):
- Update buy/sell constants and types for dynamic token pairs
- Enhance useBuySellSwap hook with selectedPair support
- Add token amount formatting for multiple tokens
- Update AudiusBackend and Solana services for BONK support
- Add decimal utility functions for token calculations

## API & Jupiter Integration (PR 5 scope):
- Add Jupiter API constants, types, and utilities
- Implement useTokenBalance hook for multi-token support
- Update API index with new token balance exports

## Frontend UI Updates (PR 6 scope):
- Update mobile BuySellFlow and ConfirmSwapScreen for dynamic tokens
- Update web buy-sell modal components (BuyTab, SellTab, SwapTab)
- Add TokenAmountSection component updates
- Update buy-sell modal constants for new token support

## SDK & Dependencies:
- Add BONK support to SDK configurations (dev/prod/stage)
- Update ClaimableTokensClient for BONK token handling
- Add mintFixedDecimalMap utilities
- Update fixed-decimal package to export BONK currency

## Key Features:
- Dynamic token pair creation using environment configuration
- Support for AUDIO/USDC, AUDIO/BONK, and USDC/BONK pairs
- Comprehensive error handling and validation
- Mobile and web UI consistency
- Type-safe token operations throughout

Depends on: PR 1 (token registry infrastructure) being merged first.
Related to: PR 2 (backend/SDK support) - some files overlap for completeness.
@changeset-bot

changeset-bot Bot commented Jul 10, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 50fbf27

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@gitguardian

gitguardian Bot commented Jul 10, 2025

Copy link
Copy Markdown

⚠️ GitGuardian has uncovered 2 secrets following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secrets in your pull request
GitGuardian id GitGuardian status Secret Commit Filename
9412812 Triggered Generic Password 71fdbc2 packages/discovery-provider/ddl/local-test-replicas.sh View secret
18250942 Triggered Generic High Entropy Secret 9c4a513 packages/sdk/src/sdk/config/development.ts View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secrets safely. Learn here the best practices.
  3. Revoke and rotate these secrets.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@faridsalau
faridsalau marked this pull request as ready for review July 11, 2025 14:34
cursor[bot]

This comment was marked as outdated.

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Redundant Conversion in Token Balance Handling

The tokenBalanceData returned by useTokenBalance is already a FixedDecimal object. In both BuyTab.tsx and SellTab.tsx, the code Number(new FixedDecimal(tokenBalanceData.toString())) performs a redundant conversion of this FixedDecimal to a string and then back to a new FixedDecimal. This unnecessary double conversion is inefficient and can lead to precision loss. The conversion should be simplified to Number(tokenBalanceData.toString()) or tokenBalanceData.toNumber().

packages/web/src/components/buy-sell-modal/BuyTab.tsx#L60-L61

https://github.com/AudiusProject/audius-protocol/blob/50fbf27745944efd50d3f891a6364d3e12968b9f/packages/web/src/components/buy-sell-modal/BuyTab.tsx#L60-L61

packages/web/src/components/buy-sell-modal/SellTab.tsx#L65-L66

https://github.com/AudiusProject/audius-protocol/blob/50fbf27745944efd50d3f891a6364d3e12968b9f/packages/web/src/components/buy-sell-modal/SellTab.tsx#L65-L66

Fix in CursorFix in Web


Bug: Token Dropdown Filters Incorrectly Inverted

The token filtering logic for availableInputTokens and availableOutputTokens in the Buy and Sell tabs is incorrect. For the input token dropdown, the current implementation filters out the output token instead of the input token. Similarly, for the output token dropdown, it filters out the input token instead of the output token. This inversion applies to both Buy and Sell tabs.

packages/web/src/components/buy-sell-modal/BuySellFlow.tsx#L354-L378

https://github.com/AudiusProject/audius-protocol/blob/50fbf27745944efd50d3f891a6364d3e12968b9f/packages/web/src/components/buy-sell-modal/BuySellFlow.tsx#L354-L378

Fix in CursorFix in Web


Was this report helpful? Give feedback by reacting with 👍 or 👎

import { UserBankManagedTokenInfo } from './types'

const CLAIMABLE_TOKEN_MINTS = ['wAUDIO', 'USDC', 'BONK'] as const
type ClaimableTokenMint = (typeof CLAIMABLE_TOKEN_MINTS)[number]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

whoa cool

// Convert registry tokens to UserBankManagedTokenInfo format
userbankTokens.forEach((token: TokenConfig) => {
if (isClaimableTokenMint(token.symbol)) {
managedTokens[token.address.toUpperCase()] = {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

i think solana addresses are case sensitive?

// TanStack Query's built-in polling - only poll when isPolling is true
refetchInterval: isPolling ? pollingInterval : false,
// Prevent refetching when window regains focus during polling to avoid conflicts
refetchOnWindowFocus: !isPolling,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

smart

...queryOptions
})

// Map TanStack Query states to the Status enum for API compatibility

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

damn is this another migration we need to do

import { QUERY_KEYS } from '../queryKeys'
import { QueryOptions, type QueryKey } from '../types'

const createTokenBalance = (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: is this rly the cleanest way? can we not do something like:

return !!amount ? new FixedDecimal(BigInt(amount.toString()), decimals) : null

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

idk i guess that's kind of annoying too..

@@ -89,7 +88,7 @@ const StackedBalanceSection = ({
</Text>
</Flex>
{/* We need the border radius to be circle here because the AUDIO icon is a square image */}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: comment still says circle

@dharit-tan dharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

seems good but check out the solana case-sensitive bit

@faridsalau
faridsalau merged commit 28adbeb into main Jul 14, 2025
11 checks passed
@faridsalau
faridsalau deleted the pr-4-5-6-combined-frontend-updates branch July 14, 2025 09:13
audius-infra pushed a commit that referenced this pull request Jul 19, 2025
[280d9db] Add track tile carousel skeleton and fix width (#12565) Isaac Solo
[5dd5f50] Search/explore mobile web pass  (#12562) Isaac Solo
[b49cb22] [PE-6505] Update in-app notif navigation for comments to highlight comment (#12554) KJ
[cad4bfc] [PE-6509] Add web coin leaderboard modal (#12556) Dylan Jeffers
[308a773] Fix setting USDC payout wallet (#12563) Marcus Pasell
[3c174c1] [PE-6539] Fix artist coin badge showing when 0 balance (#12560) Reed
[0d0c089] [PE-6530] Conditionally show chat message artist coin header (#12559) Reed
[179b457] Update eth rpc urls (#12552) KJ
[bd3f3cf] Fix mobile image fallback logic (#12549) Ray Jacobson
[1a752dd] Speed up mobile app warm start by another ~75% (#12555) JD Francis
[a96174d] [QA-2220] Fix mobile user-links with badge-v2 (#12557) Dylan Jeffers
[e9c0c3d] Add msw for coin endpoints (#12551) Dylan Jeffers
[3dcf5d3] Fix styling for chat message unfurls (#12550) KJ
[b343ac0] Add asset detail pages  (#12430) Farid Salau
[5d6c245] Add non-native conversion to buy/sell modal (#12536) Farid Salau
[4c09e50] [PE-6537] Add comment_id to notification action data (#12548) Dylan Jeffers
[013f7f5] [PE-6524] Add scroll to comment section on comment link (#12545) KJ
[69f3ca0] [PE-6519] Send artist coin holder blast UI (#12538) Reed
[cfd654e] Fix misc mobile tile layout issues (#12542) JD Francis
[bee3f90] [PE-6516] YourCoins supports BONK on web (#12528) Reed
[2e51d03] [QA-2218] Fix artist popover badge (#12543) Ray Jacobson
[cabbd73] [PE-2215] Adjust share button size (#12533) Dylan Jeffers
[99238c5] Add feature flag to search explore milestone and optimize search fetches (#12541) Isaac Solo
[6f3a511] [PE-6502, PE-6504] Add comment highlighting for mobile (#12540) KJ
[ba3fcd0] [QA-2212] Improve bottom bar haptics (#12535) Dylan Jeffers
[3f1758e] [QA-2223] Fix ActionDrawer text color in dark mode (#12537) KJ
[a018dd1] Mobile web search explore fixes (#12534) Isaac Solo
[b3474b2] Improve mobile app refocus rerenders (#12532) JD Francis
[72c05be] Mobile web top right menu (#12521) Reed
[6c45c92] [PE-6515] Border for hex token icons (#12526) Reed
[2a762b4] Clicking on token badges shows hover card too (#12527) Reed
[d07fbb0] [PE-6420] Improve useCurrentAccount local-storage perf (#12524) Dylan Jeffers
[fd8574f] Add examples to @packages/fixed-decimal (#12531) Ray Jacobson
[e34f4bf] Aggregate AUDIO amount for X shares (#12530) Dylan Jeffers
[81b1709] Fix incorrect comment display (#12529) KJ
[d74a7bf] Fix TOKEN_ACCOUNT_NOT_FOUND events (#12523) Dylan Jeffers
[0467b88] [PE-6500] Add timezone to remix contest details (#12515) Dylan Jeffers
[df4e489] Add feeling lucky, recently played, active discussions explore sections (#12498) Isaac Solo
[923f09a] useTokenBalance with fake amounts (#12525) Reed
[28adbeb] feat: Add comprehensive BONK token support with multi-token swap func… (#12502) Farid Salau
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants