@stableflow/pay-widgets 0.2.0-beta-bb77113a4d-20261012 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -691,10 +691,10 @@ function ChainSelect(props) {
|
|
|
691
691
|
"aria-haspopup": "listbox",
|
|
692
692
|
"aria-expanded": open,
|
|
693
693
|
onClick: () => setOpen((current) => !current),
|
|
694
|
-
className: "flex h-[50px] w-[70px] cursor-pointer items-center justify-
|
|
694
|
+
className: "flex h-[50px] w-[70px] cursor-pointer items-center justify-between pl-[9px] pr-[12px] gap-1.5 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] shadow-[0_0_40px_0_rgba(0,0,0,0.06)]",
|
|
695
695
|
children: [
|
|
696
|
-
selected ? /* @__PURE__ */ jsx3("img", { src: selected.logo, alt: "", className: "size-
|
|
697
|
-
/* @__PURE__ */ jsx3(IconChevron, { className: cx("size-2.5 text-black", open ? "-rotate-90" : "rotate-90") })
|
|
696
|
+
selected ? /* @__PURE__ */ jsx3("img", { src: selected.logo, alt: "", className: "size-7 rounded-[8px] object-cover" }) : /* @__PURE__ */ jsx3(ChainStack, { chains: previewChains, logoClassName: "size-[12px] rounded-[2px] object-cover" }),
|
|
697
|
+
/* @__PURE__ */ jsx3(IconChevron, { className: cx("size-2.5 text-black duration-150", open ? "-rotate-90" : "rotate-90") })
|
|
698
698
|
]
|
|
699
699
|
}
|
|
700
700
|
),
|
|
@@ -1475,7 +1475,7 @@ function TokenSelectDialog(props) {
|
|
|
1475
1475
|
"w-full max-h-[90vh] gap-3 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-0 shadow-[0_0_40px_0_rgba(0,0,0,0.06)] md:w-[448px] md:rounded-[12px] md:p-0",
|
|
1476
1476
|
className
|
|
1477
1477
|
),
|
|
1478
|
-
children: /* @__PURE__ */ jsxs5("div", { className: "flex h-[min(620px,70vh)] min-h-0 flex-col gap-2.5
|
|
1478
|
+
children: /* @__PURE__ */ jsxs5("div", { className: "flex h-[min(620px,70vh)] min-h-0 flex-col gap-2.5", children: [
|
|
1479
1479
|
/* @__PURE__ */ jsxs5("div", { className: "flex shrink-0 items-center gap-3.5 px-5", children: [
|
|
1480
1480
|
/* @__PURE__ */ jsx8(
|
|
1481
1481
|
SearchInput2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/token-select/context.tsx","../../src/token-select/balances.ts","../../src/token-select/config.ts","../../src/token-select/TokenSelectDialog.tsx","../../src/token-select/chain-select.tsx","../../src/token-select/chain-stack.tsx","../../src/token-select/format.ts","../../src/token-select/use-desktop.ts","../../src/token-select/utils.ts","../../src/token-select/prefs.ts","../../src/token-select/recent-tiles.tsx","../../src/token-select/lazy-image.tsx","../../src/token-select/logos.ts","../../src/token-select/token-pane.tsx","../../src/token-select/search-results.tsx","../../src/token-select/types.ts","../../src/token-select/pay-config.ts"],"sourcesContent":["import { useEffect, type ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { clearPayTokenBalances, configureBalanceReaders, setBalanceTokens } from \"./balances\";\nimport { DEFAULT_STABLE_SYMBOLS } from \"./config\";\nimport type { PayToken, PayWallet, ReadBalances } from \"./types\";\n\nexport type PayBalanceMode = \"async\" | \"sync\" | \"none\";\n\ntype PayWidgetsContextValue = {\n tokens: PayToken[];\n loading: boolean;\n wallet: PayWallet;\n stableSymbols: string[];\n chainKindLabels: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n balanceMode: PayBalanceMode;\n getBalance: ((token: PayToken, owner: string) => string | null | undefined) | null;\n isBalanceLoading: ((token: PayToken, owner: string) => boolean) | null;\n};\n\nconst PayWidgetsContext = createContext<PayWidgetsContextValue | null>(null);\n\nexport type PayWidgetsProviderProps = {\n tokens: PayToken[];\n loading?: boolean;\n wallet: PayWallet;\n readBalances?: ReadBalances;\n getBalance?: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading?: (token: PayToken, owner: string) => boolean;\n stableSymbols?: string[];\n chainKindLabels?: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n children: ReactNode;\n};\n\nfunction isProduction() {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n return env === \"production\";\n}\n\nfunction warnBalanceMode(readBalances: ReadBalances | undefined, getBalance: PayWidgetsProviderProps[\"getBalance\"]) {\n if (isProduction()) return;\n if (readBalances && getBalance) {\n console.warn(\"PayWidgetsProvider: both readBalances and getBalance were passed; using readBalances.\");\n return;\n }\n if (!readBalances && !getBalance) {\n console.warn(\"PayWidgetsProvider: pass readBalances or getBalance so token balances can load.\");\n }\n}\n\nexport function PayWidgetsProvider(props: PayWidgetsProviderProps) {\n const {\n tokens,\n loading = false,\n wallet,\n readBalances,\n getBalance,\n isBalanceLoading,\n onCopyAddress,\n stableSymbols = [...DEFAULT_STABLE_SYMBOLS],\n chainKindLabels = {},\n children,\n } = props;\n\n useEffect(() => {\n warnBalanceMode(readBalances, getBalance);\n configureBalanceReaders({\n readBalances: readBalances ?? null,\n getBalance: getBalance ?? null,\n isBalanceLoading: isBalanceLoading ?? null,\n });\n return () => configureBalanceReaders({});\n }, [readBalances, getBalance, isBalanceLoading]);\n\n useEffect(() => {\n setBalanceTokens(tokens);\n }, [tokens]);\n\n const connected = Object.values(wallet.accounts).some((account) => Boolean(account?.address?.trim()));\n useEffect(() => {\n if (!connected) clearPayTokenBalances();\n }, [connected]);\n\n const balanceMode: PayBalanceMode = readBalances ? \"async\" : getBalance ? \"sync\" : \"none\";\n const value: PayWidgetsContextValue = {\n tokens,\n loading,\n wallet,\n stableSymbols,\n chainKindLabels,\n onCopyAddress,\n balanceMode,\n getBalance: balanceMode === \"sync\" ? getBalance ?? null : null,\n isBalanceLoading: balanceMode === \"sync\" ? isBalanceLoading ?? null : null,\n };\n\n return <PayWidgetsContext.Provider value={value}>{children}</PayWidgetsContext.Provider>;\n}\n\nexport function usePayWidgets(): PayWidgetsContextValue {\n const value = useContext(PayWidgetsContext);\n if (!value) {\n throw new Error(\"Token select must be rendered inside PayWidgetsProvider\");\n }\n return value;\n}\n","import { useSyncExternalStore } from \"react\";\nimport { TOKEN_BALANCE_POLL_MS } from \"./config\";\nimport type { BalanceReadResult, ChainKind, ChainOwners, PayToken, ReadBalances, TokenBalanceStatus } from \"./types\";\n\nexport type TokenBalance = {\n raw: string | null;\n formatted: string | null;\n status: TokenBalanceStatus;\n error: string | null;\n updatedAt: number | null;\n};\n\ntype SyncBalanceReader = {\n getBalance: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading: (token: PayToken, owner: string) => boolean;\n};\n\nconst listeners = new Set<() => void>();\nlet balances: Record<string, TokenBalance> = {};\nlet reader: ReadBalances | null = null;\nlet syncReader: SyncBalanceReader | null = null;\nlet tokensById = new Map<string, PayToken>();\nconst chainInflight = new Map<string, Promise<void>>();\n\nexport function configureBalanceReaders(options: {\n readBalances?: ReadBalances | null;\n getBalance?: SyncBalanceReader[\"getBalance\"] | null;\n isBalanceLoading?: SyncBalanceReader[\"isBalanceLoading\"] | null;\n}) {\n reader = options.readBalances ?? null;\n if (!options.readBalances && options.getBalance) {\n syncReader = {\n getBalance: options.getBalance,\n isBalanceLoading: options.isBalanceLoading ?? (() => false),\n };\n return;\n }\n syncReader = null;\n}\n\nexport function setBalanceTokens(tokens: readonly PayToken[]) {\n tokensById = new Map(tokens.map((token) => [token.assetId, token]));\n}\n\nexport function payBalanceMode(): \"async\" | \"sync\" | \"none\" {\n if (reader) return \"async\";\n if (syncReader) return \"sync\";\n return \"none\";\n}\n\nfunction emit() {\n balances = { ...balances };\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function subscribePayTokenBalances(listener: () => void) {\n return subscribe(listener);\n}\n\nexport function getPayTokenBalances() {\n return balances;\n}\n\nfunction ownerKey(owner: string, chainKind: ChainKind): string {\n return chainKind === \"solana\" || chainKind === \"zec\" ? owner : owner.toLowerCase();\n}\n\nfunction balanceKey(owner: string, assetId: string, chainKind: ChainKind): string {\n return `${ownerKey(owner, chainKind)}:${assetId}`;\n}\n\nfunction isFresh(entry: TokenBalance | undefined, now: number): boolean {\n return Boolean(\n entry\n && entry.status === \"success\"\n && entry.updatedAt != null\n && now - entry.updatedAt < TOKEN_BALANCE_POLL_MS,\n );\n}\n\nfunction loadingEntry(prev: TokenBalance | undefined): TokenBalance {\n if (!prev) return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n return { ...prev, status: \"loading\", error: null };\n}\n\nfunction withStaleOnError(prev: TokenBalance | undefined, next: TokenBalance): TokenBalance {\n if (next.status !== \"error\") return next;\n if (prev?.raw == null && prev?.formatted == null) return next;\n return { ...next, raw: prev.raw, formatted: prev.formatted, updatedAt: prev.updatedAt };\n}\n\nexport function setBalanceReader(next: ReadBalances | null) {\n reader = next;\n if (next) syncReader = null;\n}\n\nexport function clearPayTokenBalances() {\n balances = {};\n emit();\n}\n\nfunction syncBalance(owner: string, assetId: string): TokenBalance | undefined {\n if (!syncReader) return undefined;\n const token = tokensById.get(assetId);\n if (!token) return undefined;\n const loading = syncReader.isBalanceLoading(token, owner);\n const formatted = syncReader.getBalance(token, owner);\n if (loading && (formatted == null || formatted === \"\")) {\n return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n }\n if (formatted == null || formatted === \"\") return undefined;\n return { raw: null, formatted, status: \"success\", error: null, updatedAt: null };\n}\n\nexport function getPayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n if (!owner || !assetId) return undefined;\n if (syncReader) return syncBalance(owner, assetId);\n return balances[`${owner}:${assetId}`] ?? balances[`${owner.toLowerCase()}:${assetId}`];\n}\n\nexport function usePayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n const current = useSyncExternalStore(subscribe, getPayTokenBalances, getPayTokenBalances);\n if (!owner || !assetId) return undefined;\n return current[`${owner}:${assetId}`] ?? current[`${owner.toLowerCase()}:${assetId}`];\n}\n\nfunction writeResult(owner: string, token: PayToken, result: BalanceReadResult) {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n const prev = balances[key];\n const next: TokenBalance = \"error\" in result\n ? { raw: null, formatted: null, status: \"error\", error: result.error, updatedAt: Date.now() }\n : { raw: result.raw ?? null, formatted: result.formatted, status: \"success\", error: null, updatedAt: Date.now() };\n balances[key] = withStaleOnError(prev, next);\n}\n\nexport async function refreshPayTokenBalance(owner: string, token: PayToken): Promise<TokenBalance | null> {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n balances[key] = loadingEntry(balances[key]);\n emit();\n if (!reader) {\n balances[key] = withStaleOnError(balances[key], {\n raw: null,\n formatted: null,\n status: \"error\",\n error: \"Balance reader is not configured\",\n updatedAt: Date.now(),\n });\n emit();\n return balances[key] ?? null;\n }\n try {\n const results = await reader({\n owner,\n chainKind: token.chain.chainKind,\n blockchain: token.blockchain,\n tokens: [token],\n });\n const result = results.find((item) => item.assetId === token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n };\n writeResult(owner, token, result);\n } catch (cause) {\n writeResult(owner, token, {\n assetId: token.assetId,\n error: cause instanceof Error ? cause.message : \"Failed to read balance\",\n });\n }\n emit();\n return balances[key] ?? null;\n}\n\nfunction groupByChain(tokens: PayToken[]): Map<string, PayToken[]> {\n const groups = new Map<string, PayToken[]>();\n for (const token of tokens) {\n const list = groups.get(token.blockchain) ?? [];\n list.push(token);\n groups.set(token.blockchain, list);\n }\n return groups;\n}\n\nasync function fetchChain(owner: string, tokens: PayToken[], force: boolean) {\n const blockchain = tokens[0]?.blockchain;\n const kind = tokens[0]?.chain.chainKind;\n if (!blockchain || !kind) return;\n const now = Date.now();\n const stale = tokens.filter((token) => force || !isFresh(balances[balanceKey(owner, token.assetId, kind)], now));\n if (stale.length === 0) return;\n\n const flightKey = `${ownerKey(owner, kind)}:${blockchain}`;\n const pending = chainInflight.get(flightKey);\n if (pending) return pending;\n\n for (const token of stale) {\n const key = balanceKey(owner, token.assetId, kind);\n balances[key] = loadingEntry(balances[key]);\n }\n emit();\n\n const run = (async () => {\n if (!reader) {\n for (const token of stale) {\n writeResult(owner, token, { assetId: token.assetId, error: \"Balance reader is not configured\" });\n }\n emit();\n return;\n }\n try {\n const results = await reader({ owner, chainKind: kind, blockchain, tokens: stale });\n const byId = new Map(results.map((item) => [item.assetId, item]));\n for (const token of stale) {\n writeResult(owner, token, byId.get(token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n });\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"Failed to read balance\";\n for (const token of stale) writeResult(owner, token, { assetId: token.assetId, error: message });\n }\n emit();\n })();\n\n chainInflight.set(flightKey, run);\n return run.finally(() => {\n if (chainInflight.get(flightKey) === run) chainInflight.delete(flightKey);\n });\n}\n\nexport async function ensurePayTokenBalances(\n owners: ChainOwners,\n tokens: PayToken[],\n opts?: { force?: boolean },\n) {\n if (syncReader || !reader) return;\n const force = Boolean(opts?.force);\n const groups = groupByChain(tokens);\n await Promise.all(Array.from(groups.values()).map((group) => {\n const kind = group[0]?.chain.chainKind;\n const owner = kind ? owners[kind] : undefined;\n if (!owner) return Promise.resolve();\n return fetchChain(owner, group, force);\n }));\n}\n","export const TOKEN_BALANCE_POLL_MS = 60_000;\nexport const ALL_CHAIN_FILTER = \"all\";\nexport const DEFAULT_STABLE_SYMBOLS = [\"USDT\", \"USDC\"] as const;\nexport const TOKEN_SELECT_PREFS_STORAGE_KEY = \"stableflow-pay:token-select-prefs:v1\";\nexport const TOKEN_SELECT_PREFS_VERSION = 3;\nexport const MAX_RECENT_BLOCKCHAINS = 16;\nexport const MAX_RECENTLY_USED = 5;\nexport const MAX_RECENT_SEARCHES = 5;\n/** Stored history length so a chain filter can still fill the visible lists. */\nexport const MAX_RECENT_HISTORY = 50;\nexport const YOUR_TOKENS_TITLE = \"Your Tokens\";\nexport const RECENT_SEARCHES_TITLE = \"Recent Searches\";\nexport const TRENDS_TOKEN_TITLE = \"Trends Token\";\nexport const ALL_CHAIN_PREVIEW_BLOCKCHAINS = [\"eth\", \"near\", \"sol\", \"tron\"] as const;\nexport const DESKTOP_MEDIA_QUERY = \"(min-width: 768px)\";\n\n/**\n * Stand-in for the trends API. This constant is the only data source for the Trends Token section.\n * Order: tron USDT, eth USDT, eth USDC, sol USDC, sol USDT, pol USDC, bsc USDT, arb USDT, arb USDC, near USDT.\n */\nexport const TRENDS_TOKENS = [\n { blockchain: \"tron\", symbol: \"USDT\" },\n { blockchain: \"eth\", symbol: \"USDT\" },\n { blockchain: \"eth\", symbol: \"USDC\" },\n { blockchain: \"sol\", symbol: \"USDC\" },\n { blockchain: \"sol\", symbol: \"USDT\" },\n { blockchain: \"pol\", symbol: \"USDC\" },\n { blockchain: \"bsc\", symbol: \"USDT\" },\n { blockchain: \"arb\", symbol: \"USDT\" },\n { blockchain: \"arb\", symbol: \"USDC\" },\n { blockchain: \"near\", symbol: \"USDT\" },\n] as const;\n\nexport const CHAIN_KIND_LABELS: Record<string, string> = {\n evm: \"EVM\",\n near: \"Near\",\n solana: \"Solana\",\n tron: \"Tron\",\n zec: \"Zcash\",\n};\n\n/** Built-in network code to wallet kind. Callers can override unknown codes. */\nexport const DEFAULT_CHAIN_KINDS = {\n eth: \"evm\",\n base: \"evm\",\n arb: \"evm\",\n op: \"evm\",\n pol: \"evm\",\n bsc: \"evm\",\n avax: \"evm\",\n gnosis: \"evm\",\n scroll: \"evm\",\n xlayer: \"evm\",\n bera: \"evm\",\n near: \"near\",\n sol: \"solana\",\n tron: \"tron\",\n zec: \"zec\",\n} as const;\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport { Dialog } from \"@stableflow/pay-ui/dialog\";\nimport { SearchInput } from \"@stableflow/pay-ui/search-input\";\nimport {\n ensurePayTokenBalances,\n getPayTokenBalance,\n getPayTokenBalances,\n subscribePayTokenBalances,\n} from \"./balances\";\nimport {\n ALL_CHAIN_FILTER,\n MAX_RECENT_SEARCHES,\n MAX_RECENTLY_USED,\n RECENT_SEARCHES_TITLE,\n TOKEN_BALANCE_POLL_MS,\n TRENDS_TOKEN_TITLE,\n YOUR_TOKENS_TITLE,\n} from \"./config\";\nimport { ChainSelect } from \"./chain-select\";\nimport { usePayWidgets } from \"./context\";\nimport { cx, fontSans } from \"./format\";\nimport { getTokenSelectPrefs, removeRecentSearches, setLastBlockchain, setLastToken, setRecentSearch, useTokenSelectPrefs } from \"./prefs\";\nimport { RecentTileSkeletons, RecentTiles } from \"./recent-tiles\";\nimport { SearchResults } from \"./search-results\";\nimport { TokenListSkeleton, TokenPane, type TokenListSection } from \"./token-pane\";\nimport { ownerKey, type ChainKind, type ChainOwners, type PayToken, type TokenSelectRole } from \"./types\";\nimport {\n allChainPreview,\n chainHasBalance,\n chainMenuOrder,\n chainsFromTokens,\n compareTokensByPriority,\n initialChainFilter,\n isBlockchainDisabled,\n isChainKindLocked,\n matchesChainFilter,\n payerRailChains,\n positiveBalanceTokens,\n recentTokensInOrder,\n searchTokens,\n sortTokensForChain,\n tokenBalanceUsd,\n trendTokensIn,\n} from \"./utils\";\n\nexport type TokenSelectSelection = {\n token: PayToken;\n};\n\nexport type TokenSelectDialogProps = {\n open: boolean;\n onClose: () => void;\n onSelect: (selection: TokenSelectSelection) => void;\n role?: TokenSelectRole;\n title?: string;\n selectedAssetId?: string | null;\n balanceOwners?: ChainOwners;\n allowedBlockchains?: string[] | null;\n lockChainKind?: ChainKind | null;\n excludeNative?: boolean;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n className?: string;\n titleClassName?: string;\n headerClassName?: string;\n closeClassName?: string;\n contentClassName?: string;\n searchClassName?: string;\n rowClassName?: string;\n};\n\nconst TOKEN_SEARCH_CLASS = \"h-[50px] rounded-[12px] border-[#e3e3e3] bg-[#f6f6f6] pl-[43px] text-sm placeholder:text-black/30\";\nconst TOKEN_SEARCH_ICON_CLASS = \"left-4 size-[19px] text-black\";\n\nfunction ownerForToken(owners: ChainOwners, token: PayToken): string | null {\n return owners[token.chain.chainKind] ?? null;\n}\n\nfunction hasAnyOwner(owners: ChainOwners): boolean {\n return Object.values(owners).some((address) => Boolean(address));\n}\n\nfunction isNativeToken(token: PayToken): boolean {\n const addr = String(token.contractAddress || \"\").trim().toLowerCase();\n return !addr || addr === \"native\" || addr === \"0x0000000000000000000000000000000000000000\";\n}\n\nexport function TokenSelectDialog(props: TokenSelectDialogProps) {\n const {\n open,\n onClose,\n onSelect,\n role = \"payer\",\n title = \"Select Token\",\n selectedAssetId,\n balanceOwners,\n allowedBlockchains = null,\n lockChainKind = null,\n excludeNative = false,\n disabledBlockchains = null,\n disabledReason,\n className,\n titleClassName,\n headerClassName,\n closeClassName,\n contentClassName,\n searchClassName,\n rowClassName,\n } = props;\n const payer = role === \"payer\";\n const showBalances = payer;\n const {\n wallet,\n tokens,\n loading,\n stableSymbols,\n balanceMode,\n getBalance: syncGetBalance,\n isBalanceLoading: syncIsBalanceLoading,\n } = usePayWidgets();\n const prefs = useTokenSelectPrefs();\n const balanceEntries = useSyncExternalStore(subscribePayTokenBalances, getPayTokenBalances, getPayTokenBalances);\n const connectedOwners = useMemo(() => {\n const owners: ChainOwners = {};\n for (const [kind, account] of Object.entries(wallet.accounts)) {\n const address = account?.address?.trim();\n if (address) owners[kind] = address;\n }\n return owners;\n }, [wallet.accounts]);\n const owners = useMemo(\n () => (showBalances ? { ...connectedOwners, ...balanceOwners } : {}),\n [showBalances, connectedOwners, balanceOwners],\n );\n const [search, setSearch] = useState(\"\");\n const [chainFilter, setChainFilter] = useState(ALL_CHAIN_FILTER);\n const userPickedChain = useRef(false);\n const lockRef = useRef(lockChainKind);\n const tokensRef = useRef(tokens);\n lockRef.current = lockChainKind;\n tokensRef.current = tokens;\n\n useEffect(() => {\n if (!open) return;\n userPickedChain.current = false;\n setSearch(\"\");\n setChainFilter(initialChainFilter(\n lockRef.current,\n getTokenSelectPrefs().recentBlockchains,\n chainsFromTokens(tokensRef.current),\n ));\n }, [open]);\n\n useEffect(() => {\n if (!open || !lockChainKind || userPickedChain.current) return;\n setChainFilter(initialChainFilter(lockChainKind, getTokenSelectPrefs().recentBlockchains, chainsFromTokens(tokens)));\n }, [open, lockChainKind, tokens]);\n\n const allowed = useMemo(() => {\n if (!allowedBlockchains || allowedBlockchains.length === 0) return null;\n return new Set(allowedBlockchains.map((code) => code.toLowerCase()));\n }, [allowedBlockchains]);\n\n const scopedTokens = useMemo(() => {\n return tokens.filter((token) => {\n if (allowed && !allowed.has(token.blockchain.toLowerCase())) return false;\n if (excludeNative && isNativeToken(token)) return false;\n if (payer && !token.supportPayment) return false;\n if (!payer && !token.supportReceive) return false;\n return true;\n });\n }, [tokens, allowed, excludeNative, payer]);\n\n const ownersKey = ownerKey(owners);\n const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join(\"|\"), [scopedTokens]);\n const ownersRef = useRef(owners);\n const scopedRef = useRef(scopedTokens);\n ownersRef.current = owners;\n scopedRef.current = scopedTokens;\n\n useEffect(() => {\n if (balanceMode !== \"async\" || !showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current);\n const id = window.setInterval(() => {\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current, { force: true });\n }, TOKEN_BALANCE_POLL_MS);\n return () => window.clearInterval(id);\n }, [balanceMode, showBalances, open, ownersKey, tokenKey]);\n\n function balanceOf(token: PayToken) {\n const owner = ownerForToken(owners, token);\n if (!showBalances || !owner) return undefined;\n if (balanceMode === \"sync\" && syncGetBalance) return syncGetBalance(token, owner) ?? undefined;\n return getPayTokenBalance(owner, token.assetId)?.formatted;\n }\n\n function usdOf(token: PayToken) {\n if (!showBalances) return -1;\n return tokenBalanceUsd(token, balanceOf(token));\n }\n\n function loadingOf(token: PayToken) {\n if (!showBalances) return false;\n const owner = ownerForToken(owners, token);\n if (!owner) return false;\n const formatted = balanceOf(token);\n if (formatted != null && formatted !== \"\") return false;\n if (balanceMode === \"sync\") return syncIsBalanceLoading?.(token, owner) ?? false;\n const entry = getPayTokenBalance(owner, token.assetId);\n return !entry || entry.status === \"loading\";\n }\n\n const availableChains = useMemo(() => chainsFromTokens(scopedTokens), [scopedTokens]);\n const rangeTokens = useMemo(\n () => scopedTokens.filter((token) => matchesChainFilter(token, chainFilter)),\n [scopedTokens, chainFilter],\n );\n\n const fundedBlockchains = useMemo(() => {\n const funded = new Set<string>();\n if (!showBalances) return funded;\n for (const chain of availableChains) {\n if (chainHasBalance(chain.blockchain, scopedTokens, (token) => balanceOf(token))) {\n funded.add(chain.blockchain);\n }\n }\n return funded;\n }, [availableChains, owners, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const dottedChains = useMemo(() => {\n if (!payer) return [];\n return payerRailChains(availableChains, owners, fundedBlockchains);\n }, [payer, availableChains, owners, fundedBlockchains]);\n\n const dottedSet = useMemo(() => new Set(dottedChains.map((chain) => chain.blockchain)), [dottedChains]);\n\n const menuChains = useMemo(() => chainMenuOrder(availableChains, scopedTokens, {\n dotted: dottedSet,\n showBalances,\n getBalanceUsd: (token) => tokenBalanceUsd(token as PayToken, balanceOf(token as PayToken)),\n }), [availableChains, scopedTokens, dottedSet, showBalances, balanceEntries, owners, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const previewChains = useMemo(() => allChainPreview(availableChains), [availableChains]);\n const searching = search.trim().length > 0;\n const rangeWalletConnected = rangeTokens.some((token) => Boolean(owners[token.chain.chainKind]));\n\n const recentTokens = useMemo(\n () => recentTokensInOrder(rangeTokens, prefs.recentAssetIds).slice(0, MAX_RECENTLY_USED),\n [rangeTokens, prefs.recentAssetIds],\n );\n const recentSearches = useMemo(\n () => recentTokensInOrder(rangeTokens, prefs.recentSearchAssetIds).slice(0, MAX_RECENT_SEARCHES),\n [rangeTokens, prefs.recentSearchAssetIds],\n );\n\n const yours = useMemo(() => {\n if (!payer || !rangeWalletConnected) return [];\n return positiveBalanceTokens(rangeTokens, usdOf);\n }, [payer, rangeWalletConnected, rangeTokens, owners, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const trends = useMemo(() => trendTokensIn(rangeTokens, {\n chainFilter,\n sortRest: (rest) => {\n if (chainFilter === ALL_CHAIN_FILTER) {\n return rest.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n }\n const chain = availableChains.find((item) => item.blockchain === chainFilter);\n return sortTokensForChain(rest, {\n withBalances: Boolean(chain && owners[chain.chainKind]),\n usdOf,\n loadingOf,\n stableSymbols,\n });\n },\n }), [rangeTokens, chainFilter, availableChains, owners, stableSymbols, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const receiverTokens = useMemo(\n () => rangeTokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols)),\n [rangeTokens, stableSymbols],\n );\n\n const results = useMemo(() => {\n if (!searching) return [];\n return searchTokens(rangeTokens, search, {\n role: payer ? \"payer\" : \"receiver\",\n usdOf,\n loadingOf,\n });\n }, [searching, rangeTokens, search, payer, owners, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n function handleSelectToken(token: PayToken, fromSearch: boolean) {\n if (isBlockchainDisabled(token.blockchain, disabledBlockchains)) return;\n if (isChainKindLocked(token.chain.chainKind, lockChainKind)) return;\n if (payer) setLastToken(token.assetId, token.blockchain);\n else setLastBlockchain(token.blockchain);\n if (fromSearch && search.trim()) setRecentSearch(token.assetId);\n onSelect({ token });\n onClose();\n }\n\n function clearVisibleSearches() {\n if (chainFilter === ALL_CHAIN_FILTER) {\n removeRecentSearches(prefs.recentSearchAssetIds);\n return;\n }\n const byId = new Map(scopedTokens.map((token) => [token.assetId, token]));\n removeRecentSearches(prefs.recentSearchAssetIds.filter((assetId) => byId.get(assetId)?.blockchain === chainFilter));\n }\n\n const tokenDisabled = (token: PayToken) => (\n isBlockchainDisabled(token.blockchain, disabledBlockchains)\n || isChainKindLocked(token.chain.chainKind, lockChainKind)\n );\n\n const sections = useMemo((): TokenListSection[] => {\n if (loading) {\n const next: TokenListSection[] = [];\n if (payer && rangeWalletConnected) {\n next.push({ id: \"yours\", title: YOUR_TOKENS_TITLE, icon: \"database\", tokens: [], skeletonRows: 2 });\n }\n if (payer && recentSearches.length > 0) {\n next.push({\n id: \"searches\",\n title: RECENT_SEARCHES_TITLE,\n icon: \"duration\",\n tokens: [],\n skeletonRows: 2,\n action: { label: \"Clear\", onClick: clearVisibleSearches },\n });\n }\n if (payer) {\n next.push({ id: \"trends\", title: TRENDS_TOKEN_TITLE, icon: \"trends\", tokens: [], skeletonRows: 6 });\n }\n return next;\n }\n if (!payer) return [];\n const next: TokenListSection[] = [];\n if (yours.length > 0) {\n next.push({ id: \"yours\", title: YOUR_TOKENS_TITLE, icon: \"database\", tokens: yours });\n }\n if (recentSearches.length > 0) {\n next.push({\n id: \"searches\",\n title: RECENT_SEARCHES_TITLE,\n icon: \"duration\",\n tokens: recentSearches,\n action: { label: \"Clear\", onClick: clearVisibleSearches },\n });\n }\n if (trends.length > 0) {\n next.push({ id: \"trends\", title: TRENDS_TOKEN_TITLE, icon: \"trends\", tokens: trends });\n }\n return next;\n }, [loading, payer, rangeWalletConnected, recentSearches, yours, trends, chainFilter, prefs.recentSearchAssetIds, scopedTokens]);\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={title}\n titleClassName={cx(\"text-[18px] font-semibold text-black\", fontSans, titleClassName)}\n headerClassName={cx(\"border-0 px-6 pt-[25px] pb-0\", headerClassName)}\n closeClassName={closeClassName}\n contentClassName={cx(\"overflow-hidden\", contentClassName)}\n cardClassName={cx(\n \"w-full max-h-[90vh] gap-3 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-0 shadow-[0_0_40px_0_rgba(0,0,0,0.06)] md:w-[448px] md:rounded-[12px] md:p-0\",\n className,\n )}\n >\n <div className=\"flex h-[min(620px,70vh)] min-h-0 flex-col gap-2.5 pt-3\">\n <div className=\"flex shrink-0 items-center gap-3.5 px-5\">\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"min-w-0 flex-1\"\n iconClassName={TOKEN_SEARCH_ICON_CLASS}\n inputClassName={cx(TOKEN_SEARCH_CLASS, searchClassName)}\n />\n <ChainSelect\n chains={menuChains}\n previewChains={previewChains}\n dotted={dottedSet}\n value={chainFilter}\n onChange={(blockchain) => {\n userPickedChain.current = true;\n setChainFilter(blockchain);\n }}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n />\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col gap-2.5\">\n {payer && loading && recentTokens.length > 0 ? <RecentTileSkeletons /> : null}\n {payer && !loading ? (\n <RecentTiles tokens={recentTokens} onSelect={(token) => handleSelectToken(token, false)} isTokenDisabled={tokenDisabled} />\n ) : null}\n {searching ? (\n <SearchResults\n tokens={results}\n selectedAssetId={selectedAssetId}\n loading={loading}\n showBalances={showBalances}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={(token) => handleSelectToken(token, true)}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n />\n ) : payer ? (\n <TokenPane\n sections={sections}\n selectedAssetId={selectedAssetId}\n showBalances={showBalances}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={(token) => handleSelectToken(token, false)}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n emptyLabel={\n recentTokens.length === 0 && sections.every((section) => section.tokens.length === 0 && !section.skeletonRows)\n ? \"No tokens found\"\n : null\n }\n />\n ) : loading ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3\">\n <TokenListSkeleton rows={6} />\n </div>\n ) : (\n <TokenPane\n sections={[{\n id: \"all\",\n title: \"\",\n icon: \"trends\",\n tokens: receiverTokens,\n }]}\n selectedAssetId={selectedAssetId}\n showBalances={false}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={(token) => handleSelectToken(token, false)}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n emptyLabel={receiverTokens.length === 0 ? \"No tokens found\" : null}\n />\n )}\n </div>\n </div>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { IconCheck } from \"@stableflow/pay-ui/icons/outline/check\";\nimport { IconChevron } from \"@stableflow/pay-ui/icons/outline/chevron\";\nimport { Drawer } from \"@stableflow/pay-ui/drawer\";\nimport { SearchInput } from \"@stableflow/pay-ui/search-input\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ChainStack } from \"./chain-stack\";\nimport { ALL_CHAIN_FILTER } from \"./config\";\nimport { usePayWidgets } from \"./context\";\nimport { chainKindLabel, cx, fontSans, thinScrollbar } from \"./format\";\nimport type { ChainKind, PayChain } from \"./types\";\nimport { useDesktop } from \"./use-desktop\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nconst SEARCH_FIELD_CLASS = \"h-[42px] rounded-[12px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30\";\nconst SEARCH_ICON_CLASS = \"left-4 size-[19px] text-black\";\n\nexport type ChainSelectProps = {\n chains: readonly SidebarChain[];\n previewChains: readonly PayChain[];\n dotted: ReadonlySet<string>;\n value: string;\n onChange: (blockchain: string) => void;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n};\n\nexport function ChainSelect(props: ChainSelectProps) {\n const {\n chains,\n previewChains,\n dotted,\n value,\n onChange,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n } = props;\n const { chainKindLabels } = usePayWidgets();\n const isDesktop = useDesktop();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const rootRef = useRef<HTMLDivElement>(null);\n const selected = value === ALL_CHAIN_FILTER ? undefined : chains.find((chain) => chain.blockchain === value);\n\n useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n }, [open]);\n\n useEffect(() => {\n if (!open || !isDesktop) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || rootRef.current?.contains(target)) return;\n setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n event.preventDefault();\n setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [open, isDesktop]);\n\n function reasonFor(chain: SidebarChain): string | undefined {\n if (isBlockchainDisabled(chain.blockchain, disabledBlockchains)) return disabledReason;\n if (isChainKindLocked(chain.chainKind, lockChainKind) && lockChainKind) {\n return `Recipient address is on ${chainKindLabel(lockChainKind, chainKindLabels)}; edit the recipient to change chain`;\n }\n return undefined;\n }\n\n const trimmed = query.trim().toLowerCase();\n const showAll = !trimmed || \"all\".includes(trimmed);\n const visible = chains.filter((chain) => {\n if (!trimmed) return true;\n return chain.chainName.toLowerCase().includes(trimmed) || chain.blockchain.toLowerCase().includes(trimmed);\n });\n const empty = !showAll && visible.length === 0;\n\n function select(blockchain: string) {\n onChange(blockchain);\n setOpen(false);\n }\n\n const menu = (\n <ChainMenu\n showAll={showAll}\n chains={visible}\n previewChains={previewChains}\n dotted={dotted}\n value={value}\n query={query}\n onQueryChange={setQuery}\n empty={empty}\n isDesktop={isDesktop}\n reasonFor={reasonFor}\n onSelect={select}\n />\n );\n\n return (\n <div ref={rootRef} className=\"relative shrink-0\">\n <button\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n className=\"flex h-[50px] w-[70px] cursor-pointer items-center justify-center gap-1 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] shadow-[0_0_40px_0_rgba(0,0,0,0.06)]\"\n >\n {selected ? (\n <img src={selected.logo} alt=\"\" className=\"size-8 rounded-[8px] object-cover\" />\n ) : (\n <ChainStack chains={previewChains} logoClassName=\"size-[11px] rounded-[2px] object-cover\" />\n )}\n <IconChevron className={cx(\"size-2.5 text-black\", open ? \"-rotate-90\" : \"rotate-90\")} />\n </button>\n {open && isDesktop ? (\n <div\n role=\"listbox\"\n aria-label=\"Select network\"\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n event.preventDefault();\n setOpen(false);\n }}\n className=\"absolute top-[59px] right-0 z-20 flex max-h-[483px] w-[302px] flex-col rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-4 shadow-[0_0_40px_0_rgba(0,0,0,0.06)]\"\n >\n {menu}\n </div>\n ) : null}\n {!isDesktop ? (\n <Drawer\n open={open}\n onClose={() => setOpen(false)}\n title=\"Select Network\"\n titleClassName={cx(\"text-lg font-semibold text-black\", fontSans)}\n cardClassName=\"max-h-[80vh]\"\n contentClassName=\"overflow-hidden\"\n >\n <div className=\"flex h-[min(483px,60vh)] min-h-0 flex-col\">{menu}</div>\n </Drawer>\n ) : null}\n </div>\n );\n}\n\nfunction ChainMenu(props: {\n showAll: boolean;\n chains: readonly SidebarChain[];\n previewChains: readonly PayChain[];\n dotted: ReadonlySet<string>;\n value: string;\n query: string;\n onQueryChange: (value: string) => void;\n empty: boolean;\n isDesktop: boolean;\n reasonFor: (chain: SidebarChain) => string | undefined;\n onSelect: (blockchain: string) => void;\n}) {\n const {\n showAll,\n chains,\n previewChains,\n dotted,\n value,\n query,\n onQueryChange,\n empty,\n isDesktop,\n reasonFor,\n onSelect,\n } = props;\n\n return (\n <>\n <SearchInput\n value={query}\n onChange={onQueryChange}\n placeholder=\"search network\"\n iconClassName={SEARCH_ICON_CLASS}\n inputClassName={cx(SEARCH_FIELD_CLASS, \"pl-[43px]\")}\n />\n <div className={cx(\"mt-2.5 min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n {showAll ? (\n <ChainOption\n selected={value === ALL_CHAIN_FILTER}\n onSelect={() => onSelect(ALL_CHAIN_FILTER)}\n label=\"All\"\n >\n <ChainStack chains={previewChains} logoClassName=\"size-[15px] rounded-[4px] object-cover\" />\n </ChainOption>\n ) : null}\n {chains.map((chain) => {\n const reason = reasonFor(chain);\n const disabled = Boolean(reason);\n return (\n <ChainOption\n key={chain.blockchain}\n selected={value === chain.blockchain}\n disabled={disabled}\n reason={reason}\n showReason={!isDesktop}\n dotted={dotted.has(chain.blockchain)}\n onSelect={() => onSelect(chain.blockchain)}\n label={chain.chainName}\n >\n <img src={chain.logo} alt=\"\" className=\"size-8 rounded-[8px] object-cover\" />\n </ChainOption>\n );\n })}\n {empty ? (\n <p className={cx(\"px-[13px] py-4 text-[13px] text-[#606060]\", fontSans)}>No networks found</p>\n ) : null}\n </div>\n </>\n );\n}\n\nfunction ChainOption(props: {\n selected: boolean;\n disabled?: boolean;\n reason?: string;\n showReason?: boolean;\n dotted?: boolean;\n onSelect: () => void;\n label: string;\n children: ReactNode;\n}) {\n const { selected, disabled = false, reason, showReason = false, dotted = false, onSelect, label, children } = props;\n const button = (\n <button\n type=\"button\"\n aria-disabled={disabled || undefined}\n onClick={() => {\n if (disabled) return;\n onSelect();\n }}\n className={cx(\n \"flex w-full cursor-pointer items-center gap-3 rounded-[6px] border-0 bg-transparent px-1.5 py-1.5 text-left\",\n selected && \"bg-[#f6f6f6]\",\n disabled && \"cursor-not-allowed\",\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className={cx(\"flex min-w-0 items-center gap-3\", disabled && \"opacity-40\")}>\n <span className=\"flex size-8 shrink-0 items-center justify-center\">{children}</span>\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className={cx(\"truncate text-sm font-medium text-black\", fontSans)}>{label}</span>\n {dotted ? <span className=\"size-2 shrink-0 rounded-full bg-[#6284f5]\" /> : null}\n </span>\n </span>\n {disabled && showReason && reason ? (\n <span className={cx(\"mt-0.5 block pl-11 text-xs font-normal text-[#606060]\", fontSans)}>{reason}</span>\n ) : null}\n </span>\n {selected ? <IconCheck className=\"mr-1 size-2.5 shrink-0 text-black\" /> : null}\n </button>\n );\n\n if (disabled && reason && !showReason) {\n return (\n <Tooltip content={reason} triggerClassName=\"flex w-full\">\n {button}\n </Tooltip>\n );\n }\n return button;\n}\n","import type { PayChain } from \"./types\";\n\nexport function ChainStack(props: { chains: readonly PayChain[]; logoClassName: string }) {\n const { chains, logoClassName } = props;\n return (\n <span className=\"grid grid-cols-2 gap-0.5\">\n {chains.slice(0, 4).map((chain) => (\n <img\n key={chain.blockchain}\n src={chain.logo}\n alt=\"\"\n className={logoClassName}\n />\n ))}\n </span>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CHAIN_KIND_LABELS } from \"./config\";\n\n/** Host-independent sans stack. Underscores in the arbitrary value become spaces. */\nexport const fontSans = \"[font-family:Montserrat,PingFang_SC,system-ui,sans-serif]\";\n\nexport const thinScrollbar = \"[&::-webkit-scrollbar]:w-[4px] [&::-webkit-scrollbar-thumb]:rounded-[12px] [&::-webkit-scrollbar-thumb]:bg-[#d9d9d9] [&::-webkit-scrollbar-track]:bg-transparent supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] [scrollbar-color:#d9d9d9_transparent]\";\n\nexport function cx(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function formatAddress(address: string | null | undefined, prefix = 4, suffix = 5): string {\n if (!address) return \"\";\n if (!address.startsWith(\"0x\") && address.length <= 32) return address;\n if (address.length <= prefix + suffix) return address;\n return `${address.slice(0, prefix)}...${address.slice(-suffix)}`;\n}\n\nexport function chainKindLabel(kind: string, labels?: Record<string, string>): string {\n return labels?.[kind] ?? CHAIN_KIND_LABELS[kind] ?? kind;\n}\n\n/** Truncate a decimal string toward zero and group the integer part. */\nexport function formatDisplayAmount(\n value: string | number,\n options: { maxDecimals?: number; prefix?: string; showDust?: boolean } = {},\n): string {\n const maxDecimals = options.maxDecimals ?? 2;\n const prefix = options.prefix ?? \"\";\n const text = String(value).trim();\n const negative = text.startsWith(\"-\");\n const unsigned = negative ? text.slice(1) : text;\n if (!/^\\d+(\\.\\d+)?$/.test(unsigned)) return `${prefix}0`;\n\n const numeric = Number(unsigned);\n const minUnit = 10 ** -maxDecimals;\n if (options.showDust && numeric > 0 && numeric < minUnit) {\n const dust = `<${minUnit.toFixed(maxDecimals)}`;\n return prefix ? `${prefix} ${dust}` : dust;\n }\n\n const [intPart, fracPart = \"\"] = unsigned.split(\".\");\n const fraction = fracPart.slice(0, maxDecimals).replace(/0+$/, \"\");\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n const body = fraction.length > 0 ? `${grouped}.${fraction}` : grouped;\n return `${prefix}${negative ? \"-\" : \"\"}${body}`;\n}\n","import { useEffect, useState } from \"react\";\nimport { DESKTOP_MEDIA_QUERY } from \"./config\";\n\nexport function useDesktop(): boolean {\n const [matches, setMatches] = useState(() => {\n if (typeof window === \"undefined\") return true;\n return window.matchMedia(DESKTOP_MEDIA_QUERY).matches;\n });\n\n useEffect(() => {\n const media = window.matchMedia(DESKTOP_MEDIA_QUERY);\n const onChange = () => setMatches(media.matches);\n onChange();\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, []);\n\n return matches;\n}\n","import { ALL_CHAIN_FILTER, ALL_CHAIN_PREVIEW_BLOCKCHAINS, DEFAULT_STABLE_SYMBOLS, TRENDS_TOKENS } from \"./config\";\nimport type { ChainKind, PayChain, PayToken, TokenSelectRole } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type SidebarChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n logo: string;\n};\n\nexport function chainsFromTokens(tokens: readonly { blockchain: string; chain: PayChain }[]): PayChain[] {\n const byCode = new Map<string, PayChain>();\n for (const token of tokens) {\n const code = token.chain.blockchain || token.blockchain;\n if (!byCode.has(code)) byCode.set(code, token.chain);\n }\n return Array.from(byCode.values());\n}\n\n/** USD value of a token balance using config `price`. Unknown balance is -1 (sort last). */\nexport function tokenBalanceUsd(\n token: Pick<PayToken, \"price\">,\n formatted: string | null | undefined,\n): number {\n if (formatted == null || formatted === \"\") return -1;\n const amount = Number(formatted);\n if (!Number.isFinite(amount)) return -1;\n const price = Number(token.price);\n return amount * (Number.isFinite(price) ? price : 0);\n}\n\nexport function tokenMatchesSearch(\n token: Pick<PayToken, \"symbol\" | \"providerSymbol\"> & { contractAddress?: string | null },\n query: string,\n): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n if (token.symbol.toLowerCase().includes(q)) return true;\n if (token.providerSymbol.toLowerCase().includes(q)) return true;\n return Boolean(token.contractAddress?.toLowerCase().includes(q));\n}\n\nexport function matchesChainFilter(token: Pick<PayToken, \"blockchain\">, chainFilter: string): boolean {\n if (chainFilter === ALL_CHAIN_FILTER) return true;\n return token.blockchain === chainFilter;\n}\n\nexport function formattedBalancePositive(formatted: string | null | undefined): boolean {\n if (formatted == null || formatted === \"\") return false;\n const amount = Number(formatted);\n return Number.isFinite(amount) && amount > 0;\n}\n\nexport function chainHasBalance<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalance: (token: T) => string | null | undefined,\n): boolean {\n return tokens.some(\n (token) => token.blockchain === blockchain && formattedBalancePositive(getBalance(token)),\n );\n}\n\nexport function chainBalanceUsd<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): number {\n let total = 0;\n for (const token of tokens) {\n if (token.blockchain !== blockchain) continue;\n const usd = getBalanceUsd(token);\n if (usd > 0) total += usd;\n }\n return total;\n}\n\nexport function sortChainsAlpha<T extends { chainName: string }>(chains: readonly T[]): T[] {\n return chains.slice().sort((left, right) => left.chainName.localeCompare(right.chainName));\n}\n\n/** Funded chains first by total USD, then chain name. Hidden balances keep the incoming order. */\nexport function sortChainsForSidebar<T extends Pick<PayToken, \"blockchain\">>(\n chains: SidebarChain[],\n tokens: T[],\n options: {\n showBalances: boolean;\n getBalanceUsd: (token: T) => number;\n },\n): SidebarChain[] {\n if (!options.showBalances) return chains.slice();\n return chains.slice().sort((left, right) => {\n const leftUsd = chainBalanceUsd(left.blockchain, tokens, options.getBalanceUsd);\n const rightUsd = chainBalanceUsd(right.blockchain, tokens, options.getBalanceUsd);\n if (rightUsd !== leftUsd) return rightUsd - leftUsd;\n return left.chainName.localeCompare(right.chainName);\n });\n}\n\nexport function payerRailChains<T extends { blockchain: string; chainKind: string }>(\n chains: readonly T[],\n owners: Partial<Record<string, string | null | undefined>>,\n fundedSet: ReadonlySet<string>,\n): T[] {\n return chains.filter((chain) => {\n if (!owners[chain.chainKind]) return false;\n if (chain.chainKind === \"evm\" && !fundedSet.has(chain.blockchain)) return false;\n return true;\n });\n}\n\nexport function initialChainFilter(\n lockChainKind: ChainKind | null | undefined,\n recentBlockchains: readonly string[],\n chains: readonly SidebarChain[],\n): string {\n if (!lockChainKind) return ALL_CHAIN_FILTER;\n const matching = chains.filter((chain) => chain.chainKind === lockChainKind);\n if (matching.length === 0) return ALL_CHAIN_FILTER;\n for (const code of recentBlockchains) {\n if (matching.some((chain) => chain.blockchain === code)) return code;\n }\n return matching[0].blockchain;\n}\n\nexport function isBlockchainDisabled(\n blockchain: string,\n disabledBlockchains: string[] | null | undefined,\n): boolean {\n if (!disabledBlockchains?.length) return false;\n const code = blockchain.toLowerCase();\n return disabledBlockchains.some((item) => item.toLowerCase() === code);\n}\n\nexport function isChainKindLocked(\n chainKind: ChainKind,\n lockChainKind: ChainKind | null | undefined,\n): boolean {\n return Boolean(lockChainKind && chainKind !== lockChainKind);\n}\n\nconst BALANCE_RANK_FUNDED = 0;\nconst BALANCE_RANK_LOADING = 1;\nconst BALANCE_RANK_EMPTY = 2;\n\nfunction tokenBalanceRank(usd: number, loading: boolean): number {\n if (loading) return BALANCE_RANK_LOADING;\n if (usd > 0) return BALANCE_RANK_FUNDED;\n return BALANCE_RANK_EMPTY;\n}\n\nexport function compareTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(left: T, right: T): number {\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\n/** Positive USD first, then balances still loading, then zero or unknown. */\nexport function sortTokensByBalance<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n isLoading: (token: T) => boolean,\n): T[] {\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(getBalanceUsd(left), isLoading(left));\n const rightRank = tokenBalanceRank(getBalanceUsd(right), isLoading(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = getBalanceUsd(right) - getBalanceUsd(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensBySymbol(left, right);\n });\n}\n\nexport function sortTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(tokens: T[]): T[] {\n return tokens.slice().sort(compareTokensBySymbol);\n}\n\nexport function positiveBalanceTokens<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): T[] {\n return sortTokensByBalance(\n tokens.filter((token) => getBalanceUsd(token) > 0),\n getBalanceUsd,\n () => false,\n );\n}\n\nexport function isGasToken(token: {\n contractAddress?: string | null;\n symbol: string;\n blockchain: string;\n}): boolean {\n const addr = String(token.contractAddress || \"\").trim().toLowerCase();\n if (!addr || addr === \"native\" || addr === ZERO_ADDRESS) return true;\n return token.blockchain === \"near\" && token.symbol.toUpperCase() === \"NEAR\";\n}\n\nexport function stableSymbolIndex(symbol: string, stableSymbols: readonly string[]): number {\n const upper = symbol.toUpperCase();\n return stableSymbols.findIndex((item) => item.toUpperCase() === upper);\n}\n\nexport function tokenPriority(\n token: { contractAddress?: string | null; symbol: string; blockchain: string },\n stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS,\n): number {\n if (stableSymbolIndex(token.symbol, stableSymbols) >= 0) return 0;\n if (isGasToken(token)) return 1;\n return 2;\n}\n\nexport function compareTokensByPriority<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(left: T, right: T, stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS): number {\n const leftPriority = tokenPriority(left, stableSymbols);\n const rightPriority = tokenPriority(right, stableSymbols);\n if (leftPriority !== rightPriority) return leftPriority - rightPriority;\n if (leftPriority === 0) {\n const leftIndex = stableSymbolIndex(left.symbol, stableSymbols);\n const rightIndex = stableSymbolIndex(right.symbol, stableSymbols);\n if (leftIndex !== rightIndex) return leftIndex - rightIndex;\n }\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\nexport function sortTokensForChain<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(\n tokens: readonly T[],\n options: {\n withBalances: boolean;\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n stableSymbols?: readonly string[];\n },\n): T[] {\n const stableSymbols = options.stableSymbols ?? DEFAULT_STABLE_SYMBOLS;\n if (!options.withBalances) {\n return tokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n }\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(options.usdOf(left), options.loadingOf(left));\n const rightRank = tokenBalanceRank(options.usdOf(right), options.loadingOf(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = options.usdOf(right) - options.usdOf(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensByPriority(left, right, stableSymbols);\n });\n}\n\nexport type TrendTokenRef = {\n blockchain: string;\n symbol: string;\n};\n\nexport function trendTokensIn<T extends { blockchain: string; symbol: string }>(\n tokens: readonly T[],\n options: {\n chainFilter: string;\n sortRest: (tokens: T[]) => T[];\n trends?: readonly TrendTokenRef[];\n },\n): T[] {\n const trends = options.trends ?? TRENDS_TOKENS;\n const inScope = tokens.filter((token) => matchesChainFilter(token, options.chainFilter));\n const used = new Set<T>();\n const head: T[] = [];\n for (const ref of trends) {\n if (\n options.chainFilter !== ALL_CHAIN_FILTER\n && ref.blockchain.toLowerCase() !== options.chainFilter.toLowerCase()\n ) continue;\n const match = inScope.find((token) => (\n !used.has(token)\n && token.blockchain.toLowerCase() === ref.blockchain.toLowerCase()\n && token.symbol.toLowerCase() === ref.symbol.toLowerCase()\n ));\n if (!match) continue;\n used.add(match);\n head.push(match);\n }\n return [...head, ...options.sortRest(inScope.filter((token) => !used.has(token)))];\n}\n\n/** Preview logos for the All chain button. Four or fewer chains are all shown. */\nexport function allChainPreview<T extends SidebarChain>(chains: readonly T[]): T[] {\n if (chains.length <= 4) return chains.slice();\n const byCode = new Map(chains.map((chain) => [chain.blockchain.toLowerCase(), chain]));\n const used = new Set<string>();\n const picked: T[] = [];\n const take = (chain: T | undefined) => {\n if (!chain || picked.length >= 4) return;\n const code = chain.blockchain.toLowerCase();\n if (used.has(code)) return;\n used.add(code);\n picked.push(chain);\n };\n const eth = byCode.get(ALL_CHAIN_PREVIEW_BLOCKCHAINS[0]);\n if (eth) take(eth);\n else take(chains.find((chain) => chain.chainKind === \"evm\"));\n take(byCode.get(\"near\"));\n take(byCode.get(\"sol\"));\n take(byCode.get(\"tron\"));\n const fill = chains\n .filter((chain) => chain.chainKind === \"evm\" && !used.has(chain.blockchain.toLowerCase()))\n .slice()\n .sort((left, right) => left.chainName.localeCompare(right.chainName));\n for (const chain of fill) take(chain);\n return picked;\n}\n\n/** Dotted chains first (USD, then name), then the rest by name. All is not included. */\nexport function chainMenuOrder<TChain extends SidebarChain, TToken extends { blockchain: string }>(\n chains: readonly TChain[],\n tokens: readonly TToken[],\n options: {\n dotted: ReadonlySet<string>;\n showBalances: boolean;\n getBalanceUsd: (token: TToken) => number;\n },\n): TChain[] {\n const dotted = chains.filter((chain) => options.dotted.has(chain.blockchain));\n const rest = chains.filter((chain) => !options.dotted.has(chain.blockchain));\n return [\n ...sortChainsForSidebar(dotted, [...tokens], options) as TChain[],\n ...sortChainsAlpha(rest),\n ];\n}\n\nexport function searchTokens<T extends {\n symbol: string;\n providerSymbol: string;\n contractAddress?: string | null;\n chain: { chainName: string };\n}>(\n tokens: readonly T[],\n query: string,\n options: {\n role: TokenSelectRole;\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n },\n): T[] {\n const matched = tokens.filter((token) => tokenMatchesSearch(token, query));\n if (options.role === \"payer\") return sortTokensByBalance(matched, options.usdOf, options.loadingOf);\n return sortTokensBySymbol(matched);\n}\n\nexport function recentTokensInOrder<T extends { assetId: string }>(\n tokens: T[],\n recentAssetIds: readonly string[],\n): T[] {\n const byId = new Map(tokens.map((token) => [token.assetId, token]));\n const result: T[] = [];\n for (const assetId of recentAssetIds) {\n const token = byId.get(assetId);\n if (token) result.push(token);\n }\n return result;\n}\n","import { useSyncExternalStore } from \"react\";\nimport {\n MAX_RECENT_BLOCKCHAINS,\n MAX_RECENT_HISTORY,\n TOKEN_SELECT_PREFS_STORAGE_KEY,\n TOKEN_SELECT_PREFS_VERSION,\n} from \"./config\";\n\nexport type TokenSelectPrefs = {\n recentAssetIds: string[];\n recentSearchAssetIds: string[];\n recentBlockchains: string[];\n};\n\nconst EMPTY_PREFS: TokenSelectPrefs = {\n recentAssetIds: [],\n recentSearchAssetIds: [],\n recentBlockchains: [],\n};\n\nfunction rememberId(recent: string[], assetId: string, max: number): string[] {\n const id = assetId.trim();\n if (!id) return recent;\n return [id, ...recent.filter((item) => item !== id)].slice(0, max);\n}\n\nexport function rememberRecentAsset(recent: string[], assetId: string): string[] {\n return rememberId(recent, assetId, MAX_RECENT_HISTORY);\n}\n\nexport function rememberRecentSearch(recent: string[], assetId: string): string[] {\n return rememberId(recent, assetId, MAX_RECENT_HISTORY);\n}\n\nexport function withoutAssetIds(recent: string[], assetIds: readonly string[]): string[] {\n const drop = new Set(assetIds);\n return recent.filter((id) => !drop.has(id));\n}\n\nexport function rememberRecentBlockchain(recent: string[], blockchain: string): string[] {\n const code = blockchain.trim();\n if (!code) return recent;\n return [code, ...recent.filter((item) => item !== code)].slice(0, MAX_RECENT_BLOCKCHAINS);\n}\n\nfunction cleanIds(value: unknown, max: number): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((id) => typeof id === \"string\" && id.trim()).slice(0, max);\n}\n\nexport function migrateTokenSelectPrefs(persisted: unknown, version: number): TokenSelectPrefs {\n const state = (persisted ?? {}) as {\n lastAssetId?: string | null;\n lastBlockchain?: string | null;\n recentAssetIds?: string[];\n recentSearchAssetIds?: string[];\n recentBlockchains?: string[];\n };\n const recentBlockchains = version >= 1\n ? cleanIds(state.recentBlockchains, MAX_RECENT_BLOCKCHAINS)\n : (typeof state.lastBlockchain === \"string\" && state.lastBlockchain ? [state.lastBlockchain] : []);\n const recentAssetIds = version >= 2 && Array.isArray(state.recentAssetIds)\n ? cleanIds(state.recentAssetIds, MAX_RECENT_HISTORY)\n : (typeof state.lastAssetId === \"string\" && state.lastAssetId ? [state.lastAssetId] : []);\n const recentSearchAssetIds = version >= TOKEN_SELECT_PREFS_VERSION\n ? cleanIds(state.recentSearchAssetIds, MAX_RECENT_HISTORY)\n : [];\n return { recentAssetIds, recentSearchAssetIds, recentBlockchains };\n}\n\nfunction readStorage(): TokenSelectPrefs {\n if (typeof localStorage === \"undefined\") return EMPTY_PREFS;\n try {\n const raw = localStorage.getItem(TOKEN_SELECT_PREFS_STORAGE_KEY);\n if (!raw) return EMPTY_PREFS;\n const parsed = JSON.parse(raw) as { state?: unknown; version?: number };\n const version = typeof parsed.version === \"number\" ? parsed.version : 0;\n const payload = parsed && typeof parsed === \"object\" && \"state\" in parsed ? parsed.state : parsed;\n return migrateTokenSelectPrefs(payload, version);\n } catch {\n return EMPTY_PREFS;\n }\n}\n\nfunction writeStorage(state: TokenSelectPrefs) {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(TOKEN_SELECT_PREFS_STORAGE_KEY, JSON.stringify({\n state,\n version: TOKEN_SELECT_PREFS_VERSION,\n }));\n}\n\nlet prefs = readStorage();\nconst listeners = new Set<() => void>();\n\nfunction emit(next: TokenSelectPrefs) {\n prefs = next;\n writeStorage(next);\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getTokenSelectPrefs(): TokenSelectPrefs {\n return prefs;\n}\n\nexport function setLastToken(assetId: string, blockchain: string) {\n emit({\n ...prefs,\n recentAssetIds: rememberRecentAsset(prefs.recentAssetIds, assetId),\n recentBlockchains: rememberRecentBlockchain(prefs.recentBlockchains, blockchain),\n });\n}\n\nexport function setRecentSearch(assetId: string) {\n emit({\n ...prefs,\n recentSearchAssetIds: rememberRecentSearch(prefs.recentSearchAssetIds, assetId),\n });\n}\n\nexport function removeRecentSearches(assetIds: readonly string[]) {\n emit({\n ...prefs,\n recentSearchAssetIds: withoutAssetIds(prefs.recentSearchAssetIds, assetIds),\n });\n}\n\nexport function setLastBlockchain(blockchain: string) {\n emit({\n ...prefs,\n recentBlockchains: rememberRecentBlockchain(prefs.recentBlockchains, blockchain),\n });\n}\n\nexport function useTokenSelectPrefs(): TokenSelectPrefs {\n return useSyncExternalStore(subscribe, getTokenSelectPrefs, getTokenSelectPrefs);\n}\n","import { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { cx, fontSans } from \"./format\";\nimport { LazyImage } from \"./lazy-image\";\nimport { DEFAULT_TOKEN_LOGO } from \"./logos\";\nimport type { PayToken } from \"./types\";\n\nexport function RecentTiles(props: {\n tokens: readonly PayToken[];\n onSelect: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n}) {\n const { tokens, onSelect, isTokenDisabled } = props;\n if (tokens.length === 0) return null;\n\n return (\n <div className=\"grid grid-cols-5 gap-2 px-5 md:gap-3\">\n {tokens.map((token) => {\n const disabled = Boolean(isTokenDisabled?.(token));\n return (\n <button\n key={token.assetId}\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelect(token)}\n className={cx(\n \"flex h-[72px] cursor-pointer flex-col items-center justify-center gap-1 rounded-[12px] border-0 bg-[#f6f6f6] px-1 hover:bg-[#ededed]\",\n disabled && \"cursor-not-allowed opacity-40 hover:bg-[#f6f6f6]\",\n )}\n >\n <span className=\"relative size-[26px] shrink-0\">\n <LazyImage\n src={token.logo}\n fallbackSrc={DEFAULT_TOKEN_LOGO}\n className=\"size-[26px] rounded-[12px] object-cover\"\n />\n <img\n src={token.chain.logo}\n alt=\"\"\n className=\"absolute -right-1 -bottom-1 size-3 rounded-[4px] border border-white object-cover\"\n />\n </span>\n <span className={cx(\"max-w-full truncate text-sm font-semibold text-black\", fontSans)}>{token.symbol}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function RecentTileSkeletons() {\n return (\n <div className=\"grid grid-cols-5 gap-2 px-5 md:gap-3\" aria-hidden>\n {Array.from({ length: 5 }, (_, index) => (\n <Skeleton key={index} className=\"h-[72px] rounded-[12px]\" />\n ))}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useInView } from \"motion/react\";\n\nexport function LazyImage(props: {\n src: string;\n fallbackSrc: string;\n alt?: string;\n className?: string;\n}) {\n const { src, fallbackSrc, alt = \"\", className } = props;\n const ref = useRef<HTMLSpanElement>(null);\n const inView = useInView(ref, { once: true });\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n\n useEffect(() => {\n setFailedSrc(null);\n }, [src]);\n\n const requested = src.trim();\n const useFallback = requested.length === 0 || failedSrc === requested;\n const shown = useFallback ? fallbackSrc : requested;\n\n return (\n <span ref={ref} className=\"block size-full\">\n {inView ? (\n <img\n src={shown}\n alt={alt}\n className={className}\n onError={() => {\n if (!useFallback) setFailedSrc(requested);\n }}\n />\n ) : null}\n </span>\n );\n}\n","const LOGO_HOST = \"https://assets.dapdap.net\";\n\nconst CHAIN_LOGO_ALIAS: Record<string, string> = {\n eth: \"ethereum\",\n ethereum: \"ethereum\",\n base: \"base\",\n arb: \"arbitrum\",\n arbitrum: \"arbitrum\",\n op: \"optimism\",\n optimism: \"optimism\",\n pol: \"polygon\",\n polygon: \"polygon\",\n bsc: \"bsc\",\n avax: \"avalanche\",\n avalanche: \"avalanche\",\n gnosis: \"gnosis\",\n scroll: \"scroll\",\n xlayer: \"xlayer\",\n bera: \"berachain\",\n berachain: \"berachain\",\n near: \"near\",\n sol: \"solana\",\n solana: \"solana\",\n tron: \"tron\",\n zec: \"zcash\",\n zcash: \"zcash\",\n};\n\nexport const DEFAULT_TOKEN_LOGO = `${LOGO_HOST}/tokens/default_icon.png`;\n\nfunction logoPath(path: string): string {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return `${LOGO_HOST}${normalized}`;\n}\n\nexport function chainLogoUrl(blockchainOrNetwork: string): string {\n const key = String(blockchainOrNetwork || \"\").toLowerCase();\n const file = CHAIN_LOGO_ALIAS[key] || key.replace(/\\s+/g, \"\");\n return logoPath(`/stableflow/networks/${file}.png`);\n}\n\nexport function tokenLogoUrl(symbol: string): string {\n const upper = String(symbol || \"\").toUpperCase();\n const file = upper === \"USDT0\" ? \"usdt\" : upper.toLowerCase();\n return logoPath(`/stableflow/tokens/${file}.png`);\n}\n","import { IconDatabase } from \"@stableflow/pay-ui/icons/solid/database\";\nimport { IconDuration } from \"@stableflow/pay-ui/icons/solid/duration\";\nimport { IconTrends } from \"@stableflow/pay-ui/icons/outline/trends\";\nimport { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { cx, fontSans, formatDisplayAmount, thinScrollbar } from \"./format\";\nimport { LazyImage } from \"./lazy-image\";\nimport { DEFAULT_TOKEN_LOGO } from \"./logos\";\nimport type { PayToken } from \"./types\";\nimport { tokenBalanceUsd } from \"./utils\";\n\nexport type TokenSectionIcon = \"database\" | \"duration\" | \"trends\";\n\nexport type TokenListSection = {\n id: string;\n title: string;\n icon: TokenSectionIcon;\n tokens: PayToken[];\n skeletonRows?: number;\n action?: { label: string; onClick: () => void };\n};\n\nexport type TokenPaneProps = {\n sections: TokenListSection[];\n selectedAssetId?: string | null;\n showBalances?: boolean;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n rowClassName?: string;\n emptyLabel?: string | null;\n};\n\nexport function TokenPane(props: TokenPaneProps) {\n const {\n sections,\n selectedAssetId,\n showBalances = false,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n rowClassName,\n emptyLabel = null,\n } = props;\n\n return (\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-3 pt-3 pb-3\">\n {sections.map((section) => (\n <section key={section.id} className=\"mb-2\">\n {section.title ? (\n <div className=\"mb-1 flex items-center justify-between gap-2 px-[13px]\">\n <span className=\"flex min-w-0 items-center gap-2 text-[#aaa]\">\n <SectionIcon icon={section.icon} />\n <span className={cx(\"truncate text-sm font-medium text-[#aaa]\", fontSans)}>{section.title}</span>\n </span>\n {section.action ? (\n <button\n type=\"button\"\n onClick={section.action.onClick}\n className={cx(\"cursor-pointer border-0 bg-transparent p-0 text-sm font-medium text-[#aaa]\", fontSans)}\n >\n {section.action.label}\n </button>\n ) : null}\n </div>\n ) : null}\n {section.skeletonRows ? <TokenListSkeleton rows={section.skeletonRows} /> : null}\n {section.tokens.map((token) => (\n <TokenRow\n key={`${section.id}-${token.assetId}`}\n token={token}\n selected={token.assetId === selectedAssetId}\n showBalances={showBalances}\n formatted={showBalances ? getBalance(token) : null}\n loadingBalance={showBalances && isBalanceLoading(token)}\n disabled={Boolean(isTokenDisabled?.(token))}\n onSelect={() => onSelectToken(token)}\n className={rowClassName}\n />\n ))}\n </section>\n ))}\n {emptyLabel ? (\n <p className={cx(\"px-[13px] py-4 text-[13px] text-[#606060]\", fontSans)}>{emptyLabel}</p>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SectionIcon(props: { icon: TokenSectionIcon }) {\n const className = \"size-3.5 text-[#aaa]\";\n if (props.icon === \"database\") return <IconDatabase className={className} />;\n if (props.icon === \"duration\") return <IconDuration className={className} />;\n return <IconTrends className={className} />;\n}\n\nexport function TokenListSkeleton(props: { rows: number }) {\n return (\n <div aria-hidden>\n {Array.from({ length: props.rows }, (_, index) => (\n <div key={index} className=\"flex h-[66px] items-center gap-2.5 px-[13px]\">\n <Skeleton className=\"size-8 shrink-0 rounded-full\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <Skeleton className=\"h-3.5 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </span>\n </div>\n ))}\n </div>\n );\n}\n\nexport function TokenRow(props: {\n token: PayToken;\n selected: boolean;\n showBalances: boolean;\n formatted: string | null | undefined;\n loadingBalance: boolean;\n disabled: boolean;\n onSelect: () => void;\n className?: string;\n}) {\n const { token, selected, showBalances, formatted, loadingBalance, disabled, onSelect, className } = props;\n const usd = showBalances && !loadingBalance && formatted != null ? tokenBalanceUsd(token, formatted) : -1;\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onSelect}\n className={cx(\n \"flex h-[66px] w-full cursor-pointer items-center justify-between gap-2 rounded-[12px] border-0 bg-transparent px-[13px] text-left hover:bg-[#f6f6f6]\",\n selected && \"bg-[#f6f6f6]\",\n disabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n className,\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <span className=\"relative size-8 shrink-0\">\n <LazyImage\n src={token.logo}\n fallbackSrc={DEFAULT_TOKEN_LOGO}\n className=\"size-8 rounded-[12px] object-cover\"\n />\n <img\n src={token.chain.logo}\n alt=\"\"\n className=\"absolute -right-0.5 -bottom-0.5 size-3.5 rounded-[4px] border border-white object-cover\"\n />\n </span>\n <span className=\"min-w-0\">\n <span className={cx(\"block truncate text-sm font-semibold text-black\", fontSans)}>{token.symbol}</span>\n <span className={cx(\"mt-0.5 block truncate text-xs text-[#606060]\", fontSans)}>{token.chain.chainName}</span>\n </span>\n </span>\n {showBalances ? (\n <span className=\"shrink-0 text-right\">\n {loadingBalance ? (\n <span\n className=\"inline-block size-3.5 animate-spin rounded-full border-2 border-[#606060] border-r-transparent\"\n aria-label=\"Loading balance\"\n />\n ) : formatted != null ? (\n <>\n <span className={cx(\"block text-sm font-medium text-black\", fontSans)}>\n {formatDisplayAmount(formatted, { prefix: \"\", maxDecimals: 4 })}\n </span>\n {usd >= 0 ? (\n <span className={cx(\"block text-xs text-[#606060]\", fontSans)}>\n {formatDisplayAmount(usd, { prefix: \"$\", showDust: true })}\n </span>\n ) : null}\n </>\n ) : (\n <span className={cx(\"text-sm font-medium text-black\", fontSans)}>-</span>\n )}\n </span>\n ) : null}\n </button>\n );\n}\n","import { cx, fontSans, thinScrollbar } from \"./format\";\nimport { TokenListSkeleton, TokenRow } from \"./token-pane\";\nimport type { PayToken } from \"./types\";\n\nexport type SearchResultsProps = {\n tokens: PayToken[];\n selectedAssetId?: string | null;\n loading: boolean;\n showBalances?: boolean;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n rowClassName?: string;\n};\n\nexport function SearchResults(props: SearchResultsProps) {\n const {\n tokens,\n selectedAssetId,\n loading,\n showBalances = false,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n rowClassName,\n } = props;\n\n return (\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-3 pt-3 pb-3\">\n {loading && tokens.length === 0 ? <TokenListSkeleton rows={6} /> : null}\n {tokens.map((token) => (\n <TokenRow\n key={token.assetId}\n token={token}\n selected={token.assetId === selectedAssetId}\n showBalances={showBalances}\n formatted={showBalances ? getBalance(token) : null}\n loadingBalance={showBalances && isBalanceLoading(token)}\n disabled={Boolean(isTokenDisabled?.(token))}\n onSelect={() => onSelectToken(token)}\n className={rowClassName}\n />\n ))}\n {!loading && tokens.length === 0 ? (\n <p className={cx(\"px-[13px] py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n );\n}\n","export type ChainKind = string;\n\nexport const KNOWN_CHAIN_KINDS = [\"evm\", \"near\", \"solana\", \"tron\", \"zec\"] as const;\n\nexport type PayChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n chainId?: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayToken = {\n assetId: string;\n symbol: string;\n providerSymbol: string;\n blockchain: string;\n decimals: number;\n contractAddress: string | null;\n price: number;\n logo: string;\n supportPayment: boolean;\n supportReceive: boolean;\n chain: PayChain;\n};\n\n/** API-shaped payload. Callers can pass this into their own chain registry. */\nexport type PayConfigSource = {\n chains: PayConfigSourceChain[];\n tokens: PayConfigSourceToken[];\n};\n\nexport type PayConfigSourceChain = {\n network: string;\n chainId: string;\n chainName: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayConfigSourceToken = {\n symbol: string;\n network: string;\n decimals: number;\n contractAddress: string;\n price: string;\n supportPayment: boolean;\n supportReceive: boolean;\n};\n\nexport type WalletAccountInput = {\n address?: string | null;\n icon?: string | null;\n connecting?: boolean;\n /** False inside a Safe App, where the host owns the connection. */\n canDisconnect?: boolean;\n};\n\nexport type PayWallet = {\n accounts: Partial<Record<ChainKind, WalletAccountInput>>;\n connect: (kind: ChainKind) => void | Promise<void>;\n disconnect: (kind: ChainKind) => void | Promise<void>;\n};\n\nexport type BalanceReadSuccess = {\n assetId: string;\n formatted: string;\n /** Integer token units, as a decimal string. */\n raw?: string;\n};\n\nexport type BalanceReadFailure = {\n assetId: string;\n error: string;\n};\n\nexport type BalanceReadResult = BalanceReadSuccess | BalanceReadFailure;\n\nexport type ReadBalances = (batch: {\n owner: string;\n chainKind: ChainKind;\n blockchain: string;\n tokens: PayToken[];\n}) => Promise<BalanceReadResult[]>;\n\nexport type TokenSelectRole = \"payer\" | \"receiver\";\n\nexport type ChainOwners = Partial<Record<string, string>>;\n\n/** Stable identity for the connected owners. Keys are sorted so order does not matter. */\nexport function ownerKey(owners: ChainOwners): string {\n return Object.keys(owners)\n .sort()\n .map((kind) => `${kind}:${owners[kind] ?? \"\"}`)\n .join(\"|\");\n}\n\nexport type TokenBalanceStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n","import { DEFAULT_CHAIN_KINDS } from \"./config\";\nimport { chainLogoUrl, tokenLogoUrl } from \"./logos\";\nimport type { ChainKind, PayChain, PayConfigSource, PayConfigSourceChain, PayConfigSourceToken, PayToken } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst WRAP_NEAR_CONTRACT = \"wrap.near\";\n\ntype ChainKindMap = Partial<Record<string, ChainKind>>;\n\nexport type NormalizePayConfigOptions = {\n chainKinds?: ChainKindMap;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction apiText(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nfunction apiNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction asBoolean(value: unknown, fallback = true): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.trim().toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n return fallback;\n}\n\nfunction mapSourceChain(raw: unknown): PayConfigSourceChain {\n const row = asRecord(raw) ?? {};\n return {\n network: apiText(row.network),\n chainId: apiText(row.chain_id ?? row.chainId),\n chainName: apiText(row.chain_name ?? row.chainName),\n logo: apiText(row.logo),\n explorer: apiText(row.explorer),\n };\n}\n\nfunction mapSourceToken(raw: unknown): PayConfigSourceToken {\n const row = asRecord(raw) ?? {};\n return {\n symbol: apiText(row.symbol),\n network: apiText(row.network),\n decimals: apiNumber(row.decimals) ?? 0,\n contractAddress: apiText(row.contract_address ?? row.contractAddress),\n price: apiText(row.price),\n supportPayment: asBoolean(row.support_payment ?? row.supportPayment),\n supportReceive: asBoolean(row.support_receive ?? row.supportReceive),\n };\n}\n\nfunction configBody(raw: unknown): Record<string, unknown> {\n const row = asRecord(raw) ?? {};\n const data = asRecord(row.data);\n if (typeof row.code === \"number\" && data) return data;\n return row;\n}\n\nexport function mapPayConfigSource(raw: unknown): PayConfigSource {\n const row = configBody(raw);\n const chains = Array.isArray(row.chains) ? row.chains.map(mapSourceChain) : [];\n const tokens = Array.isArray(row.tokens) ? row.tokens.map(mapSourceToken) : [];\n return { chains, tokens };\n}\n\nexport function chainKindFor(network: string, overrides: ChainKindMap = {}): ChainKind | null {\n const key = network.trim().toLowerCase();\n if (!key) return null;\n return overrides[key] ?? DEFAULT_CHAIN_KINDS[key as keyof typeof DEFAULT_CHAIN_KINDS] ?? null;\n}\n\nfunction normalizeSymbol(symbol: string): string | null {\n const upper = symbol.trim().toUpperCase();\n if (!upper) return null;\n if (upper === \"USDT0\") return \"USDT\";\n if (upper === \"WNEAR\") return \"NEAR\";\n return upper;\n}\n\nexport function tokenAssetId(network: string, symbol: string, contractAddress: string | null | undefined): string {\n const addr = String(contractAddress || \"\").trim();\n return `${network}:${symbol}:${addr || \"native\"}`;\n}\n\nfunction isNativeAddress(contractAddress: string | null): boolean {\n const addr = String(contractAddress || \"\").trim();\n if (!addr) return true;\n const lower = addr.toLowerCase();\n return lower === \"native\" || lower === ZERO_ADDRESS;\n}\n\nexport function normalizePayConfig(source: PayConfigSource, options?: NormalizePayConfigOptions): PayToken[] {\n const overrides = options?.chainKinds ?? {};\n const chains: PayChain[] = [];\n for (const chain of source.chains) {\n const chainKind = chainKindFor(chain.network, overrides);\n if (!chainKind || !chain.network) continue;\n chains.push({\n blockchain: chain.network,\n chainName: chain.chainName || chain.network,\n chainKind,\n chainId: chain.chainId || undefined,\n logo: chain.logo || chainLogoUrl(chain.network),\n explorer: chain.explorer,\n });\n }\n const chainByCode = new Map(chains.map((chain) => [chain.blockchain, chain]));\n const tokens: PayToken[] = [];\n for (const token of source.tokens) {\n const chain = chainByCode.get(token.network);\n if (!chain) continue;\n const symbol = normalizeSymbol(token.symbol);\n if (!symbol) continue;\n if (!Number.isInteger(token.decimals) || token.decimals < 0) continue;\n const contractAddress = token.contractAddress.trim() || null;\n tokens.push({\n assetId: tokenAssetId(token.network, symbol, contractAddress),\n symbol,\n providerSymbol: token.symbol,\n blockchain: token.network,\n decimals: token.decimals,\n contractAddress,\n price: Number(token.price || 1),\n logo: tokenLogoUrl(symbol),\n supportPayment: token.supportPayment,\n supportReceive: token.supportReceive,\n chain,\n });\n }\n const hasNearWrap = tokens.some((token) => (\n token.symbol === \"NEAR\" && token.blockchain === \"near\" && token.contractAddress?.toLowerCase() === WRAP_NEAR_CONTRACT\n ));\n if (!hasNearWrap) return tokens;\n return tokens.filter((token) => !(token.symbol === \"NEAR\" && token.blockchain === \"near\" && isNativeAddress(token.contractAddress)));\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","useSyncExternalStore","SearchInput","useEffect","useState","jsx","useEffect","useEffect","jsx","useState","useEffect","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","useEffect","useRef","useState","jsx","jsx","jsxs","Skeleton","Fragment","jsx","jsxs","Skeleton","jsx","jsxs","ownerKey","jsx","jsxs","prefs","useSyncExternalStore","owners","useState","useRef","useEffect","ownerKey","next","SearchInput","ZERO_ADDRESS"]}
|
|
1
|
+
{"version":3,"sources":["../../src/token-select/context.tsx","../../src/token-select/balances.ts","../../src/token-select/config.ts","../../src/token-select/TokenSelectDialog.tsx","../../src/token-select/chain-select.tsx","../../src/token-select/chain-stack.tsx","../../src/token-select/format.ts","../../src/token-select/use-desktop.ts","../../src/token-select/utils.ts","../../src/token-select/prefs.ts","../../src/token-select/recent-tiles.tsx","../../src/token-select/lazy-image.tsx","../../src/token-select/logos.ts","../../src/token-select/token-pane.tsx","../../src/token-select/search-results.tsx","../../src/token-select/types.ts","../../src/token-select/pay-config.ts"],"sourcesContent":["import { useEffect, type ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { clearPayTokenBalances, configureBalanceReaders, setBalanceTokens } from \"./balances\";\nimport { DEFAULT_STABLE_SYMBOLS } from \"./config\";\nimport type { PayToken, PayWallet, ReadBalances } from \"./types\";\n\nexport type PayBalanceMode = \"async\" | \"sync\" | \"none\";\n\ntype PayWidgetsContextValue = {\n tokens: PayToken[];\n loading: boolean;\n wallet: PayWallet;\n stableSymbols: string[];\n chainKindLabels: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n balanceMode: PayBalanceMode;\n getBalance: ((token: PayToken, owner: string) => string | null | undefined) | null;\n isBalanceLoading: ((token: PayToken, owner: string) => boolean) | null;\n};\n\nconst PayWidgetsContext = createContext<PayWidgetsContextValue | null>(null);\n\nexport type PayWidgetsProviderProps = {\n tokens: PayToken[];\n loading?: boolean;\n wallet: PayWallet;\n readBalances?: ReadBalances;\n getBalance?: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading?: (token: PayToken, owner: string) => boolean;\n stableSymbols?: string[];\n chainKindLabels?: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n children: ReactNode;\n};\n\nfunction isProduction() {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n return env === \"production\";\n}\n\nfunction warnBalanceMode(readBalances: ReadBalances | undefined, getBalance: PayWidgetsProviderProps[\"getBalance\"]) {\n if (isProduction()) return;\n if (readBalances && getBalance) {\n console.warn(\"PayWidgetsProvider: both readBalances and getBalance were passed; using readBalances.\");\n return;\n }\n if (!readBalances && !getBalance) {\n console.warn(\"PayWidgetsProvider: pass readBalances or getBalance so token balances can load.\");\n }\n}\n\nexport function PayWidgetsProvider(props: PayWidgetsProviderProps) {\n const {\n tokens,\n loading = false,\n wallet,\n readBalances,\n getBalance,\n isBalanceLoading,\n onCopyAddress,\n stableSymbols = [...DEFAULT_STABLE_SYMBOLS],\n chainKindLabels = {},\n children,\n } = props;\n\n useEffect(() => {\n warnBalanceMode(readBalances, getBalance);\n configureBalanceReaders({\n readBalances: readBalances ?? null,\n getBalance: getBalance ?? null,\n isBalanceLoading: isBalanceLoading ?? null,\n });\n return () => configureBalanceReaders({});\n }, [readBalances, getBalance, isBalanceLoading]);\n\n useEffect(() => {\n setBalanceTokens(tokens);\n }, [tokens]);\n\n const connected = Object.values(wallet.accounts).some((account) => Boolean(account?.address?.trim()));\n useEffect(() => {\n if (!connected) clearPayTokenBalances();\n }, [connected]);\n\n const balanceMode: PayBalanceMode = readBalances ? \"async\" : getBalance ? \"sync\" : \"none\";\n const value: PayWidgetsContextValue = {\n tokens,\n loading,\n wallet,\n stableSymbols,\n chainKindLabels,\n onCopyAddress,\n balanceMode,\n getBalance: balanceMode === \"sync\" ? getBalance ?? null : null,\n isBalanceLoading: balanceMode === \"sync\" ? isBalanceLoading ?? null : null,\n };\n\n return <PayWidgetsContext.Provider value={value}>{children}</PayWidgetsContext.Provider>;\n}\n\nexport function usePayWidgets(): PayWidgetsContextValue {\n const value = useContext(PayWidgetsContext);\n if (!value) {\n throw new Error(\"Token select must be rendered inside PayWidgetsProvider\");\n }\n return value;\n}\n","import { useSyncExternalStore } from \"react\";\nimport { TOKEN_BALANCE_POLL_MS } from \"./config\";\nimport type { BalanceReadResult, ChainKind, ChainOwners, PayToken, ReadBalances, TokenBalanceStatus } from \"./types\";\n\nexport type TokenBalance = {\n raw: string | null;\n formatted: string | null;\n status: TokenBalanceStatus;\n error: string | null;\n updatedAt: number | null;\n};\n\ntype SyncBalanceReader = {\n getBalance: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading: (token: PayToken, owner: string) => boolean;\n};\n\nconst listeners = new Set<() => void>();\nlet balances: Record<string, TokenBalance> = {};\nlet reader: ReadBalances | null = null;\nlet syncReader: SyncBalanceReader | null = null;\nlet tokensById = new Map<string, PayToken>();\nconst chainInflight = new Map<string, Promise<void>>();\n\nexport function configureBalanceReaders(options: {\n readBalances?: ReadBalances | null;\n getBalance?: SyncBalanceReader[\"getBalance\"] | null;\n isBalanceLoading?: SyncBalanceReader[\"isBalanceLoading\"] | null;\n}) {\n reader = options.readBalances ?? null;\n if (!options.readBalances && options.getBalance) {\n syncReader = {\n getBalance: options.getBalance,\n isBalanceLoading: options.isBalanceLoading ?? (() => false),\n };\n return;\n }\n syncReader = null;\n}\n\nexport function setBalanceTokens(tokens: readonly PayToken[]) {\n tokensById = new Map(tokens.map((token) => [token.assetId, token]));\n}\n\nexport function payBalanceMode(): \"async\" | \"sync\" | \"none\" {\n if (reader) return \"async\";\n if (syncReader) return \"sync\";\n return \"none\";\n}\n\nfunction emit() {\n balances = { ...balances };\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function subscribePayTokenBalances(listener: () => void) {\n return subscribe(listener);\n}\n\nexport function getPayTokenBalances() {\n return balances;\n}\n\nfunction ownerKey(owner: string, chainKind: ChainKind): string {\n return chainKind === \"solana\" || chainKind === \"zec\" ? owner : owner.toLowerCase();\n}\n\nfunction balanceKey(owner: string, assetId: string, chainKind: ChainKind): string {\n return `${ownerKey(owner, chainKind)}:${assetId}`;\n}\n\nfunction isFresh(entry: TokenBalance | undefined, now: number): boolean {\n return Boolean(\n entry\n && entry.status === \"success\"\n && entry.updatedAt != null\n && now - entry.updatedAt < TOKEN_BALANCE_POLL_MS,\n );\n}\n\nfunction loadingEntry(prev: TokenBalance | undefined): TokenBalance {\n if (!prev) return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n return { ...prev, status: \"loading\", error: null };\n}\n\nfunction withStaleOnError(prev: TokenBalance | undefined, next: TokenBalance): TokenBalance {\n if (next.status !== \"error\") return next;\n if (prev?.raw == null && prev?.formatted == null) return next;\n return { ...next, raw: prev.raw, formatted: prev.formatted, updatedAt: prev.updatedAt };\n}\n\nexport function setBalanceReader(next: ReadBalances | null) {\n reader = next;\n if (next) syncReader = null;\n}\n\nexport function clearPayTokenBalances() {\n balances = {};\n emit();\n}\n\nfunction syncBalance(owner: string, assetId: string): TokenBalance | undefined {\n if (!syncReader) return undefined;\n const token = tokensById.get(assetId);\n if (!token) return undefined;\n const loading = syncReader.isBalanceLoading(token, owner);\n const formatted = syncReader.getBalance(token, owner);\n if (loading && (formatted == null || formatted === \"\")) {\n return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n }\n if (formatted == null || formatted === \"\") return undefined;\n return { raw: null, formatted, status: \"success\", error: null, updatedAt: null };\n}\n\nexport function getPayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n if (!owner || !assetId) return undefined;\n if (syncReader) return syncBalance(owner, assetId);\n return balances[`${owner}:${assetId}`] ?? balances[`${owner.toLowerCase()}:${assetId}`];\n}\n\nexport function usePayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n const current = useSyncExternalStore(subscribe, getPayTokenBalances, getPayTokenBalances);\n if (!owner || !assetId) return undefined;\n return current[`${owner}:${assetId}`] ?? current[`${owner.toLowerCase()}:${assetId}`];\n}\n\nfunction writeResult(owner: string, token: PayToken, result: BalanceReadResult) {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n const prev = balances[key];\n const next: TokenBalance = \"error\" in result\n ? { raw: null, formatted: null, status: \"error\", error: result.error, updatedAt: Date.now() }\n : { raw: result.raw ?? null, formatted: result.formatted, status: \"success\", error: null, updatedAt: Date.now() };\n balances[key] = withStaleOnError(prev, next);\n}\n\nexport async function refreshPayTokenBalance(owner: string, token: PayToken): Promise<TokenBalance | null> {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n balances[key] = loadingEntry(balances[key]);\n emit();\n if (!reader) {\n balances[key] = withStaleOnError(balances[key], {\n raw: null,\n formatted: null,\n status: \"error\",\n error: \"Balance reader is not configured\",\n updatedAt: Date.now(),\n });\n emit();\n return balances[key] ?? null;\n }\n try {\n const results = await reader({\n owner,\n chainKind: token.chain.chainKind,\n blockchain: token.blockchain,\n tokens: [token],\n });\n const result = results.find((item) => item.assetId === token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n };\n writeResult(owner, token, result);\n } catch (cause) {\n writeResult(owner, token, {\n assetId: token.assetId,\n error: cause instanceof Error ? cause.message : \"Failed to read balance\",\n });\n }\n emit();\n return balances[key] ?? null;\n}\n\nfunction groupByChain(tokens: PayToken[]): Map<string, PayToken[]> {\n const groups = new Map<string, PayToken[]>();\n for (const token of tokens) {\n const list = groups.get(token.blockchain) ?? [];\n list.push(token);\n groups.set(token.blockchain, list);\n }\n return groups;\n}\n\nasync function fetchChain(owner: string, tokens: PayToken[], force: boolean) {\n const blockchain = tokens[0]?.blockchain;\n const kind = tokens[0]?.chain.chainKind;\n if (!blockchain || !kind) return;\n const now = Date.now();\n const stale = tokens.filter((token) => force || !isFresh(balances[balanceKey(owner, token.assetId, kind)], now));\n if (stale.length === 0) return;\n\n const flightKey = `${ownerKey(owner, kind)}:${blockchain}`;\n const pending = chainInflight.get(flightKey);\n if (pending) return pending;\n\n for (const token of stale) {\n const key = balanceKey(owner, token.assetId, kind);\n balances[key] = loadingEntry(balances[key]);\n }\n emit();\n\n const run = (async () => {\n if (!reader) {\n for (const token of stale) {\n writeResult(owner, token, { assetId: token.assetId, error: \"Balance reader is not configured\" });\n }\n emit();\n return;\n }\n try {\n const results = await reader({ owner, chainKind: kind, blockchain, tokens: stale });\n const byId = new Map(results.map((item) => [item.assetId, item]));\n for (const token of stale) {\n writeResult(owner, token, byId.get(token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n });\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"Failed to read balance\";\n for (const token of stale) writeResult(owner, token, { assetId: token.assetId, error: message });\n }\n emit();\n })();\n\n chainInflight.set(flightKey, run);\n return run.finally(() => {\n if (chainInflight.get(flightKey) === run) chainInflight.delete(flightKey);\n });\n}\n\nexport async function ensurePayTokenBalances(\n owners: ChainOwners,\n tokens: PayToken[],\n opts?: { force?: boolean },\n) {\n if (syncReader || !reader) return;\n const force = Boolean(opts?.force);\n const groups = groupByChain(tokens);\n await Promise.all(Array.from(groups.values()).map((group) => {\n const kind = group[0]?.chain.chainKind;\n const owner = kind ? owners[kind] : undefined;\n if (!owner) return Promise.resolve();\n return fetchChain(owner, group, force);\n }));\n}\n","export const TOKEN_BALANCE_POLL_MS = 60_000;\nexport const ALL_CHAIN_FILTER = \"all\";\nexport const DEFAULT_STABLE_SYMBOLS = [\"USDT\", \"USDC\"] as const;\nexport const TOKEN_SELECT_PREFS_STORAGE_KEY = \"stableflow-pay:token-select-prefs:v1\";\nexport const TOKEN_SELECT_PREFS_VERSION = 3;\nexport const MAX_RECENT_BLOCKCHAINS = 16;\nexport const MAX_RECENTLY_USED = 5;\nexport const MAX_RECENT_SEARCHES = 5;\n/** Stored history length so a chain filter can still fill the visible lists. */\nexport const MAX_RECENT_HISTORY = 50;\nexport const YOUR_TOKENS_TITLE = \"Your Tokens\";\nexport const RECENT_SEARCHES_TITLE = \"Recent Searches\";\nexport const TRENDS_TOKEN_TITLE = \"Trends Token\";\nexport const ALL_CHAIN_PREVIEW_BLOCKCHAINS = [\"eth\", \"near\", \"sol\", \"tron\"] as const;\nexport const DESKTOP_MEDIA_QUERY = \"(min-width: 768px)\";\n\n/**\n * Stand-in for the trends API. This constant is the only data source for the Trends Token section.\n * Order: tron USDT, eth USDT, eth USDC, sol USDC, sol USDT, pol USDC, bsc USDT, arb USDT, arb USDC, near USDT.\n */\nexport const TRENDS_TOKENS = [\n { blockchain: \"tron\", symbol: \"USDT\" },\n { blockchain: \"eth\", symbol: \"USDT\" },\n { blockchain: \"eth\", symbol: \"USDC\" },\n { blockchain: \"sol\", symbol: \"USDC\" },\n { blockchain: \"sol\", symbol: \"USDT\" },\n { blockchain: \"pol\", symbol: \"USDC\" },\n { blockchain: \"bsc\", symbol: \"USDT\" },\n { blockchain: \"arb\", symbol: \"USDT\" },\n { blockchain: \"arb\", symbol: \"USDC\" },\n { blockchain: \"near\", symbol: \"USDT\" },\n] as const;\n\nexport const CHAIN_KIND_LABELS: Record<string, string> = {\n evm: \"EVM\",\n near: \"Near\",\n solana: \"Solana\",\n tron: \"Tron\",\n zec: \"Zcash\",\n};\n\n/** Built-in network code to wallet kind. Callers can override unknown codes. */\nexport const DEFAULT_CHAIN_KINDS = {\n eth: \"evm\",\n base: \"evm\",\n arb: \"evm\",\n op: \"evm\",\n pol: \"evm\",\n bsc: \"evm\",\n avax: \"evm\",\n gnosis: \"evm\",\n scroll: \"evm\",\n xlayer: \"evm\",\n bera: \"evm\",\n near: \"near\",\n sol: \"solana\",\n tron: \"tron\",\n zec: \"zec\",\n} as const;\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport { Dialog } from \"@stableflow/pay-ui/dialog\";\nimport { SearchInput } from \"@stableflow/pay-ui/search-input\";\nimport {\n ensurePayTokenBalances,\n getPayTokenBalance,\n getPayTokenBalances,\n subscribePayTokenBalances,\n} from \"./balances\";\nimport {\n ALL_CHAIN_FILTER,\n MAX_RECENT_SEARCHES,\n MAX_RECENTLY_USED,\n RECENT_SEARCHES_TITLE,\n TOKEN_BALANCE_POLL_MS,\n TRENDS_TOKEN_TITLE,\n YOUR_TOKENS_TITLE,\n} from \"./config\";\nimport { ChainSelect } from \"./chain-select\";\nimport { usePayWidgets } from \"./context\";\nimport { cx, fontSans } from \"./format\";\nimport { getTokenSelectPrefs, removeRecentSearches, setLastBlockchain, setLastToken, setRecentSearch, useTokenSelectPrefs } from \"./prefs\";\nimport { RecentTileSkeletons, RecentTiles } from \"./recent-tiles\";\nimport { SearchResults } from \"./search-results\";\nimport { TokenListSkeleton, TokenPane, type TokenListSection } from \"./token-pane\";\nimport { ownerKey, type ChainKind, type ChainOwners, type PayToken, type TokenSelectRole } from \"./types\";\nimport {\n allChainPreview,\n chainHasBalance,\n chainMenuOrder,\n chainsFromTokens,\n compareTokensByPriority,\n initialChainFilter,\n isBlockchainDisabled,\n isChainKindLocked,\n matchesChainFilter,\n payerRailChains,\n positiveBalanceTokens,\n recentTokensInOrder,\n searchTokens,\n sortTokensForChain,\n tokenBalanceUsd,\n trendTokensIn,\n} from \"./utils\";\n\nexport type TokenSelectSelection = {\n token: PayToken;\n};\n\nexport type TokenSelectDialogProps = {\n open: boolean;\n onClose: () => void;\n onSelect: (selection: TokenSelectSelection) => void;\n role?: TokenSelectRole;\n title?: string;\n selectedAssetId?: string | null;\n balanceOwners?: ChainOwners;\n allowedBlockchains?: string[] | null;\n lockChainKind?: ChainKind | null;\n excludeNative?: boolean;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n className?: string;\n titleClassName?: string;\n headerClassName?: string;\n closeClassName?: string;\n contentClassName?: string;\n searchClassName?: string;\n rowClassName?: string;\n};\n\nconst TOKEN_SEARCH_CLASS = \"h-[50px] rounded-[12px] border-[#e3e3e3] bg-[#f6f6f6] pl-[43px] text-sm placeholder:text-black/30\";\nconst TOKEN_SEARCH_ICON_CLASS = \"left-4 size-[19px] text-black\";\n\nfunction ownerForToken(owners: ChainOwners, token: PayToken): string | null {\n return owners[token.chain.chainKind] ?? null;\n}\n\nfunction hasAnyOwner(owners: ChainOwners): boolean {\n return Object.values(owners).some((address) => Boolean(address));\n}\n\nfunction isNativeToken(token: PayToken): boolean {\n const addr = String(token.contractAddress || \"\").trim().toLowerCase();\n return !addr || addr === \"native\" || addr === \"0x0000000000000000000000000000000000000000\";\n}\n\nexport function TokenSelectDialog(props: TokenSelectDialogProps) {\n const {\n open,\n onClose,\n onSelect,\n role = \"payer\",\n title = \"Select Token\",\n selectedAssetId,\n balanceOwners,\n allowedBlockchains = null,\n lockChainKind = null,\n excludeNative = false,\n disabledBlockchains = null,\n disabledReason,\n className,\n titleClassName,\n headerClassName,\n closeClassName,\n contentClassName,\n searchClassName,\n rowClassName,\n } = props;\n const payer = role === \"payer\";\n const showBalances = payer;\n const {\n wallet,\n tokens,\n loading,\n stableSymbols,\n balanceMode,\n getBalance: syncGetBalance,\n isBalanceLoading: syncIsBalanceLoading,\n } = usePayWidgets();\n const prefs = useTokenSelectPrefs();\n const balanceEntries = useSyncExternalStore(subscribePayTokenBalances, getPayTokenBalances, getPayTokenBalances);\n const connectedOwners = useMemo(() => {\n const owners: ChainOwners = {};\n for (const [kind, account] of Object.entries(wallet.accounts)) {\n const address = account?.address?.trim();\n if (address) owners[kind] = address;\n }\n return owners;\n }, [wallet.accounts]);\n const owners = useMemo(\n () => (showBalances ? { ...connectedOwners, ...balanceOwners } : {}),\n [showBalances, connectedOwners, balanceOwners],\n );\n const [search, setSearch] = useState(\"\");\n const [chainFilter, setChainFilter] = useState(ALL_CHAIN_FILTER);\n const userPickedChain = useRef(false);\n const lockRef = useRef(lockChainKind);\n const tokensRef = useRef(tokens);\n lockRef.current = lockChainKind;\n tokensRef.current = tokens;\n\n useEffect(() => {\n if (!open) return;\n userPickedChain.current = false;\n setSearch(\"\");\n setChainFilter(initialChainFilter(\n lockRef.current,\n getTokenSelectPrefs().recentBlockchains,\n chainsFromTokens(tokensRef.current),\n ));\n }, [open]);\n\n useEffect(() => {\n if (!open || !lockChainKind || userPickedChain.current) return;\n setChainFilter(initialChainFilter(lockChainKind, getTokenSelectPrefs().recentBlockchains, chainsFromTokens(tokens)));\n }, [open, lockChainKind, tokens]);\n\n const allowed = useMemo(() => {\n if (!allowedBlockchains || allowedBlockchains.length === 0) return null;\n return new Set(allowedBlockchains.map((code) => code.toLowerCase()));\n }, [allowedBlockchains]);\n\n const scopedTokens = useMemo(() => {\n return tokens.filter((token) => {\n if (allowed && !allowed.has(token.blockchain.toLowerCase())) return false;\n if (excludeNative && isNativeToken(token)) return false;\n if (payer && !token.supportPayment) return false;\n if (!payer && !token.supportReceive) return false;\n return true;\n });\n }, [tokens, allowed, excludeNative, payer]);\n\n const ownersKey = ownerKey(owners);\n const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join(\"|\"), [scopedTokens]);\n const ownersRef = useRef(owners);\n const scopedRef = useRef(scopedTokens);\n ownersRef.current = owners;\n scopedRef.current = scopedTokens;\n\n useEffect(() => {\n if (balanceMode !== \"async\" || !showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current);\n const id = window.setInterval(() => {\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current, { force: true });\n }, TOKEN_BALANCE_POLL_MS);\n return () => window.clearInterval(id);\n }, [balanceMode, showBalances, open, ownersKey, tokenKey]);\n\n function balanceOf(token: PayToken) {\n const owner = ownerForToken(owners, token);\n if (!showBalances || !owner) return undefined;\n if (balanceMode === \"sync\" && syncGetBalance) return syncGetBalance(token, owner) ?? undefined;\n return getPayTokenBalance(owner, token.assetId)?.formatted;\n }\n\n function usdOf(token: PayToken) {\n if (!showBalances) return -1;\n return tokenBalanceUsd(token, balanceOf(token));\n }\n\n function loadingOf(token: PayToken) {\n if (!showBalances) return false;\n const owner = ownerForToken(owners, token);\n if (!owner) return false;\n const formatted = balanceOf(token);\n if (formatted != null && formatted !== \"\") return false;\n if (balanceMode === \"sync\") return syncIsBalanceLoading?.(token, owner) ?? false;\n const entry = getPayTokenBalance(owner, token.assetId);\n return !entry || entry.status === \"loading\";\n }\n\n const availableChains = useMemo(() => chainsFromTokens(scopedTokens), [scopedTokens]);\n const rangeTokens = useMemo(\n () => scopedTokens.filter((token) => matchesChainFilter(token, chainFilter)),\n [scopedTokens, chainFilter],\n );\n\n const fundedBlockchains = useMemo(() => {\n const funded = new Set<string>();\n if (!showBalances) return funded;\n for (const chain of availableChains) {\n if (chainHasBalance(chain.blockchain, scopedTokens, (token) => balanceOf(token))) {\n funded.add(chain.blockchain);\n }\n }\n return funded;\n }, [availableChains, owners, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const dottedChains = useMemo(() => {\n if (!payer) return [];\n return payerRailChains(availableChains, owners, fundedBlockchains);\n }, [payer, availableChains, owners, fundedBlockchains]);\n\n const dottedSet = useMemo(() => new Set(dottedChains.map((chain) => chain.blockchain)), [dottedChains]);\n\n const menuChains = useMemo(() => chainMenuOrder(availableChains, scopedTokens, {\n dotted: dottedSet,\n showBalances,\n getBalanceUsd: (token) => tokenBalanceUsd(token as PayToken, balanceOf(token as PayToken)),\n }), [availableChains, scopedTokens, dottedSet, showBalances, balanceEntries, owners, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const previewChains = useMemo(() => allChainPreview(availableChains), [availableChains]);\n const searching = search.trim().length > 0;\n const rangeWalletConnected = rangeTokens.some((token) => Boolean(owners[token.chain.chainKind]));\n\n const recentTokens = useMemo(\n () => recentTokensInOrder(rangeTokens, prefs.recentAssetIds).slice(0, MAX_RECENTLY_USED),\n [rangeTokens, prefs.recentAssetIds],\n );\n const recentSearches = useMemo(\n () => recentTokensInOrder(rangeTokens, prefs.recentSearchAssetIds).slice(0, MAX_RECENT_SEARCHES),\n [rangeTokens, prefs.recentSearchAssetIds],\n );\n\n const yours = useMemo(() => {\n if (!payer || !rangeWalletConnected) return [];\n return positiveBalanceTokens(rangeTokens, usdOf);\n }, [payer, rangeWalletConnected, rangeTokens, owners, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const trends = useMemo(() => trendTokensIn(rangeTokens, {\n chainFilter,\n sortRest: (rest) => {\n if (chainFilter === ALL_CHAIN_FILTER) {\n return rest.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n }\n const chain = availableChains.find((item) => item.blockchain === chainFilter);\n return sortTokensForChain(rest, {\n withBalances: Boolean(chain && owners[chain.chainKind]),\n usdOf,\n loadingOf,\n stableSymbols,\n });\n },\n }), [rangeTokens, chainFilter, availableChains, owners, stableSymbols, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const receiverTokens = useMemo(\n () => rangeTokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols)),\n [rangeTokens, stableSymbols],\n );\n\n const results = useMemo(() => {\n if (!searching) return [];\n return searchTokens(rangeTokens, search, {\n role: payer ? \"payer\" : \"receiver\",\n usdOf,\n loadingOf,\n });\n }, [searching, rangeTokens, search, payer, owners, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n function handleSelectToken(token: PayToken, fromSearch: boolean) {\n if (isBlockchainDisabled(token.blockchain, disabledBlockchains)) return;\n if (isChainKindLocked(token.chain.chainKind, lockChainKind)) return;\n if (payer) setLastToken(token.assetId, token.blockchain);\n else setLastBlockchain(token.blockchain);\n if (fromSearch && search.trim()) setRecentSearch(token.assetId);\n onSelect({ token });\n onClose();\n }\n\n function clearVisibleSearches() {\n if (chainFilter === ALL_CHAIN_FILTER) {\n removeRecentSearches(prefs.recentSearchAssetIds);\n return;\n }\n const byId = new Map(scopedTokens.map((token) => [token.assetId, token]));\n removeRecentSearches(prefs.recentSearchAssetIds.filter((assetId) => byId.get(assetId)?.blockchain === chainFilter));\n }\n\n const tokenDisabled = (token: PayToken) => (\n isBlockchainDisabled(token.blockchain, disabledBlockchains)\n || isChainKindLocked(token.chain.chainKind, lockChainKind)\n );\n\n const sections = useMemo((): TokenListSection[] => {\n if (loading) {\n const next: TokenListSection[] = [];\n if (payer && rangeWalletConnected) {\n next.push({ id: \"yours\", title: YOUR_TOKENS_TITLE, icon: \"database\", tokens: [], skeletonRows: 2 });\n }\n if (payer && recentSearches.length > 0) {\n next.push({\n id: \"searches\",\n title: RECENT_SEARCHES_TITLE,\n icon: \"duration\",\n tokens: [],\n skeletonRows: 2,\n action: { label: \"Clear\", onClick: clearVisibleSearches },\n });\n }\n if (payer) {\n next.push({ id: \"trends\", title: TRENDS_TOKEN_TITLE, icon: \"trends\", tokens: [], skeletonRows: 6 });\n }\n return next;\n }\n if (!payer) return [];\n const next: TokenListSection[] = [];\n if (yours.length > 0) {\n next.push({ id: \"yours\", title: YOUR_TOKENS_TITLE, icon: \"database\", tokens: yours });\n }\n if (recentSearches.length > 0) {\n next.push({\n id: \"searches\",\n title: RECENT_SEARCHES_TITLE,\n icon: \"duration\",\n tokens: recentSearches,\n action: { label: \"Clear\", onClick: clearVisibleSearches },\n });\n }\n if (trends.length > 0) {\n next.push({ id: \"trends\", title: TRENDS_TOKEN_TITLE, icon: \"trends\", tokens: trends });\n }\n return next;\n }, [loading, payer, rangeWalletConnected, recentSearches, yours, trends, chainFilter, prefs.recentSearchAssetIds, scopedTokens]);\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={title}\n titleClassName={cx(\"text-[18px] font-semibold text-black\", fontSans, titleClassName)}\n headerClassName={cx(\"border-0 px-6 pt-[25px] pb-0\", headerClassName)}\n closeClassName={closeClassName}\n contentClassName={cx(\"overflow-hidden\", contentClassName)}\n cardClassName={cx(\n \"w-full max-h-[90vh] gap-3 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-0 shadow-[0_0_40px_0_rgba(0,0,0,0.06)] md:w-[448px] md:rounded-[12px] md:p-0\",\n className,\n )}\n >\n <div className=\"flex h-[min(620px,70vh)] min-h-0 flex-col gap-2.5\">\n <div className=\"flex shrink-0 items-center gap-3.5 px-5\">\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"min-w-0 flex-1\"\n iconClassName={TOKEN_SEARCH_ICON_CLASS}\n inputClassName={cx(TOKEN_SEARCH_CLASS, searchClassName)}\n />\n <ChainSelect\n chains={menuChains}\n previewChains={previewChains}\n dotted={dottedSet}\n value={chainFilter}\n onChange={(blockchain) => {\n userPickedChain.current = true;\n setChainFilter(blockchain);\n }}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n />\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col gap-2.5\">\n {payer && loading && recentTokens.length > 0 ? <RecentTileSkeletons /> : null}\n {payer && !loading ? (\n <RecentTiles tokens={recentTokens} onSelect={(token) => handleSelectToken(token, false)} isTokenDisabled={tokenDisabled} />\n ) : null}\n {searching ? (\n <SearchResults\n tokens={results}\n selectedAssetId={selectedAssetId}\n loading={loading}\n showBalances={showBalances}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={(token) => handleSelectToken(token, true)}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n />\n ) : payer ? (\n <TokenPane\n sections={sections}\n selectedAssetId={selectedAssetId}\n showBalances={showBalances}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={(token) => handleSelectToken(token, false)}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n emptyLabel={\n recentTokens.length === 0 && sections.every((section) => section.tokens.length === 0 && !section.skeletonRows)\n ? \"No tokens found\"\n : null\n }\n />\n ) : loading ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3\">\n <TokenListSkeleton rows={6} />\n </div>\n ) : (\n <TokenPane\n sections={[{\n id: \"all\",\n title: \"\",\n icon: \"trends\",\n tokens: receiverTokens,\n }]}\n selectedAssetId={selectedAssetId}\n showBalances={false}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={(token) => handleSelectToken(token, false)}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n emptyLabel={receiverTokens.length === 0 ? \"No tokens found\" : null}\n />\n )}\n </div>\n </div>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { IconCheck } from \"@stableflow/pay-ui/icons/outline/check\";\nimport { IconChevron } from \"@stableflow/pay-ui/icons/outline/chevron\";\nimport { Drawer } from \"@stableflow/pay-ui/drawer\";\nimport { SearchInput } from \"@stableflow/pay-ui/search-input\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ChainStack } from \"./chain-stack\";\nimport { ALL_CHAIN_FILTER } from \"./config\";\nimport { usePayWidgets } from \"./context\";\nimport { chainKindLabel, cx, fontSans, thinScrollbar } from \"./format\";\nimport type { ChainKind, PayChain } from \"./types\";\nimport { useDesktop } from \"./use-desktop\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nconst SEARCH_FIELD_CLASS = \"h-[42px] rounded-[12px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30\";\nconst SEARCH_ICON_CLASS = \"left-4 size-[19px] text-black\";\n\nexport type ChainSelectProps = {\n chains: readonly SidebarChain[];\n previewChains: readonly PayChain[];\n dotted: ReadonlySet<string>;\n value: string;\n onChange: (blockchain: string) => void;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n};\n\nexport function ChainSelect(props: ChainSelectProps) {\n const {\n chains,\n previewChains,\n dotted,\n value,\n onChange,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n } = props;\n const { chainKindLabels } = usePayWidgets();\n const isDesktop = useDesktop();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const rootRef = useRef<HTMLDivElement>(null);\n const selected = value === ALL_CHAIN_FILTER ? undefined : chains.find((chain) => chain.blockchain === value);\n\n useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n }, [open]);\n\n useEffect(() => {\n if (!open || !isDesktop) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || rootRef.current?.contains(target)) return;\n setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n event.preventDefault();\n setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [open, isDesktop]);\n\n function reasonFor(chain: SidebarChain): string | undefined {\n if (isBlockchainDisabled(chain.blockchain, disabledBlockchains)) return disabledReason;\n if (isChainKindLocked(chain.chainKind, lockChainKind) && lockChainKind) {\n return `Recipient address is on ${chainKindLabel(lockChainKind, chainKindLabels)}; edit the recipient to change chain`;\n }\n return undefined;\n }\n\n const trimmed = query.trim().toLowerCase();\n const showAll = !trimmed || \"all\".includes(trimmed);\n const visible = chains.filter((chain) => {\n if (!trimmed) return true;\n return chain.chainName.toLowerCase().includes(trimmed) || chain.blockchain.toLowerCase().includes(trimmed);\n });\n const empty = !showAll && visible.length === 0;\n\n function select(blockchain: string) {\n onChange(blockchain);\n setOpen(false);\n }\n\n const menu = (\n <ChainMenu\n showAll={showAll}\n chains={visible}\n previewChains={previewChains}\n dotted={dotted}\n value={value}\n query={query}\n onQueryChange={setQuery}\n empty={empty}\n isDesktop={isDesktop}\n reasonFor={reasonFor}\n onSelect={select}\n />\n );\n\n return (\n <div ref={rootRef} className=\"relative shrink-0\">\n <button\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n className=\"flex h-[50px] w-[70px] cursor-pointer items-center justify-between pl-[9px] pr-[12px] gap-1.5 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] shadow-[0_0_40px_0_rgba(0,0,0,0.06)]\"\n >\n {selected ? (\n <img src={selected.logo} alt=\"\" className=\"size-7 rounded-[8px] object-cover\" />\n ) : (\n <ChainStack chains={previewChains} logoClassName=\"size-[12px] rounded-[2px] object-cover\" />\n )}\n <IconChevron className={cx(\"size-2.5 text-black duration-150\", open ? \"-rotate-90\" : \"rotate-90\")} />\n </button>\n {open && isDesktop ? (\n <div\n role=\"listbox\"\n aria-label=\"Select network\"\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n event.preventDefault();\n setOpen(false);\n }}\n className=\"absolute top-[59px] right-0 z-20 flex max-h-[483px] w-[302px] flex-col rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-4 shadow-[0_0_40px_0_rgba(0,0,0,0.06)]\"\n >\n {menu}\n </div>\n ) : null}\n {!isDesktop ? (\n <Drawer\n open={open}\n onClose={() => setOpen(false)}\n title=\"Select Network\"\n titleClassName={cx(\"text-lg font-semibold text-black\", fontSans)}\n cardClassName=\"max-h-[80vh]\"\n contentClassName=\"overflow-hidden\"\n >\n <div className=\"flex h-[min(483px,60vh)] min-h-0 flex-col\">{menu}</div>\n </Drawer>\n ) : null}\n </div>\n );\n}\n\nfunction ChainMenu(props: {\n showAll: boolean;\n chains: readonly SidebarChain[];\n previewChains: readonly PayChain[];\n dotted: ReadonlySet<string>;\n value: string;\n query: string;\n onQueryChange: (value: string) => void;\n empty: boolean;\n isDesktop: boolean;\n reasonFor: (chain: SidebarChain) => string | undefined;\n onSelect: (blockchain: string) => void;\n}) {\n const {\n showAll,\n chains,\n previewChains,\n dotted,\n value,\n query,\n onQueryChange,\n empty,\n isDesktop,\n reasonFor,\n onSelect,\n } = props;\n\n return (\n <>\n <SearchInput\n value={query}\n onChange={onQueryChange}\n placeholder=\"search network\"\n iconClassName={SEARCH_ICON_CLASS}\n inputClassName={cx(SEARCH_FIELD_CLASS, \"pl-[43px]\")}\n />\n <div className={cx(\"mt-2.5 min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n {showAll ? (\n <ChainOption\n selected={value === ALL_CHAIN_FILTER}\n onSelect={() => onSelect(ALL_CHAIN_FILTER)}\n label=\"All\"\n >\n <ChainStack chains={previewChains} logoClassName=\"size-[15px] rounded-[4px] object-cover\" />\n </ChainOption>\n ) : null}\n {chains.map((chain) => {\n const reason = reasonFor(chain);\n const disabled = Boolean(reason);\n return (\n <ChainOption\n key={chain.blockchain}\n selected={value === chain.blockchain}\n disabled={disabled}\n reason={reason}\n showReason={!isDesktop}\n dotted={dotted.has(chain.blockchain)}\n onSelect={() => onSelect(chain.blockchain)}\n label={chain.chainName}\n >\n <img src={chain.logo} alt=\"\" className=\"size-8 rounded-[8px] object-cover\" />\n </ChainOption>\n );\n })}\n {empty ? (\n <p className={cx(\"px-[13px] py-4 text-[13px] text-[#606060]\", fontSans)}>No networks found</p>\n ) : null}\n </div>\n </>\n );\n}\n\nfunction ChainOption(props: {\n selected: boolean;\n disabled?: boolean;\n reason?: string;\n showReason?: boolean;\n dotted?: boolean;\n onSelect: () => void;\n label: string;\n children: ReactNode;\n}) {\n const { selected, disabled = false, reason, showReason = false, dotted = false, onSelect, label, children } = props;\n const button = (\n <button\n type=\"button\"\n aria-disabled={disabled || undefined}\n onClick={() => {\n if (disabled) return;\n onSelect();\n }}\n className={cx(\n \"flex w-full cursor-pointer items-center gap-3 rounded-[6px] border-0 bg-transparent px-1.5 py-1.5 text-left\",\n selected && \"bg-[#f6f6f6]\",\n disabled && \"cursor-not-allowed\",\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className={cx(\"flex min-w-0 items-center gap-3\", disabled && \"opacity-40\")}>\n <span className=\"flex size-8 shrink-0 items-center justify-center\">{children}</span>\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className={cx(\"truncate text-sm font-medium text-black\", fontSans)}>{label}</span>\n {dotted ? <span className=\"size-2 shrink-0 rounded-full bg-[#6284f5]\" /> : null}\n </span>\n </span>\n {disabled && showReason && reason ? (\n <span className={cx(\"mt-0.5 block pl-11 text-xs font-normal text-[#606060]\", fontSans)}>{reason}</span>\n ) : null}\n </span>\n {selected ? <IconCheck className=\"mr-1 size-2.5 shrink-0 text-black\" /> : null}\n </button>\n );\n\n if (disabled && reason && !showReason) {\n return (\n <Tooltip content={reason} triggerClassName=\"flex w-full\">\n {button}\n </Tooltip>\n );\n }\n return button;\n}\n","import type { PayChain } from \"./types\";\n\nexport function ChainStack(props: { chains: readonly PayChain[]; logoClassName: string }) {\n const { chains, logoClassName } = props;\n return (\n <span className=\"grid grid-cols-2 gap-0.5\">\n {chains.slice(0, 4).map((chain) => (\n <img\n key={chain.blockchain}\n src={chain.logo}\n alt=\"\"\n className={logoClassName}\n />\n ))}\n </span>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CHAIN_KIND_LABELS } from \"./config\";\n\n/** Host-independent sans stack. Underscores in the arbitrary value become spaces. */\nexport const fontSans = \"[font-family:Montserrat,PingFang_SC,system-ui,sans-serif]\";\n\nexport const thinScrollbar = \"[&::-webkit-scrollbar]:w-[4px] [&::-webkit-scrollbar-thumb]:rounded-[12px] [&::-webkit-scrollbar-thumb]:bg-[#d9d9d9] [&::-webkit-scrollbar-track]:bg-transparent supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] [scrollbar-color:#d9d9d9_transparent]\";\n\nexport function cx(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function formatAddress(address: string | null | undefined, prefix = 4, suffix = 5): string {\n if (!address) return \"\";\n if (!address.startsWith(\"0x\") && address.length <= 32) return address;\n if (address.length <= prefix + suffix) return address;\n return `${address.slice(0, prefix)}...${address.slice(-suffix)}`;\n}\n\nexport function chainKindLabel(kind: string, labels?: Record<string, string>): string {\n return labels?.[kind] ?? CHAIN_KIND_LABELS[kind] ?? kind;\n}\n\n/** Truncate a decimal string toward zero and group the integer part. */\nexport function formatDisplayAmount(\n value: string | number,\n options: { maxDecimals?: number; prefix?: string; showDust?: boolean } = {},\n): string {\n const maxDecimals = options.maxDecimals ?? 2;\n const prefix = options.prefix ?? \"\";\n const text = String(value).trim();\n const negative = text.startsWith(\"-\");\n const unsigned = negative ? text.slice(1) : text;\n if (!/^\\d+(\\.\\d+)?$/.test(unsigned)) return `${prefix}0`;\n\n const numeric = Number(unsigned);\n const minUnit = 10 ** -maxDecimals;\n if (options.showDust && numeric > 0 && numeric < minUnit) {\n const dust = `<${minUnit.toFixed(maxDecimals)}`;\n return prefix ? `${prefix} ${dust}` : dust;\n }\n\n const [intPart, fracPart = \"\"] = unsigned.split(\".\");\n const fraction = fracPart.slice(0, maxDecimals).replace(/0+$/, \"\");\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n const body = fraction.length > 0 ? `${grouped}.${fraction}` : grouped;\n return `${prefix}${negative ? \"-\" : \"\"}${body}`;\n}\n","import { useEffect, useState } from \"react\";\nimport { DESKTOP_MEDIA_QUERY } from \"./config\";\n\nexport function useDesktop(): boolean {\n const [matches, setMatches] = useState(() => {\n if (typeof window === \"undefined\") return true;\n return window.matchMedia(DESKTOP_MEDIA_QUERY).matches;\n });\n\n useEffect(() => {\n const media = window.matchMedia(DESKTOP_MEDIA_QUERY);\n const onChange = () => setMatches(media.matches);\n onChange();\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, []);\n\n return matches;\n}\n","import { ALL_CHAIN_FILTER, ALL_CHAIN_PREVIEW_BLOCKCHAINS, DEFAULT_STABLE_SYMBOLS, TRENDS_TOKENS } from \"./config\";\nimport type { ChainKind, PayChain, PayToken, TokenSelectRole } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type SidebarChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n logo: string;\n};\n\nexport function chainsFromTokens(tokens: readonly { blockchain: string; chain: PayChain }[]): PayChain[] {\n const byCode = new Map<string, PayChain>();\n for (const token of tokens) {\n const code = token.chain.blockchain || token.blockchain;\n if (!byCode.has(code)) byCode.set(code, token.chain);\n }\n return Array.from(byCode.values());\n}\n\n/** USD value of a token balance using config `price`. Unknown balance is -1 (sort last). */\nexport function tokenBalanceUsd(\n token: Pick<PayToken, \"price\">,\n formatted: string | null | undefined,\n): number {\n if (formatted == null || formatted === \"\") return -1;\n const amount = Number(formatted);\n if (!Number.isFinite(amount)) return -1;\n const price = Number(token.price);\n return amount * (Number.isFinite(price) ? price : 0);\n}\n\nexport function tokenMatchesSearch(\n token: Pick<PayToken, \"symbol\" | \"providerSymbol\"> & { contractAddress?: string | null },\n query: string,\n): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n if (token.symbol.toLowerCase().includes(q)) return true;\n if (token.providerSymbol.toLowerCase().includes(q)) return true;\n return Boolean(token.contractAddress?.toLowerCase().includes(q));\n}\n\nexport function matchesChainFilter(token: Pick<PayToken, \"blockchain\">, chainFilter: string): boolean {\n if (chainFilter === ALL_CHAIN_FILTER) return true;\n return token.blockchain === chainFilter;\n}\n\nexport function formattedBalancePositive(formatted: string | null | undefined): boolean {\n if (formatted == null || formatted === \"\") return false;\n const amount = Number(formatted);\n return Number.isFinite(amount) && amount > 0;\n}\n\nexport function chainHasBalance<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalance: (token: T) => string | null | undefined,\n): boolean {\n return tokens.some(\n (token) => token.blockchain === blockchain && formattedBalancePositive(getBalance(token)),\n );\n}\n\nexport function chainBalanceUsd<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): number {\n let total = 0;\n for (const token of tokens) {\n if (token.blockchain !== blockchain) continue;\n const usd = getBalanceUsd(token);\n if (usd > 0) total += usd;\n }\n return total;\n}\n\nexport function sortChainsAlpha<T extends { chainName: string }>(chains: readonly T[]): T[] {\n return chains.slice().sort((left, right) => left.chainName.localeCompare(right.chainName));\n}\n\n/** Funded chains first by total USD, then chain name. Hidden balances keep the incoming order. */\nexport function sortChainsForSidebar<T extends Pick<PayToken, \"blockchain\">>(\n chains: SidebarChain[],\n tokens: T[],\n options: {\n showBalances: boolean;\n getBalanceUsd: (token: T) => number;\n },\n): SidebarChain[] {\n if (!options.showBalances) return chains.slice();\n return chains.slice().sort((left, right) => {\n const leftUsd = chainBalanceUsd(left.blockchain, tokens, options.getBalanceUsd);\n const rightUsd = chainBalanceUsd(right.blockchain, tokens, options.getBalanceUsd);\n if (rightUsd !== leftUsd) return rightUsd - leftUsd;\n return left.chainName.localeCompare(right.chainName);\n });\n}\n\nexport function payerRailChains<T extends { blockchain: string; chainKind: string }>(\n chains: readonly T[],\n owners: Partial<Record<string, string | null | undefined>>,\n fundedSet: ReadonlySet<string>,\n): T[] {\n return chains.filter((chain) => {\n if (!owners[chain.chainKind]) return false;\n if (chain.chainKind === \"evm\" && !fundedSet.has(chain.blockchain)) return false;\n return true;\n });\n}\n\nexport function initialChainFilter(\n lockChainKind: ChainKind | null | undefined,\n recentBlockchains: readonly string[],\n chains: readonly SidebarChain[],\n): string {\n if (!lockChainKind) return ALL_CHAIN_FILTER;\n const matching = chains.filter((chain) => chain.chainKind === lockChainKind);\n if (matching.length === 0) return ALL_CHAIN_FILTER;\n for (const code of recentBlockchains) {\n if (matching.some((chain) => chain.blockchain === code)) return code;\n }\n return matching[0].blockchain;\n}\n\nexport function isBlockchainDisabled(\n blockchain: string,\n disabledBlockchains: string[] | null | undefined,\n): boolean {\n if (!disabledBlockchains?.length) return false;\n const code = blockchain.toLowerCase();\n return disabledBlockchains.some((item) => item.toLowerCase() === code);\n}\n\nexport function isChainKindLocked(\n chainKind: ChainKind,\n lockChainKind: ChainKind | null | undefined,\n): boolean {\n return Boolean(lockChainKind && chainKind !== lockChainKind);\n}\n\nconst BALANCE_RANK_FUNDED = 0;\nconst BALANCE_RANK_LOADING = 1;\nconst BALANCE_RANK_EMPTY = 2;\n\nfunction tokenBalanceRank(usd: number, loading: boolean): number {\n if (loading) return BALANCE_RANK_LOADING;\n if (usd > 0) return BALANCE_RANK_FUNDED;\n return BALANCE_RANK_EMPTY;\n}\n\nexport function compareTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(left: T, right: T): number {\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\n/** Positive USD first, then balances still loading, then zero or unknown. */\nexport function sortTokensByBalance<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n isLoading: (token: T) => boolean,\n): T[] {\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(getBalanceUsd(left), isLoading(left));\n const rightRank = tokenBalanceRank(getBalanceUsd(right), isLoading(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = getBalanceUsd(right) - getBalanceUsd(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensBySymbol(left, right);\n });\n}\n\nexport function sortTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(tokens: T[]): T[] {\n return tokens.slice().sort(compareTokensBySymbol);\n}\n\nexport function positiveBalanceTokens<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): T[] {\n return sortTokensByBalance(\n tokens.filter((token) => getBalanceUsd(token) > 0),\n getBalanceUsd,\n () => false,\n );\n}\n\nexport function isGasToken(token: {\n contractAddress?: string | null;\n symbol: string;\n blockchain: string;\n}): boolean {\n const addr = String(token.contractAddress || \"\").trim().toLowerCase();\n if (!addr || addr === \"native\" || addr === ZERO_ADDRESS) return true;\n return token.blockchain === \"near\" && token.symbol.toUpperCase() === \"NEAR\";\n}\n\nexport function stableSymbolIndex(symbol: string, stableSymbols: readonly string[]): number {\n const upper = symbol.toUpperCase();\n return stableSymbols.findIndex((item) => item.toUpperCase() === upper);\n}\n\nexport function tokenPriority(\n token: { contractAddress?: string | null; symbol: string; blockchain: string },\n stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS,\n): number {\n if (stableSymbolIndex(token.symbol, stableSymbols) >= 0) return 0;\n if (isGasToken(token)) return 1;\n return 2;\n}\n\nexport function compareTokensByPriority<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(left: T, right: T, stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS): number {\n const leftPriority = tokenPriority(left, stableSymbols);\n const rightPriority = tokenPriority(right, stableSymbols);\n if (leftPriority !== rightPriority) return leftPriority - rightPriority;\n if (leftPriority === 0) {\n const leftIndex = stableSymbolIndex(left.symbol, stableSymbols);\n const rightIndex = stableSymbolIndex(right.symbol, stableSymbols);\n if (leftIndex !== rightIndex) return leftIndex - rightIndex;\n }\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\nexport function sortTokensForChain<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(\n tokens: readonly T[],\n options: {\n withBalances: boolean;\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n stableSymbols?: readonly string[];\n },\n): T[] {\n const stableSymbols = options.stableSymbols ?? DEFAULT_STABLE_SYMBOLS;\n if (!options.withBalances) {\n return tokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n }\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(options.usdOf(left), options.loadingOf(left));\n const rightRank = tokenBalanceRank(options.usdOf(right), options.loadingOf(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = options.usdOf(right) - options.usdOf(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensByPriority(left, right, stableSymbols);\n });\n}\n\nexport type TrendTokenRef = {\n blockchain: string;\n symbol: string;\n};\n\nexport function trendTokensIn<T extends { blockchain: string; symbol: string }>(\n tokens: readonly T[],\n options: {\n chainFilter: string;\n sortRest: (tokens: T[]) => T[];\n trends?: readonly TrendTokenRef[];\n },\n): T[] {\n const trends = options.trends ?? TRENDS_TOKENS;\n const inScope = tokens.filter((token) => matchesChainFilter(token, options.chainFilter));\n const used = new Set<T>();\n const head: T[] = [];\n for (const ref of trends) {\n if (\n options.chainFilter !== ALL_CHAIN_FILTER\n && ref.blockchain.toLowerCase() !== options.chainFilter.toLowerCase()\n ) continue;\n const match = inScope.find((token) => (\n !used.has(token)\n && token.blockchain.toLowerCase() === ref.blockchain.toLowerCase()\n && token.symbol.toLowerCase() === ref.symbol.toLowerCase()\n ));\n if (!match) continue;\n used.add(match);\n head.push(match);\n }\n return [...head, ...options.sortRest(inScope.filter((token) => !used.has(token)))];\n}\n\n/** Preview logos for the All chain button. Four or fewer chains are all shown. */\nexport function allChainPreview<T extends SidebarChain>(chains: readonly T[]): T[] {\n if (chains.length <= 4) return chains.slice();\n const byCode = new Map(chains.map((chain) => [chain.blockchain.toLowerCase(), chain]));\n const used = new Set<string>();\n const picked: T[] = [];\n const take = (chain: T | undefined) => {\n if (!chain || picked.length >= 4) return;\n const code = chain.blockchain.toLowerCase();\n if (used.has(code)) return;\n used.add(code);\n picked.push(chain);\n };\n const eth = byCode.get(ALL_CHAIN_PREVIEW_BLOCKCHAINS[0]);\n if (eth) take(eth);\n else take(chains.find((chain) => chain.chainKind === \"evm\"));\n take(byCode.get(\"near\"));\n take(byCode.get(\"sol\"));\n take(byCode.get(\"tron\"));\n const fill = chains\n .filter((chain) => chain.chainKind === \"evm\" && !used.has(chain.blockchain.toLowerCase()))\n .slice()\n .sort((left, right) => left.chainName.localeCompare(right.chainName));\n for (const chain of fill) take(chain);\n return picked;\n}\n\n/** Dotted chains first (USD, then name), then the rest by name. All is not included. */\nexport function chainMenuOrder<TChain extends SidebarChain, TToken extends { blockchain: string }>(\n chains: readonly TChain[],\n tokens: readonly TToken[],\n options: {\n dotted: ReadonlySet<string>;\n showBalances: boolean;\n getBalanceUsd: (token: TToken) => number;\n },\n): TChain[] {\n const dotted = chains.filter((chain) => options.dotted.has(chain.blockchain));\n const rest = chains.filter((chain) => !options.dotted.has(chain.blockchain));\n return [\n ...sortChainsForSidebar(dotted, [...tokens], options) as TChain[],\n ...sortChainsAlpha(rest),\n ];\n}\n\nexport function searchTokens<T extends {\n symbol: string;\n providerSymbol: string;\n contractAddress?: string | null;\n chain: { chainName: string };\n}>(\n tokens: readonly T[],\n query: string,\n options: {\n role: TokenSelectRole;\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n },\n): T[] {\n const matched = tokens.filter((token) => tokenMatchesSearch(token, query));\n if (options.role === \"payer\") return sortTokensByBalance(matched, options.usdOf, options.loadingOf);\n return sortTokensBySymbol(matched);\n}\n\nexport function recentTokensInOrder<T extends { assetId: string }>(\n tokens: T[],\n recentAssetIds: readonly string[],\n): T[] {\n const byId = new Map(tokens.map((token) => [token.assetId, token]));\n const result: T[] = [];\n for (const assetId of recentAssetIds) {\n const token = byId.get(assetId);\n if (token) result.push(token);\n }\n return result;\n}\n","import { useSyncExternalStore } from \"react\";\nimport {\n MAX_RECENT_BLOCKCHAINS,\n MAX_RECENT_HISTORY,\n TOKEN_SELECT_PREFS_STORAGE_KEY,\n TOKEN_SELECT_PREFS_VERSION,\n} from \"./config\";\n\nexport type TokenSelectPrefs = {\n recentAssetIds: string[];\n recentSearchAssetIds: string[];\n recentBlockchains: string[];\n};\n\nconst EMPTY_PREFS: TokenSelectPrefs = {\n recentAssetIds: [],\n recentSearchAssetIds: [],\n recentBlockchains: [],\n};\n\nfunction rememberId(recent: string[], assetId: string, max: number): string[] {\n const id = assetId.trim();\n if (!id) return recent;\n return [id, ...recent.filter((item) => item !== id)].slice(0, max);\n}\n\nexport function rememberRecentAsset(recent: string[], assetId: string): string[] {\n return rememberId(recent, assetId, MAX_RECENT_HISTORY);\n}\n\nexport function rememberRecentSearch(recent: string[], assetId: string): string[] {\n return rememberId(recent, assetId, MAX_RECENT_HISTORY);\n}\n\nexport function withoutAssetIds(recent: string[], assetIds: readonly string[]): string[] {\n const drop = new Set(assetIds);\n return recent.filter((id) => !drop.has(id));\n}\n\nexport function rememberRecentBlockchain(recent: string[], blockchain: string): string[] {\n const code = blockchain.trim();\n if (!code) return recent;\n return [code, ...recent.filter((item) => item !== code)].slice(0, MAX_RECENT_BLOCKCHAINS);\n}\n\nfunction cleanIds(value: unknown, max: number): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((id) => typeof id === \"string\" && id.trim()).slice(0, max);\n}\n\nexport function migrateTokenSelectPrefs(persisted: unknown, version: number): TokenSelectPrefs {\n const state = (persisted ?? {}) as {\n lastAssetId?: string | null;\n lastBlockchain?: string | null;\n recentAssetIds?: string[];\n recentSearchAssetIds?: string[];\n recentBlockchains?: string[];\n };\n const recentBlockchains = version >= 1\n ? cleanIds(state.recentBlockchains, MAX_RECENT_BLOCKCHAINS)\n : (typeof state.lastBlockchain === \"string\" && state.lastBlockchain ? [state.lastBlockchain] : []);\n const recentAssetIds = version >= 2 && Array.isArray(state.recentAssetIds)\n ? cleanIds(state.recentAssetIds, MAX_RECENT_HISTORY)\n : (typeof state.lastAssetId === \"string\" && state.lastAssetId ? [state.lastAssetId] : []);\n const recentSearchAssetIds = version >= TOKEN_SELECT_PREFS_VERSION\n ? cleanIds(state.recentSearchAssetIds, MAX_RECENT_HISTORY)\n : [];\n return { recentAssetIds, recentSearchAssetIds, recentBlockchains };\n}\n\nfunction readStorage(): TokenSelectPrefs {\n if (typeof localStorage === \"undefined\") return EMPTY_PREFS;\n try {\n const raw = localStorage.getItem(TOKEN_SELECT_PREFS_STORAGE_KEY);\n if (!raw) return EMPTY_PREFS;\n const parsed = JSON.parse(raw) as { state?: unknown; version?: number };\n const version = typeof parsed.version === \"number\" ? parsed.version : 0;\n const payload = parsed && typeof parsed === \"object\" && \"state\" in parsed ? parsed.state : parsed;\n return migrateTokenSelectPrefs(payload, version);\n } catch {\n return EMPTY_PREFS;\n }\n}\n\nfunction writeStorage(state: TokenSelectPrefs) {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(TOKEN_SELECT_PREFS_STORAGE_KEY, JSON.stringify({\n state,\n version: TOKEN_SELECT_PREFS_VERSION,\n }));\n}\n\nlet prefs = readStorage();\nconst listeners = new Set<() => void>();\n\nfunction emit(next: TokenSelectPrefs) {\n prefs = next;\n writeStorage(next);\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getTokenSelectPrefs(): TokenSelectPrefs {\n return prefs;\n}\n\nexport function setLastToken(assetId: string, blockchain: string) {\n emit({\n ...prefs,\n recentAssetIds: rememberRecentAsset(prefs.recentAssetIds, assetId),\n recentBlockchains: rememberRecentBlockchain(prefs.recentBlockchains, blockchain),\n });\n}\n\nexport function setRecentSearch(assetId: string) {\n emit({\n ...prefs,\n recentSearchAssetIds: rememberRecentSearch(prefs.recentSearchAssetIds, assetId),\n });\n}\n\nexport function removeRecentSearches(assetIds: readonly string[]) {\n emit({\n ...prefs,\n recentSearchAssetIds: withoutAssetIds(prefs.recentSearchAssetIds, assetIds),\n });\n}\n\nexport function setLastBlockchain(blockchain: string) {\n emit({\n ...prefs,\n recentBlockchains: rememberRecentBlockchain(prefs.recentBlockchains, blockchain),\n });\n}\n\nexport function useTokenSelectPrefs(): TokenSelectPrefs {\n return useSyncExternalStore(subscribe, getTokenSelectPrefs, getTokenSelectPrefs);\n}\n","import { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { cx, fontSans } from \"./format\";\nimport { LazyImage } from \"./lazy-image\";\nimport { DEFAULT_TOKEN_LOGO } from \"./logos\";\nimport type { PayToken } from \"./types\";\n\nexport function RecentTiles(props: {\n tokens: readonly PayToken[];\n onSelect: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n}) {\n const { tokens, onSelect, isTokenDisabled } = props;\n if (tokens.length === 0) return null;\n\n return (\n <div className=\"grid grid-cols-5 gap-2 px-5 md:gap-3\">\n {tokens.map((token) => {\n const disabled = Boolean(isTokenDisabled?.(token));\n return (\n <button\n key={token.assetId}\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelect(token)}\n className={cx(\n \"flex h-[72px] cursor-pointer flex-col items-center justify-center gap-1 rounded-[12px] border-0 bg-[#f6f6f6] px-1 hover:bg-[#ededed]\",\n disabled && \"cursor-not-allowed opacity-40 hover:bg-[#f6f6f6]\",\n )}\n >\n <span className=\"relative size-[26px] shrink-0\">\n <LazyImage\n src={token.logo}\n fallbackSrc={DEFAULT_TOKEN_LOGO}\n className=\"size-[26px] rounded-[12px] object-cover\"\n />\n <img\n src={token.chain.logo}\n alt=\"\"\n className=\"absolute -right-1 -bottom-1 size-3 rounded-[4px] border border-white object-cover\"\n />\n </span>\n <span className={cx(\"max-w-full truncate text-sm font-semibold text-black\", fontSans)}>{token.symbol}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function RecentTileSkeletons() {\n return (\n <div className=\"grid grid-cols-5 gap-2 px-5 md:gap-3\" aria-hidden>\n {Array.from({ length: 5 }, (_, index) => (\n <Skeleton key={index} className=\"h-[72px] rounded-[12px]\" />\n ))}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useInView } from \"motion/react\";\n\nexport function LazyImage(props: {\n src: string;\n fallbackSrc: string;\n alt?: string;\n className?: string;\n}) {\n const { src, fallbackSrc, alt = \"\", className } = props;\n const ref = useRef<HTMLSpanElement>(null);\n const inView = useInView(ref, { once: true });\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n\n useEffect(() => {\n setFailedSrc(null);\n }, [src]);\n\n const requested = src.trim();\n const useFallback = requested.length === 0 || failedSrc === requested;\n const shown = useFallback ? fallbackSrc : requested;\n\n return (\n <span ref={ref} className=\"block size-full\">\n {inView ? (\n <img\n src={shown}\n alt={alt}\n className={className}\n onError={() => {\n if (!useFallback) setFailedSrc(requested);\n }}\n />\n ) : null}\n </span>\n );\n}\n","const LOGO_HOST = \"https://assets.dapdap.net\";\n\nconst CHAIN_LOGO_ALIAS: Record<string, string> = {\n eth: \"ethereum\",\n ethereum: \"ethereum\",\n base: \"base\",\n arb: \"arbitrum\",\n arbitrum: \"arbitrum\",\n op: \"optimism\",\n optimism: \"optimism\",\n pol: \"polygon\",\n polygon: \"polygon\",\n bsc: \"bsc\",\n avax: \"avalanche\",\n avalanche: \"avalanche\",\n gnosis: \"gnosis\",\n scroll: \"scroll\",\n xlayer: \"xlayer\",\n bera: \"berachain\",\n berachain: \"berachain\",\n near: \"near\",\n sol: \"solana\",\n solana: \"solana\",\n tron: \"tron\",\n zec: \"zcash\",\n zcash: \"zcash\",\n};\n\nexport const DEFAULT_TOKEN_LOGO = `${LOGO_HOST}/tokens/default_icon.png`;\n\nfunction logoPath(path: string): string {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return `${LOGO_HOST}${normalized}`;\n}\n\nexport function chainLogoUrl(blockchainOrNetwork: string): string {\n const key = String(blockchainOrNetwork || \"\").toLowerCase();\n const file = CHAIN_LOGO_ALIAS[key] || key.replace(/\\s+/g, \"\");\n return logoPath(`/stableflow/networks/${file}.png`);\n}\n\nexport function tokenLogoUrl(symbol: string): string {\n const upper = String(symbol || \"\").toUpperCase();\n const file = upper === \"USDT0\" ? \"usdt\" : upper.toLowerCase();\n return logoPath(`/stableflow/tokens/${file}.png`);\n}\n","import { IconDatabase } from \"@stableflow/pay-ui/icons/solid/database\";\nimport { IconDuration } from \"@stableflow/pay-ui/icons/solid/duration\";\nimport { IconTrends } from \"@stableflow/pay-ui/icons/outline/trends\";\nimport { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { cx, fontSans, formatDisplayAmount, thinScrollbar } from \"./format\";\nimport { LazyImage } from \"./lazy-image\";\nimport { DEFAULT_TOKEN_LOGO } from \"./logos\";\nimport type { PayToken } from \"./types\";\nimport { tokenBalanceUsd } from \"./utils\";\n\nexport type TokenSectionIcon = \"database\" | \"duration\" | \"trends\";\n\nexport type TokenListSection = {\n id: string;\n title: string;\n icon: TokenSectionIcon;\n tokens: PayToken[];\n skeletonRows?: number;\n action?: { label: string; onClick: () => void };\n};\n\nexport type TokenPaneProps = {\n sections: TokenListSection[];\n selectedAssetId?: string | null;\n showBalances?: boolean;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n rowClassName?: string;\n emptyLabel?: string | null;\n};\n\nexport function TokenPane(props: TokenPaneProps) {\n const {\n sections,\n selectedAssetId,\n showBalances = false,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n rowClassName,\n emptyLabel = null,\n } = props;\n\n return (\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-3 pt-3 pb-3\">\n {sections.map((section) => (\n <section key={section.id} className=\"mb-2\">\n {section.title ? (\n <div className=\"mb-1 flex items-center justify-between gap-2 px-[13px]\">\n <span className=\"flex min-w-0 items-center gap-2 text-[#aaa]\">\n <SectionIcon icon={section.icon} />\n <span className={cx(\"truncate text-sm font-medium text-[#aaa]\", fontSans)}>{section.title}</span>\n </span>\n {section.action ? (\n <button\n type=\"button\"\n onClick={section.action.onClick}\n className={cx(\"cursor-pointer border-0 bg-transparent p-0 text-sm font-medium text-[#aaa]\", fontSans)}\n >\n {section.action.label}\n </button>\n ) : null}\n </div>\n ) : null}\n {section.skeletonRows ? <TokenListSkeleton rows={section.skeletonRows} /> : null}\n {section.tokens.map((token) => (\n <TokenRow\n key={`${section.id}-${token.assetId}`}\n token={token}\n selected={token.assetId === selectedAssetId}\n showBalances={showBalances}\n formatted={showBalances ? getBalance(token) : null}\n loadingBalance={showBalances && isBalanceLoading(token)}\n disabled={Boolean(isTokenDisabled?.(token))}\n onSelect={() => onSelectToken(token)}\n className={rowClassName}\n />\n ))}\n </section>\n ))}\n {emptyLabel ? (\n <p className={cx(\"px-[13px] py-4 text-[13px] text-[#606060]\", fontSans)}>{emptyLabel}</p>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SectionIcon(props: { icon: TokenSectionIcon }) {\n const className = \"size-3.5 text-[#aaa]\";\n if (props.icon === \"database\") return <IconDatabase className={className} />;\n if (props.icon === \"duration\") return <IconDuration className={className} />;\n return <IconTrends className={className} />;\n}\n\nexport function TokenListSkeleton(props: { rows: number }) {\n return (\n <div aria-hidden>\n {Array.from({ length: props.rows }, (_, index) => (\n <div key={index} className=\"flex h-[66px] items-center gap-2.5 px-[13px]\">\n <Skeleton className=\"size-8 shrink-0 rounded-full\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <Skeleton className=\"h-3.5 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </span>\n </div>\n ))}\n </div>\n );\n}\n\nexport function TokenRow(props: {\n token: PayToken;\n selected: boolean;\n showBalances: boolean;\n formatted: string | null | undefined;\n loadingBalance: boolean;\n disabled: boolean;\n onSelect: () => void;\n className?: string;\n}) {\n const { token, selected, showBalances, formatted, loadingBalance, disabled, onSelect, className } = props;\n const usd = showBalances && !loadingBalance && formatted != null ? tokenBalanceUsd(token, formatted) : -1;\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onSelect}\n className={cx(\n \"flex h-[66px] w-full cursor-pointer items-center justify-between gap-2 rounded-[12px] border-0 bg-transparent px-[13px] text-left hover:bg-[#f6f6f6]\",\n selected && \"bg-[#f6f6f6]\",\n disabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n className,\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <span className=\"relative size-8 shrink-0\">\n <LazyImage\n src={token.logo}\n fallbackSrc={DEFAULT_TOKEN_LOGO}\n className=\"size-8 rounded-[12px] object-cover\"\n />\n <img\n src={token.chain.logo}\n alt=\"\"\n className=\"absolute -right-0.5 -bottom-0.5 size-3.5 rounded-[4px] border border-white object-cover\"\n />\n </span>\n <span className=\"min-w-0\">\n <span className={cx(\"block truncate text-sm font-semibold text-black\", fontSans)}>{token.symbol}</span>\n <span className={cx(\"mt-0.5 block truncate text-xs text-[#606060]\", fontSans)}>{token.chain.chainName}</span>\n </span>\n </span>\n {showBalances ? (\n <span className=\"shrink-0 text-right\">\n {loadingBalance ? (\n <span\n className=\"inline-block size-3.5 animate-spin rounded-full border-2 border-[#606060] border-r-transparent\"\n aria-label=\"Loading balance\"\n />\n ) : formatted != null ? (\n <>\n <span className={cx(\"block text-sm font-medium text-black\", fontSans)}>\n {formatDisplayAmount(formatted, { prefix: \"\", maxDecimals: 4 })}\n </span>\n {usd >= 0 ? (\n <span className={cx(\"block text-xs text-[#606060]\", fontSans)}>\n {formatDisplayAmount(usd, { prefix: \"$\", showDust: true })}\n </span>\n ) : null}\n </>\n ) : (\n <span className={cx(\"text-sm font-medium text-black\", fontSans)}>-</span>\n )}\n </span>\n ) : null}\n </button>\n );\n}\n","import { cx, fontSans, thinScrollbar } from \"./format\";\nimport { TokenListSkeleton, TokenRow } from \"./token-pane\";\nimport type { PayToken } from \"./types\";\n\nexport type SearchResultsProps = {\n tokens: PayToken[];\n selectedAssetId?: string | null;\n loading: boolean;\n showBalances?: boolean;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n rowClassName?: string;\n};\n\nexport function SearchResults(props: SearchResultsProps) {\n const {\n tokens,\n selectedAssetId,\n loading,\n showBalances = false,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n rowClassName,\n } = props;\n\n return (\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-3 pt-3 pb-3\">\n {loading && tokens.length === 0 ? <TokenListSkeleton rows={6} /> : null}\n {tokens.map((token) => (\n <TokenRow\n key={token.assetId}\n token={token}\n selected={token.assetId === selectedAssetId}\n showBalances={showBalances}\n formatted={showBalances ? getBalance(token) : null}\n loadingBalance={showBalances && isBalanceLoading(token)}\n disabled={Boolean(isTokenDisabled?.(token))}\n onSelect={() => onSelectToken(token)}\n className={rowClassName}\n />\n ))}\n {!loading && tokens.length === 0 ? (\n <p className={cx(\"px-[13px] py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n );\n}\n","export type ChainKind = string;\n\nexport const KNOWN_CHAIN_KINDS = [\"evm\", \"near\", \"solana\", \"tron\", \"zec\"] as const;\n\nexport type PayChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n chainId?: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayToken = {\n assetId: string;\n symbol: string;\n providerSymbol: string;\n blockchain: string;\n decimals: number;\n contractAddress: string | null;\n price: number;\n logo: string;\n supportPayment: boolean;\n supportReceive: boolean;\n chain: PayChain;\n};\n\n/** API-shaped payload. Callers can pass this into their own chain registry. */\nexport type PayConfigSource = {\n chains: PayConfigSourceChain[];\n tokens: PayConfigSourceToken[];\n};\n\nexport type PayConfigSourceChain = {\n network: string;\n chainId: string;\n chainName: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayConfigSourceToken = {\n symbol: string;\n network: string;\n decimals: number;\n contractAddress: string;\n price: string;\n supportPayment: boolean;\n supportReceive: boolean;\n};\n\nexport type WalletAccountInput = {\n address?: string | null;\n icon?: string | null;\n connecting?: boolean;\n /** False inside a Safe App, where the host owns the connection. */\n canDisconnect?: boolean;\n};\n\nexport type PayWallet = {\n accounts: Partial<Record<ChainKind, WalletAccountInput>>;\n connect: (kind: ChainKind) => void | Promise<void>;\n disconnect: (kind: ChainKind) => void | Promise<void>;\n};\n\nexport type BalanceReadSuccess = {\n assetId: string;\n formatted: string;\n /** Integer token units, as a decimal string. */\n raw?: string;\n};\n\nexport type BalanceReadFailure = {\n assetId: string;\n error: string;\n};\n\nexport type BalanceReadResult = BalanceReadSuccess | BalanceReadFailure;\n\nexport type ReadBalances = (batch: {\n owner: string;\n chainKind: ChainKind;\n blockchain: string;\n tokens: PayToken[];\n}) => Promise<BalanceReadResult[]>;\n\nexport type TokenSelectRole = \"payer\" | \"receiver\";\n\nexport type ChainOwners = Partial<Record<string, string>>;\n\n/** Stable identity for the connected owners. Keys are sorted so order does not matter. */\nexport function ownerKey(owners: ChainOwners): string {\n return Object.keys(owners)\n .sort()\n .map((kind) => `${kind}:${owners[kind] ?? \"\"}`)\n .join(\"|\");\n}\n\nexport type TokenBalanceStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n","import { DEFAULT_CHAIN_KINDS } from \"./config\";\nimport { chainLogoUrl, tokenLogoUrl } from \"./logos\";\nimport type { ChainKind, PayChain, PayConfigSource, PayConfigSourceChain, PayConfigSourceToken, PayToken } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst WRAP_NEAR_CONTRACT = \"wrap.near\";\n\ntype ChainKindMap = Partial<Record<string, ChainKind>>;\n\nexport type NormalizePayConfigOptions = {\n chainKinds?: ChainKindMap;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction apiText(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nfunction apiNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction asBoolean(value: unknown, fallback = true): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.trim().toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n return fallback;\n}\n\nfunction mapSourceChain(raw: unknown): PayConfigSourceChain {\n const row = asRecord(raw) ?? {};\n return {\n network: apiText(row.network),\n chainId: apiText(row.chain_id ?? row.chainId),\n chainName: apiText(row.chain_name ?? row.chainName),\n logo: apiText(row.logo),\n explorer: apiText(row.explorer),\n };\n}\n\nfunction mapSourceToken(raw: unknown): PayConfigSourceToken {\n const row = asRecord(raw) ?? {};\n return {\n symbol: apiText(row.symbol),\n network: apiText(row.network),\n decimals: apiNumber(row.decimals) ?? 0,\n contractAddress: apiText(row.contract_address ?? row.contractAddress),\n price: apiText(row.price),\n supportPayment: asBoolean(row.support_payment ?? row.supportPayment),\n supportReceive: asBoolean(row.support_receive ?? row.supportReceive),\n };\n}\n\nfunction configBody(raw: unknown): Record<string, unknown> {\n const row = asRecord(raw) ?? {};\n const data = asRecord(row.data);\n if (typeof row.code === \"number\" && data) return data;\n return row;\n}\n\nexport function mapPayConfigSource(raw: unknown): PayConfigSource {\n const row = configBody(raw);\n const chains = Array.isArray(row.chains) ? row.chains.map(mapSourceChain) : [];\n const tokens = Array.isArray(row.tokens) ? row.tokens.map(mapSourceToken) : [];\n return { chains, tokens };\n}\n\nexport function chainKindFor(network: string, overrides: ChainKindMap = {}): ChainKind | null {\n const key = network.trim().toLowerCase();\n if (!key) return null;\n return overrides[key] ?? DEFAULT_CHAIN_KINDS[key as keyof typeof DEFAULT_CHAIN_KINDS] ?? null;\n}\n\nfunction normalizeSymbol(symbol: string): string | null {\n const upper = symbol.trim().toUpperCase();\n if (!upper) return null;\n if (upper === \"USDT0\") return \"USDT\";\n if (upper === \"WNEAR\") return \"NEAR\";\n return upper;\n}\n\nexport function tokenAssetId(network: string, symbol: string, contractAddress: string | null | undefined): string {\n const addr = String(contractAddress || \"\").trim();\n return `${network}:${symbol}:${addr || \"native\"}`;\n}\n\nfunction isNativeAddress(contractAddress: string | null): boolean {\n const addr = String(contractAddress || \"\").trim();\n if (!addr) return true;\n const lower = addr.toLowerCase();\n return lower === \"native\" || lower === ZERO_ADDRESS;\n}\n\nexport function normalizePayConfig(source: PayConfigSource, options?: NormalizePayConfigOptions): PayToken[] {\n const overrides = options?.chainKinds ?? {};\n const chains: PayChain[] = [];\n for (const chain of source.chains) {\n const chainKind = chainKindFor(chain.network, overrides);\n if (!chainKind || !chain.network) continue;\n chains.push({\n blockchain: chain.network,\n chainName: chain.chainName || chain.network,\n chainKind,\n chainId: chain.chainId || undefined,\n logo: chain.logo || chainLogoUrl(chain.network),\n explorer: chain.explorer,\n });\n }\n const chainByCode = new Map(chains.map((chain) => [chain.blockchain, chain]));\n const tokens: PayToken[] = [];\n for (const token of source.tokens) {\n const chain = chainByCode.get(token.network);\n if (!chain) continue;\n const symbol = normalizeSymbol(token.symbol);\n if (!symbol) continue;\n if (!Number.isInteger(token.decimals) || token.decimals < 0) continue;\n const contractAddress = token.contractAddress.trim() || null;\n tokens.push({\n assetId: tokenAssetId(token.network, symbol, contractAddress),\n symbol,\n providerSymbol: token.symbol,\n blockchain: token.network,\n decimals: token.decimals,\n contractAddress,\n price: Number(token.price || 1),\n logo: tokenLogoUrl(symbol),\n supportPayment: token.supportPayment,\n supportReceive: token.supportReceive,\n chain,\n });\n }\n const hasNearWrap = tokens.some((token) => (\n token.symbol === \"NEAR\" && token.blockchain === \"near\" && token.contractAddress?.toLowerCase() === WRAP_NEAR_CONTRACT\n ));\n if (!hasNearWrap) return tokens;\n return tokens.filter((token) => !(token.symbol === \"NEAR\" && token.blockchain === \"near\" && isNativeAddress(token.contractAddress)));\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","useSyncExternalStore","SearchInput","useEffect","useState","jsx","useEffect","useEffect","jsx","useState","useEffect","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","useEffect","useRef","useState","jsx","jsx","jsxs","Skeleton","Fragment","jsx","jsxs","Skeleton","jsx","jsxs","ownerKey","jsx","jsxs","prefs","useSyncExternalStore","owners","useState","useRef","useEffect","ownerKey","next","SearchInput","ZERO_ADDRESS"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stableflow/pay-widgets",
|
|
3
|
-
"version": "0.2.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Business widgets for StableFlow Pay. Data comes in through props and callbacks.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"stableflow",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"clsx": "^2.1.1",
|
|
33
33
|
"motion": "^13.0.0",
|
|
34
34
|
"tailwind-merge": "^3.7.0",
|
|
35
|
-
"@stableflow/pay-ui": "0.2.0
|
|
35
|
+
"@stableflow/pay-ui": "0.2.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/react": "^19.1.9",
|