From 585f84dfab61773d911b6ffc64ae511315c65b32 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 12:45:25 +0000 Subject: [PATCH] Add BNB Chain (BSC) as a USDC bridge deposit source Add Binance-Peg USD Coin (USDC, 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d) on BNB Chain as a new bridge deposit source in the Add Funds ("send from your crypto wallet" + "share your deposit address") and Deposit-to-Savings (USDC vault) flows, alongside Polygon/Arbitrum. - constants/bridge.ts: BSC entry (USDC, 18 decimals, isPermit false) + gold circular BNB icon; add optional decimals to BridgeToken type - lib/thirdweb.ts: register bsc chain so switchChain works in the connected-wallet deposit flow - hooks/useDepositFromEOA.ts: derive source-token decimals from the bridge config instead of hardcoding 6 (BSC USDC is 18 decimals) - constants/alchemy.ts: enable BSC token-balance fetching via Alchemy - components/Coin/BalanceBreakdown.tsx: map the BSC chain icon + name in the coin detail network breakdown - assets/images/bsc.png + lib/assets.ts: circular gold BNB Chain icon https://claude.ai/code/session_013JRn2tvDbZssJGAx4b6gJX --- assets/images/bsc.png | Bin 0 -> 17163 bytes components/Coin/BalanceBreakdown.tsx | 4 +++- constants/alchemy.ts | 7 +++++-- constants/bridge.ts | 20 ++++++++++++++++++-- hooks/useDepositFromEOA.ts | 8 +++++++- lib/assets.ts | 1 + lib/thirdweb.ts | 4 ++-- 7 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 assets/images/bsc.png diff --git a/assets/images/bsc.png b/assets/images/bsc.png new file mode 100644 index 0000000000000000000000000000000000000000..27688c0af1e64c74bf84e6df27136597cc245070 GIT binary patch literal 17163 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 Ef(=$VfdBvi literal 0 HcmV?d00001 diff --git a/components/Coin/BalanceBreakdown.tsx b/components/Coin/BalanceBreakdown.tsx index 702f6fe44..4f79087be 100644 --- a/components/Coin/BalanceBreakdown.tsx +++ b/components/Coin/BalanceBreakdown.tsx @@ -2,7 +2,7 @@ import { useMemo } from 'react'; import { View } from 'react-native'; import { Image } from 'expo-image'; import { formatUnits } from 'viem'; -import { base, fuse, mainnet } from 'viem/chains'; +import { base, bsc, fuse, mainnet } from 'viem/chains'; import SavingsIcon from '@/assets/images/savings'; import WalletIcon from '@/assets/images/wallet'; @@ -36,12 +36,14 @@ const CHAIN_ICONS: Record = { [mainnet.id]: getAsset('images/eth.png'), [fuse.id]: getAsset('images/fuse-4x.png'), [base.id]: getAsset('images/base.png'), + [bsc.id]: getAsset('images/bsc.png'), }; const CHAIN_NAMES: Record = { [mainnet.id]: 'Ethereum', [fuse.id]: 'Fuse', [base.id]: 'Base', + [bsc.id]: 'BNB Chain', }; const BalanceBreakdown = ({ token, className }: BalanceBreakdownProps) => { diff --git a/constants/alchemy.ts b/constants/alchemy.ts index 85e9cad71..eae058897 100644 --- a/constants/alchemy.ts +++ b/constants/alchemy.ts @@ -1,17 +1,19 @@ -import { arbitrum, base, mainnet, polygon } from 'viem/chains'; +import { arbitrum, base, bsc, mainnet, polygon } from 'viem/chains'; import { EXPO_PUBLIC_ALCHEMY_API_KEY } from '@/lib/config'; /** * Alchemy is the primary on-chain data provider for these chains; * Blockscout is used as fallback on Alchemy failure. Fuse (122) is not - * supported by Alchemy and always uses Blockscout. + * supported by Alchemy and always uses Blockscout. BSC (56) is Alchemy-only + * (Blockscout has no BSC instance). */ export const ALCHEMY_SUPPORTED_CHAIN_IDS: ReadonlySet = new Set([ mainnet.id, base.id, polygon.id, arbitrum.id, + bsc.id, ]); export const ALCHEMY_CHAIN_URLS: Record = { @@ -19,6 +21,7 @@ export const ALCHEMY_CHAIN_URLS: Record = { [base.id]: `https://base-mainnet.g.alchemy.com/v2/${EXPO_PUBLIC_ALCHEMY_API_KEY}`, [polygon.id]: `https://polygon-mainnet.g.alchemy.com/v2/${EXPO_PUBLIC_ALCHEMY_API_KEY}`, [arbitrum.id]: `https://arb-mainnet.g.alchemy.com/v2/${EXPO_PUBLIC_ALCHEMY_API_KEY}`, + [bsc.id]: `https://bnb-mainnet.g.alchemy.com/v2/${EXPO_PUBLIC_ALCHEMY_API_KEY}`, }; export const isAlchemyChain = (chainId: number): boolean => diff --git a/constants/bridge.ts b/constants/bridge.ts index 9f2215bcd..aac272322 100644 --- a/constants/bridge.ts +++ b/constants/bridge.ts @@ -1,6 +1,6 @@ import { ImageSourcePropType } from 'react-native'; import { NATIVE_TOKEN_ADDRESS } from 'thirdweb'; -import { arbitrum, base, fuse, mainnet, polygon } from 'viem/chains'; +import { arbitrum, base, bsc, fuse, mainnet, polygon } from 'viem/chains'; import { WRAPPED_FUSE } from '@/constants/addresses'; @@ -8,6 +8,7 @@ type BridgeToken = { name?: string; fullName?: string; address: string; + decimals?: number; icon?: ImageSourcePropType; version?: string; isPermit?: boolean; @@ -155,9 +156,24 @@ export const BRIDGE_TOKENS: BridgeTokens = { }, name: 'Fuse', icon: require('@/assets/images/fuse.png'), - sort: 5, + sort: 6, bridgeSpeed: 0, }, + [bsc.id]: { + tokens: { + USDC: { + name: 'USDC', + fullName: 'Binance-Peg USD Coin', + address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', + decimals: 18, + isPermit: false, + }, + }, + name: 'BNB Chain', + icon: require('@/assets/images/bsc.png'), + sort: 5, + bridgeSpeed: 2, + }, }; export const getUsdcAddress = (chainId: number) => { diff --git a/hooks/useDepositFromEOA.ts b/hooks/useDepositFromEOA.ts index 544b88ab8..87db4382c 100644 --- a/hooks/useDepositFromEOA.ts +++ b/hooks/useDepositFromEOA.ts @@ -425,7 +425,13 @@ const useDepositFromEOA = ( }, }); - const amountWei = parseUnits(amount, 6); + // Source token decimals (defaults to 6). Some chains' USDC is not 6 + // decimals (e.g. Binance-Peg USDC on BNB Chain is 18), so derive it from + // the bridge config rather than hardcoding. + const srcDecimals = + Object.values(BRIDGE_TOKENS[srcChainId]?.tokens ?? {}).find(t => t.name === token) + ?.decimals ?? 6; + const amountWei = parseUnits(amount, srcDecimals); let txHash: `0x${string}` | undefined; let transaction: { transactionHash: `0x${string}` } | undefined = { diff --git a/lib/assets.ts b/lib/assets.ts index 0461a6b63..7a477c94e 100644 --- a/lib/assets.ts +++ b/lib/assets.ts @@ -85,6 +85,7 @@ export const ASSETS = { module: require('@/assets/images/brl-fiat-currency.tsx'), hash: '75a2ebe8', }, + 'images/bsc.png': { module: require('@/assets/images/bsc.png'), hash: '4135f6a8' }, 'images/buy_crypto.png': { module: require('@/assets/images/buy_crypto.png'), hash: 'a072a946' }, 'images/card-earn.png': { module: require('@/assets/images/card-earn.png'), hash: '3e55e4d1' }, 'images/card-effortless.png': { diff --git a/lib/thirdweb.ts b/lib/thirdweb.ts index 757fab5d6..91839f6a5 100644 --- a/lib/thirdweb.ts +++ b/lib/thirdweb.ts @@ -1,5 +1,5 @@ import { createThirdwebClient, defineChain } from 'thirdweb'; -import { arbitrum, base, mainnet, polygon } from 'thirdweb/chains'; +import { arbitrum, base, bsc, mainnet, polygon } from 'thirdweb/chains'; import { darkTheme } from 'thirdweb/react'; import { createWallet } from 'thirdweb/wallets'; @@ -50,7 +50,7 @@ const fuse = defineChain({ }, }); -const chains = [mainnet, fuse, polygon, base, arbitrum]; +const chains = [mainnet, fuse, polygon, base, arbitrum, bsc]; export const getChain = (chainId: number) => { return chains.find(chain => chain.id === chainId);