-
Notifications
You must be signed in to change notification settings - Fork 24
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
feat: SPL token balances #204
Conversation
📝 WalkthroughWalkthroughThe changes in this pull request enhance the Changes
Possibly related issues
Possibly related PRs
Suggested reviewers
📜 Recent review detailsConfiguration used: .coderabbit.yaml ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (1)
🔇 Additional comments (1)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this 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
🧹 Outside diff range and nitpick comments (1)
packages/client/src/getBalances.ts (1)
360-360
: Simplify conditional check using optional chainingThe condition
if (r.result && r.result.value && r.result.value.length > 0)
can be simplified using optional chaining for better readability.Suggested code change:
- if (r.result && r.result.value && r.result.value.length > 0) { + if (r.result?.value?.length > 0) {🧰 Tools
🪛 Biome (1.9.4)
[error] 360-360: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
packages/client/src/getBalances.ts
(2 hunks)packages/tasks/src/balances.ts
(1 hunks)
🧰 Additional context used
🪛 Biome (1.9.4)
packages/client/src/getBalances.ts
[error] 360-360: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
🔇 Additional comments (1)
packages/tasks/src/balances.ts (1)
115-115
: Output formatting enhancement approved
The formatting changes improve the readability of the address outputs and provide clear separation between different address types.
@zeta-chain/fullstack please, review. |
packages/client/src/getBalances.ts
Outdated
for (const acc of r.result.value) { | ||
const amount = acc.account.data.parsed.info.tokenAmount.amount; | ||
const decimals = acc.account.data.parsed.info.tokenAmount.decimals; | ||
totalBalance += parseFloat(amount) / Math.pow(10, decimals); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
did you consider move this to big int math instead? parseFloat may have errors
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this 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/client/src/getBalances.ts (1)
82-101
:⚠️ Potential issueAdd null check before accessing supportedChain.vm
This is a critical issue that was previously identified but remains unfixed. Accessing
supportedChain.vm
without checking ifsupportedChain
exists could cause runtime errors.Apply this fix:
const supportedChain = supportedChains.find( (c: any) => c.chain_id === token.foreign_chain_id ); -if (supportedChain.vm === "evm") { +if (supportedChain?.vm === "evm") { tokens.push({ chain_id: token.foreign_chain_id, coin_type: "ERC20", contract: token.asset, symbol: token.symbol, zrc20: token.zrc20_contract_address, }); -} else if (supportedChain.vm === "svm") { +} else if (supportedChain?.vm === "svm") { tokens.push({ chain_id: token.foreign_chain_id, coin_type: "SPL", contract: token.asset, symbol: token.symbol, zrc20: token.zrc20_contract_address, }); +} else { + console.warn(`Unsupported chain or VM type for token ${token.symbol}`); }
🧹 Nitpick comments (4)
packages/client/src/getBalances.ts (4)
200-205
: LGTM! Good use of BigInt for precise calculations.The switch to BigInt addresses the previous concern about using parseFloat. This implementation is safer and prevents precision loss.
Consider simplifying the division operation:
-const balance = BigInt( - ethers.utils.defaultAbiCoder.decode(["uint256"], data)[0] -); -const formattedBalance = ( - balance / BigInt(10 ** token.decimals) -).toString(); +const balance = BigInt(ethers.utils.defaultAbiCoder.decode(["uint256"], data)[0]); +const formattedBalance = (balance / BigInt(10n ** BigInt(token.decimals))).toString();
278-281
: Extract magic number to a named constantThe Bitcoin balance calculation is correct but could be more readable by extracting the satoshis-per-BTC conversion factor to a named constant.
+const SATOSHIS_PER_BTC = BigInt(100000000); + const balance = ( - (BigInt(funded_txo_sum) - BigInt(spent_txo_sum)) / - BigInt(100000000) + (BigInt(funded_txo_sum) - BigInt(spent_txo_sum)) / SATOSHIS_PER_BTC ).toString();
362-372
: Use optional chaining and simplify balance calculationThe balance calculation logic could be more concise and safer.
-if (r.result && r.result.value && r.result.value.length > 0) { +if (r.result?.value?.length > 0) { let totalBalance = BigInt(0); - for (const acc of r.result.value) { - const amount = acc.account.data.parsed.info.tokenAmount.amount; - const decimals = acc.account.data.parsed.info.tokenAmount.decimals; - totalBalance += BigInt(amount) / BigInt(10 ** decimals); - } + totalBalance = r.result.value.reduce((sum, acc) => { + const { amount, decimals } = acc.account.data.parsed.info.tokenAmount; + return sum + BigInt(amount) / BigInt(10n ** BigInt(decimals)); + }, BigInt(0)); balances.push({ ...token, balance: totalBalance.toString() }); } else { balances.push({ ...token, balance: "0" }); }🧰 Tools
🪛 Biome (1.9.4)
[error] 362-362: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
373-379
: Enhance error logging structureThe error handling is good, but the error logging could be more structured for better debugging.
-console.error( - `Failed to get SPL balance for ${token.symbol} on ${token.chain_name}:`, - err -); +console.error({ + error: err, + message: `Failed to get SPL balance`, + token: token.symbol, + chain: token.chain_name, +});
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
packages/client/src/getBalances.ts
(4 hunks)
🧰 Additional context used
🪛 Biome (1.9.4)
packages/client/src/getBalances.ts
[error] 362-362: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
🔇 Additional comments (1)
packages/client/src/getBalances.ts (1)
320-326
: LGTM! Good filtering of SPL tokens
The token filtering logic correctly identifies SPL tokens on Solana chains.
@coderabbitai review |
✅ Actions performedReview triggered.
|
Summary by CodeRabbit
New Features
Bug Fixes
Documentation