@stableflow/pay-widgets 0.0.1-beta-a286a74da1-20260923 → 0.0.1
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.
- package/dist/token-select/index.js +123 -48
- package/dist/token-select/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -242,6 +242,9 @@ function logoPath(path) {
|
|
|
242
242
|
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
243
243
|
return `${LOGO_HOST}${normalized}`;
|
|
244
244
|
}
|
|
245
|
+
function evmTypeLogoUrl() {
|
|
246
|
+
return logoPath("/stableflow/networks/type-evm.svg");
|
|
247
|
+
}
|
|
245
248
|
function chainLogoUrl(blockchainOrNetwork) {
|
|
246
249
|
const key = String(blockchainOrNetwork || "").toLowerCase();
|
|
247
250
|
const file = CHAIN_LOGO_ALIAS[key] || key.replace(/\s+/g, "");
|
|
@@ -516,7 +519,7 @@ function usePayWidgets() {
|
|
|
516
519
|
}
|
|
517
520
|
|
|
518
521
|
// src/token-select/TokenSelectDialog.tsx
|
|
519
|
-
import { useEffect as useEffect3, useMemo as useMemo2, useRef, useState, useSyncExternalStore as useSyncExternalStore4 } from "react";
|
|
522
|
+
import { useEffect as useEffect3, useMemo as useMemo2, useRef, useState as useState2, useSyncExternalStore as useSyncExternalStore4 } from "react";
|
|
520
523
|
import { Dialog } from "@stableflow/pay-ui/dialog";
|
|
521
524
|
import { SearchInput as SearchInput2 } from "@stableflow/pay-ui/search-input";
|
|
522
525
|
|
|
@@ -631,9 +634,12 @@ function formatDisplayAmount(value, options = {}) {
|
|
|
631
634
|
}
|
|
632
635
|
|
|
633
636
|
// src/token-select/chain-pane.tsx
|
|
637
|
+
import { useState } from "react";
|
|
638
|
+
import { IconArrowDown } from "@stableflow/pay-ui/icons/arrow-down";
|
|
634
639
|
import { Tooltip } from "@stableflow/pay-ui/tooltip";
|
|
635
640
|
|
|
636
641
|
// src/token-select/chain-wallet-status.tsx
|
|
642
|
+
import { IconCopy } from "@stableflow/pay-ui/icons/copy";
|
|
637
643
|
import { IconLogout } from "@stableflow/pay-ui/icons/logout";
|
|
638
644
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
639
645
|
function stop(event) {
|
|
@@ -673,6 +679,20 @@ function ChainWalletStatus({ kind }) {
|
|
|
673
679
|
children: formatAddress(address)
|
|
674
680
|
}
|
|
675
681
|
),
|
|
682
|
+
/* @__PURE__ */ jsx2(
|
|
683
|
+
"button",
|
|
684
|
+
{
|
|
685
|
+
type: "button",
|
|
686
|
+
"aria-label": "Copy address",
|
|
687
|
+
onClick: (event) => {
|
|
688
|
+
stop(event);
|
|
689
|
+
if (!onCopyAddress) return;
|
|
690
|
+
onCopyAddress(address);
|
|
691
|
+
},
|
|
692
|
+
className: "inline-flex shrink-0 cursor-pointer border-0 bg-transparent p-0 text-[#606060] hover:text-black",
|
|
693
|
+
children: /* @__PURE__ */ jsx2(IconCopy, { className: "size-3" })
|
|
694
|
+
}
|
|
695
|
+
),
|
|
676
696
|
hideDisconnect ? null : /* @__PURE__ */ jsx2(
|
|
677
697
|
"button",
|
|
678
698
|
{
|
|
@@ -690,6 +710,23 @@ function ChainWalletStatus({ kind }) {
|
|
|
690
710
|
}
|
|
691
711
|
|
|
692
712
|
// src/token-select/utils.ts
|
|
713
|
+
function groupEvmChains(chains) {
|
|
714
|
+
const evm = chains.filter((chain) => chain.chainKind === "evm");
|
|
715
|
+
if (evm.length === 0) return chains.map((chain) => ({ kind: "chain", chain }));
|
|
716
|
+
let placed = false;
|
|
717
|
+
const entries = [];
|
|
718
|
+
for (const chain of chains) {
|
|
719
|
+
if (chain.chainKind === "evm") {
|
|
720
|
+
if (!placed) {
|
|
721
|
+
entries.push({ kind: "evm", chains: evm });
|
|
722
|
+
placed = true;
|
|
723
|
+
}
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
entries.push({ kind: "chain", chain });
|
|
727
|
+
}
|
|
728
|
+
return entries;
|
|
729
|
+
}
|
|
693
730
|
function tokenBalanceUsd(token, formatted) {
|
|
694
731
|
if (formatted == null || formatted === "") return -1;
|
|
695
732
|
const amount = Number(formatted);
|
|
@@ -846,56 +883,94 @@ function ChainPane(props) {
|
|
|
846
883
|
disabledBlockchains = null,
|
|
847
884
|
disabledReason
|
|
848
885
|
} = props;
|
|
886
|
+
const [evmExpanded, setEvmExpanded] = useState(true);
|
|
849
887
|
function wrapDisabled(disabled, reason, content) {
|
|
850
888
|
if (!disabled || !reason) return content;
|
|
851
889
|
return /* @__PURE__ */ jsx3(Tooltip, { side: "right", triggerClassName: "min-w-0 flex-1", content: reason, children: content });
|
|
852
890
|
}
|
|
891
|
+
function chainRow(chain, nested) {
|
|
892
|
+
const locked = isChainKindLocked(chain.chainKind, lockChainKind);
|
|
893
|
+
const chainDisabled = isBlockchainDisabled(chain.blockchain, disabledBlockchains);
|
|
894
|
+
const disabled = locked || chainDisabled;
|
|
895
|
+
const reason = chainDisabled ? disabledReason : locked && lockChainKind ? lockReason(lockChainKind) : void 0;
|
|
896
|
+
return /* @__PURE__ */ jsxs2(
|
|
897
|
+
"div",
|
|
898
|
+
{
|
|
899
|
+
className: cx(
|
|
900
|
+
"flex min-h-14 w-full items-center gap-2 rounded-[12px] px-2 md:min-h-[66px] md:gap-3 md:px-3",
|
|
901
|
+
disabled ? "opacity-40" : "hover:bg-[#F6F6F6]",
|
|
902
|
+
nested ? "min-h-12 md:min-h-14" : ""
|
|
903
|
+
),
|
|
904
|
+
children: [
|
|
905
|
+
wrapDisabled(
|
|
906
|
+
disabled,
|
|
907
|
+
reason,
|
|
908
|
+
/* @__PURE__ */ jsxs2(
|
|
909
|
+
"button",
|
|
910
|
+
{
|
|
911
|
+
type: "button",
|
|
912
|
+
disabled,
|
|
913
|
+
onClick: () => {
|
|
914
|
+
if (disabled) return;
|
|
915
|
+
onSelectFilter(chain.blockchain);
|
|
916
|
+
},
|
|
917
|
+
className: cx(
|
|
918
|
+
"flex min-w-0 flex-1 items-center gap-3 border-0 bg-transparent text-left",
|
|
919
|
+
disabled ? "cursor-not-allowed" : "cursor-pointer"
|
|
920
|
+
),
|
|
921
|
+
children: [
|
|
922
|
+
/* @__PURE__ */ jsxs2("span", { className: "relative size-8 shrink-0", children: [
|
|
923
|
+
/* @__PURE__ */ jsx3("img", { src: chain.logo, alt: "", className: "size-8 object-cover" }),
|
|
924
|
+
fundedBlockchains.has(chain.blockchain) ? /* @__PURE__ */ jsx3("span", { className: "absolute -top-0.5 -right-0.5 size-2 rounded-full border border-white bg-[#06f] md:size-2.5" }) : null
|
|
925
|
+
] }),
|
|
926
|
+
/* @__PURE__ */ jsx3("span", { className: cx("truncate text-sm font-medium text-black md:text-base", fontSans), children: chain.chainName })
|
|
927
|
+
]
|
|
928
|
+
}
|
|
929
|
+
)
|
|
930
|
+
),
|
|
931
|
+
showWalletStatus && !nested ? /* @__PURE__ */ jsx3(ChainWalletStatus, { kind: chain.chainKind }) : null
|
|
932
|
+
]
|
|
933
|
+
},
|
|
934
|
+
chain.blockchain
|
|
935
|
+
);
|
|
936
|
+
}
|
|
853
937
|
return /* @__PURE__ */ jsxs2("div", { className: "flex min-h-0 flex-1 flex-col", children: [
|
|
854
938
|
/* @__PURE__ */ jsx3("p", { className: cx("shrink-0 text-sm font-medium text-[#aaa]", fontSans), children: "All Networks" }),
|
|
855
|
-
/* @__PURE__ */ jsx3("div", { className: "mt-3 flex min-h-0 flex-1 flex-col overflow-y-auto", children: chains.map((
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
className:
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
),
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
]
|
|
891
|
-
}
|
|
892
|
-
)
|
|
893
|
-
),
|
|
894
|
-
showWalletStatus ? /* @__PURE__ */ jsx3(ChainWalletStatus, { kind: chain.chainKind }) : null
|
|
895
|
-
]
|
|
896
|
-
},
|
|
897
|
-
chain.blockchain
|
|
898
|
-
);
|
|
939
|
+
/* @__PURE__ */ jsx3("div", { className: "mt-3 flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto", children: groupEvmChains(chains).map((entry) => {
|
|
940
|
+
if (entry.kind === "chain") return chainRow(entry.chain, false);
|
|
941
|
+
return /* @__PURE__ */ jsxs2("div", { className: "rounded-[12px] px-2 md:px-3 py-2 hover:bg-[rgba(185,215,255,0.1)]", children: [
|
|
942
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between", children: [
|
|
943
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-3", children: [
|
|
944
|
+
/* @__PURE__ */ jsx3("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-[10px] bg-[#627EEA]", children: /* @__PURE__ */ jsx3("img", { src: evmTypeLogoUrl(), alt: "", className: "size-5 object-contain" }) }),
|
|
945
|
+
/* @__PURE__ */ jsx3("span", { className: cx("truncate text-sm font-medium text-black md:text-base", fontSans), children: "EVM-based" })
|
|
946
|
+
] }),
|
|
947
|
+
showWalletStatus ? /* @__PURE__ */ jsx3(ChainWalletStatus, { kind: "evm" }) : /* @__PURE__ */ jsx3("span", { className: "min-w-0 flex-1" })
|
|
948
|
+
] }),
|
|
949
|
+
/* @__PURE__ */ jsxs2("div", { className: "mt-2 flex items-center gap-2", children: [
|
|
950
|
+
evmExpanded ? /* @__PURE__ */ jsx3("span", { className: "min-w-0 flex-1" }) : /* @__PURE__ */ jsx3("span", { className: "flex min-w-0 flex-1 overflow-hidden", children: entry.chains.map((chain, index) => /* @__PURE__ */ jsx3(
|
|
951
|
+
"img",
|
|
952
|
+
{
|
|
953
|
+
src: chain.logo,
|
|
954
|
+
alt: "",
|
|
955
|
+
style: { zIndex: entry.chains.length - index },
|
|
956
|
+
className: index === 0 ? "relative size-4 shrink-0 rounded-[4px] border border-white object-cover" : "relative -ml-1.5 size-4 shrink-0 rounded-[4px] border border-white object-cover"
|
|
957
|
+
},
|
|
958
|
+
chain.blockchain
|
|
959
|
+
)) }),
|
|
960
|
+
/* @__PURE__ */ jsx3(
|
|
961
|
+
"button",
|
|
962
|
+
{
|
|
963
|
+
type: "button",
|
|
964
|
+
"aria-expanded": evmExpanded,
|
|
965
|
+
"aria-label": evmExpanded ? "Collapse EVM-based" : "Expand EVM-based",
|
|
966
|
+
onClick: () => setEvmExpanded((open) => !open),
|
|
967
|
+
className: "ml-auto inline-flex shrink-0 cursor-pointer border-0 bg-transparent p-1 text-[#606060]",
|
|
968
|
+
children: /* @__PURE__ */ jsx3(IconArrowDown, { className: cx("size-3 transition-transform", evmExpanded ? "rotate-180" : "") })
|
|
969
|
+
}
|
|
970
|
+
)
|
|
971
|
+
] }),
|
|
972
|
+
evmExpanded ? /* @__PURE__ */ jsx3("div", { className: "mt-2 border-t border-[#e3e3e3] pt-1", children: entry.chains.map((chain) => chainRow(chain, true)) }) : null
|
|
973
|
+
] }, "evm");
|
|
899
974
|
}) })
|
|
900
975
|
] });
|
|
901
976
|
}
|
|
@@ -1179,9 +1254,9 @@ function TokenSelectDialog(props) {
|
|
|
1179
1254
|
const owners = showBalances ? { ...connectedOwners, ...balanceOwners } : {};
|
|
1180
1255
|
const walletConnected = hasAnyOwner(connectedOwners);
|
|
1181
1256
|
const walletWasConnected = useRef(null);
|
|
1182
|
-
const [search, setSearch] =
|
|
1183
|
-
const [chainFilter, setChainFilter] =
|
|
1184
|
-
const [view, setView] =
|
|
1257
|
+
const [search, setSearch] = useState2("");
|
|
1258
|
+
const [chainFilter, setChainFilter] = useState2(ALL_CHAIN_FILTER);
|
|
1259
|
+
const [view, setView] = useState2("token");
|
|
1185
1260
|
const loading = status === "loading" || status === "idle";
|
|
1186
1261
|
useEffect3(() => {
|
|
1187
1262
|
if (!open) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/token-select/context.tsx","../../src/token-select/balances.ts","../../src/token-select/config.ts","../../src/token-select/pay-config.ts","../../src/token-select/logos.ts","../../src/token-select/TokenSelectDialog.tsx","../../src/token-select/prefs.ts","../../src/token-select/format.ts","../../src/token-select/chain-pane.tsx","../../src/token-select/chain-wallet-status.tsx","../../src/token-select/utils.ts","../../src/token-select/network-rail.tsx","../../src/token-select/token-pane.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo, type ReactNode } from \"react\";\nimport { clearPayTokenBalances, setBalanceReader } from \"./balances\";\nimport { setChainKindOverrides, usePayConfig } from \"./pay-config\";\nimport type { ChainKind, PayConfigSource, PayWallet, PopularTokenRef, ReadBalances } from \"./types\";\n\ntype PayWidgetsContextValue = {\n wallet: PayWallet;\n popularTokens: PopularTokenRef[];\n onCopyAddress?: (address: string) => void;\n};\n\nconst PayWidgetsContext = createContext<PayWidgetsContextValue | null>(null);\n\nexport type PayWidgetsProviderProps = {\n apiHost?: string;\n popularTokens?: PopularTokenRef[];\n wallet: PayWallet;\n readBalances: ReadBalances;\n onConfig?: (config: PayConfigSource) => void;\n onCopyAddress?: (address: string) => void;\n chainKinds?: Partial<Record<string, ChainKind>>;\n children: ReactNode;\n};\n\nexport function PayWidgetsProvider(props: PayWidgetsProviderProps) {\n const {\n apiHost,\n popularTokens = [],\n wallet,\n readBalances,\n onConfig,\n onCopyAddress,\n chainKinds,\n children,\n } = props;\n const config = usePayConfig({ apiHost });\n\n useEffect(() => {\n setChainKindOverrides(chainKinds);\n }, [chainKinds]);\n\n useEffect(() => {\n setBalanceReader(readBalances);\n return () => setBalanceReader(null);\n }, [readBalances]);\n\n useEffect(() => {\n if (config.status === \"success\" && config.source) onConfig?.(config.source);\n }, [config.source, config.status, onConfig]);\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 value = useMemo(\n () => ({ wallet, popularTokens, onCopyAddress }),\n [wallet, popularTokens, onCopyAddress],\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\nconst listeners = new Set<() => void>();\nlet balances: Record<string, TokenBalance> = {};\nlet reader: ReadBalances | null = null;\nconst chainInflight = new Map<string, Promise<void>>();\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}\n\nexport function clearPayTokenBalances() {\n balances = {};\n emit();\n}\n\nexport function getPayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n if (!owner || !assetId) return undefined;\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 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 CONFIG_STALE_MS = 30 * 60 * 1000;\nexport const ALL_CHAIN_FILTER = \"all\";\nexport const DEFAULT_API_HOST = \"https://api.stableflow.ai\";\nexport const POPULAR_SECTION_TITLE = \"Popular on your network\";\nexport const TOKEN_SELECT_PREFS_STORAGE_KEY = \"stableflow-pay:token-select-prefs:v1\";\nexport const TOKEN_SELECT_PREFS_VERSION = 2;\nexport const MAX_RECENT_BLOCKCHAINS = 16;\nexport const MAX_RECENT_ASSETS = 3;\n\n/** Preferred sidebar order when no wallet is connected. Later config chains append after this list. */\nexport const DISCONNECTED_CHAIN_ORDER = [\n \"near\",\n \"sol\",\n \"tron\",\n \"eth\",\n \"bsc\",\n \"arb\",\n \"base\",\n \"pol\",\n \"avax\",\n \"op\",\n \"bera\",\n \"gnosis\",\n \"xlayer\",\n \"scroll\",\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 { useCallback, useEffect, useSyncExternalStore } from \"react\";\nimport { CONFIG_STALE_MS, DEFAULT_API_HOST, 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\nexport type PayConfigStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\nexport type PayConfigSnapshot = {\n apiHost: string;\n chains: PayChain[];\n tokens: PayToken[];\n source: PayConfigSource | null;\n status: PayConfigStatus;\n error: string | null;\n fetchedAt: number | null;\n};\n\ntype ChainKindMap = Partial<Record<string, ChainKind>>;\n\nconst listeners = new Set<() => void>();\nlet chainKindOverrides: ChainKindMap = {};\nlet snapshot: PayConfigSnapshot = {\n apiHost: DEFAULT_API_HOST,\n chains: [],\n tokens: [],\n source: null,\n status: \"idle\",\n error: null,\n fetchedAt: null,\n};\nlet inflight: Promise<void> | null = null;\n\nfunction emit(next: PayConfigSnapshot) {\n snapshot = 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 getPayConfigSnapshot(): PayConfigSnapshot {\n return snapshot;\n}\n\nexport function setChainKindOverrides(overrides: ChainKindMap | null | undefined) {\n chainKindOverrides = overrides ?? {};\n if (snapshot.source) {\n const normalized = normalizePayConfig(snapshot.source, chainKindOverrides);\n emit({ ...snapshot, chains: normalized.chains, tokens: normalized.tokens });\n }\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 = chainKindOverrides): 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, overrides: ChainKindMap = chainKindOverrides): {\n chains: PayChain[];\n tokens: PayToken[];\n} {\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 const visible = hasNearWrap\n ? tokens.filter((token) => !(token.symbol === \"NEAR\" && token.blockchain === \"near\" && isNativeAddress(token.contractAddress)))\n : tokens;\n return { chains, tokens: visible };\n}\n\nexport function configUrl(apiHost: string): string {\n return `${apiHost.replace(/\\/$/, \"\")}/v1/pay/config`;\n}\n\nasync function load(apiHost: string, force: boolean) {\n const fresh = snapshot.apiHost === apiHost\n && snapshot.status === \"success\"\n && snapshot.fetchedAt != null\n && Date.now() - snapshot.fetchedAt < CONFIG_STALE_MS;\n if (!force && fresh) return;\n if (inflight && !force) return inflight;\n\n emit({ ...snapshot, apiHost, status: snapshot.tokens.length > 0 ? snapshot.status : \"loading\", error: null });\n const run = (async () => {\n try {\n const response = await fetch(configUrl(apiHost));\n if (!response.ok) throw new Error(`Config request failed (${response.status})`);\n const source = mapPayConfigSource(await response.json());\n const normalized = normalizePayConfig(source, chainKindOverrides);\n emit({\n apiHost,\n source,\n chains: normalized.chains,\n tokens: normalized.tokens,\n status: \"success\",\n error: null,\n fetchedAt: Date.now(),\n });\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"Failed to load config\";\n emit({\n ...snapshot,\n apiHost,\n status: snapshot.source ? \"success\" : \"error\",\n error: message,\n });\n } finally {\n inflight = null;\n }\n })();\n inflight = run;\n return run;\n}\n\nexport function refetchPayConfig(apiHost = snapshot.apiHost) {\n return load(apiHost, true);\n}\n\nexport function usePayConfigSnapshot(): PayConfigSnapshot {\n return useSyncExternalStore(subscribe, getPayConfigSnapshot, getPayConfigSnapshot);\n}\n\nexport function usePayConfig(options?: { apiHost?: string }) {\n const apiHost = options?.apiHost?.trim() || DEFAULT_API_HOST;\n const current = useSyncExternalStore(subscribe, getPayConfigSnapshot, getPayConfigSnapshot);\n const refetch = useCallback(() => {\n void refetchPayConfig(apiHost);\n }, [apiHost]);\n\n useEffect(() => {\n void load(apiHost, false);\n }, [apiHost]);\n\n return {\n chains: current.apiHost === apiHost ? current.chains : [],\n tokens: current.apiHost === apiHost ? current.tokens : [],\n source: current.apiHost === apiHost ? current.source : null,\n status: current.apiHost === apiHost ? current.status : \"loading\" as const,\n error: current.apiHost === apiHost ? current.error : null,\n refetch,\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\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 { 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 { ALL_CHAIN_FILTER, POPULAR_SECTION_TITLE, TOKEN_BALANCE_POLL_MS } from \"./config\";\nimport { usePayWidgets } from \"./context\";\nimport { usePayConfigSnapshot } from \"./pay-config\";\nimport { getTokenSelectPrefs, setLastBlockchain, setLastToken, useTokenSelectPrefs } from \"./prefs\";\nimport { cx, fontSans } from \"./format\";\nimport { ChainPane } from \"./chain-pane\";\nimport { NetworkRail } from \"./network-rail\";\nimport { TokenPane, type TokenListSection } from \"./token-pane\";\nimport type { ChainKind, ChainOwners, PayToken, TokenSelectRole } from \"./types\";\nimport {\n chainHasBalance,\n initialChainFilter,\n isBlockchainDisabled,\n isChainKindLocked,\n matchesChainFilter,\n popularTokensForWallets,\n positiveBalanceTokens,\n recentTokensInOrder,\n sortChainsForSidebar,\n sortTokensByBalance,\n sortTokensBySymbol,\n tokenBalanceUsd,\n tokenMatchesSearch,\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 closeClassName?: string;\n contentClassName?: string;\n searchClassName?: string;\n railClassName?: string;\n rowClassName?: string;\n};\n\nconst SEARCH_INPUT_CLASS = \"h-[36px] rounded-[18px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30\";\n\nfunction chainsFromTokens(tokens: PayToken[]) {\n const byCode = new Map<string, PayToken[\"chain\"]>();\n for (const token of tokens) {\n if (!byCode.has(token.blockchain)) byCode.set(token.blockchain, token.chain);\n }\n return Array.from(byCode.values());\n}\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 closeClassName,\n contentClassName,\n searchClassName,\n railClassName,\n rowClassName,\n } = props;\n const payer = role === \"payer\";\n const showBalances = payer;\n const { wallet, popularTokens: popularRefs } = usePayWidgets();\n const { tokens, status } = usePayConfigSnapshot();\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 as ChainKind] = address;\n }\n return owners;\n }, [wallet.accounts]);\n const owners = showBalances ? { ...connectedOwners, ...balanceOwners } : {};\n const walletConnected = hasAnyOwner(connectedOwners);\n const walletWasConnected = useRef<boolean | null>(null);\n const [search, setSearch] = useState(\"\");\n const [chainFilter, setChainFilter] = useState(ALL_CHAIN_FILTER);\n const [view, setView] = useState<\"token\" | \"network\">(\"token\");\n const loading = status === \"loading\" || status === \"idle\";\n\n useEffect(() => {\n if (!open) return;\n setSearch(\"\");\n if (lockChainKind) {\n setView(\"token\");\n return;\n }\n if (!payer) {\n setView(\"token\");\n setChainFilter(ALL_CHAIN_FILTER);\n }\n }, [open, lockChainKind, payer]);\n\n useEffect(() => {\n if (!open || !lockChainKind || tokens.length === 0) return;\n setChainFilter(initialChainFilter(\n lockChainKind,\n getTokenSelectPrefs().recentBlockchains,\n chainsFromTokens(tokens),\n ));\n }, [open, lockChainKind, tokens]);\n\n useEffect(() => {\n if (!open) {\n walletWasConnected.current = null;\n return;\n }\n if (lockChainKind || !payer) {\n walletWasConnected.current = walletConnected;\n return;\n }\n const previous = walletWasConnected.current;\n walletWasConnected.current = walletConnected;\n if (previous !== null && previous === walletConnected) return;\n setView(walletConnected ? \"token\" : \"network\");\n setChainFilter(ALL_CHAIN_FILTER);\n }, [open, lockChainKind, payer, walletConnected]);\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 ownerKey = ([\"evm\", \"near\", \"solana\", \"tron\", \"zec\"] as const)\n .map((kind) => `${kind}:${owners[kind] ?? \"\"}`)\n .join(\"|\");\n const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join(\"|\"), [scopedTokens]);\n const ownersRef = useRef(owners);\n const tokensRef = useRef(scopedTokens);\n ownersRef.current = owners;\n tokensRef.current = scopedTokens;\n\n useEffect(() => {\n if (!showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;\n void ensurePayTokenBalances(ownersRef.current, tokensRef.current);\n const id = window.setInterval(() => {\n void ensurePayTokenBalances(ownersRef.current, tokensRef.current, { force: true });\n }, TOKEN_BALANCE_POLL_MS);\n return () => window.clearInterval(id);\n }, [showBalances, open, ownerKey, tokenKey]);\n\n function balanceOf(token: PayToken) {\n return getPayTokenBalance(ownerForToken(owners, token), 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 entry = getPayTokenBalance(owner, token.assetId);\n return entry?.formatted == null && (!entry || entry.status === \"loading\");\n }\n\n const availableChains = useMemo(() => {\n const codes = new Set(scopedTokens.map((token) => token.blockchain));\n const byCode = new Map<string, PayToken[\"chain\"]>();\n for (const token of scopedTokens) {\n if (codes.has(token.blockchain) && !byCode.has(token.blockchain)) byCode.set(token.blockchain, token.chain);\n }\n return Array.from(byCode.values());\n }, [scopedTokens]);\n\n const sortedChains = useMemo(\n () => sortChainsForSidebar(availableChains, scopedTokens, {\n showBalances,\n walletConnected,\n getBalanceUsd: (token) => tokenBalanceUsd(token, getPayTokenBalance(ownerForToken(owners, token), token.assetId)?.formatted),\n }),\n [availableChains, scopedTokens, showBalances, walletConnected, owners, balanceEntries],\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) => (\n getPayTokenBalance(ownerForToken(owners, token), token.assetId)?.formatted\n ))) {\n funded.add(chain.blockchain);\n }\n }\n return funded;\n }, [availableChains, owners, scopedTokens, showBalances, balanceEntries]);\n\n const popularTokens = useMemo(\n () => popularTokensForWallets(scopedTokens, popularRefs, (kind) => Boolean(connectedOwners[kind])),\n [scopedTokens, popularRefs, connectedOwners],\n );\n\n const newestAssetId = showBalances ? prefs.recentAssetIds[0] ?? null : null;\n const searchingAll = chainFilter === ALL_CHAIN_FILTER && search.trim().length > 0;\n const walletKind = chainFilter === ALL_CHAIN_FILTER\n ? null\n : availableChains.find((chain) => chain.blockchain === chainFilter)?.chainKind ?? null;\n\n const sections = useMemo((): TokenListSection[] => {\n if (showBalances && chainFilter === ALL_CHAIN_FILTER && searchingAll) {\n const matched = scopedTokens.filter((token) => tokenMatchesSearch(token, search));\n return [{\n id: \"search\",\n tokens: sortTokensByBalance(matched, usdOf, loadingOf),\n badgeAssetId: newestAssetId,\n }];\n }\n\n if (showBalances && chainFilter === ALL_CHAIN_FILTER) {\n const next: TokenListSection[] = [];\n const recent = recentTokensInOrder(scopedTokens, prefs.recentAssetIds);\n if (recent.length > 0) {\n next.push({\n id: \"recent\",\n title: \"Recently Used\",\n tokens: recent,\n badgeAssetId: newestAssetId,\n });\n }\n const yours = positiveBalanceTokens(scopedTokens, usdOf);\n if (yours.length > 0) {\n next.push({ id: \"yours\", title: \"Your Tokens\", tokens: yours });\n }\n if (popularTokens.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popularTokens });\n }\n return next;\n }\n\n const matched = scopedTokens.filter((token) => (\n matchesChainFilter(token, chainFilter) && tokenMatchesSearch(token, search)\n ));\n\n if (!showBalances && chainFilter === ALL_CHAIN_FILTER && !search.trim()) {\n const next: TokenListSection[] = [];\n if (popularTokens.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popularTokens });\n }\n next.push({ id: \"all\", tokens: sortTokensBySymbol(matched) });\n return next;\n }\n\n const chainName = availableChains.find((chain) => chain.blockchain === chainFilter)?.chainName ?? chainFilter;\n return [{\n id: chainFilter,\n title: chainName,\n walletKind,\n tokens: showBalances ? sortTokensByBalance(matched, usdOf, loadingOf) : sortTokensBySymbol(matched),\n badgeAssetId: showBalances ? newestAssetId : null,\n }];\n }, [\n showBalances,\n chainFilter,\n searchingAll,\n search,\n scopedTokens,\n prefs.recentAssetIds,\n newestAssetId,\n walletKind,\n balanceEntries,\n owners,\n popularTokens,\n availableChains,\n ]);\n\n function handleSelectFilter(filter: string) {\n setChainFilter(filter);\n if (filter !== ALL_CHAIN_FILTER) setLastBlockchain(filter);\n setView(\"token\");\n }\n\n function handleSelectToken(token: PayToken) {\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 onSelect({ token });\n onClose();\n }\n\n const awaitingBalances = showBalances\n && chainFilter === ALL_CHAIN_FILTER\n && !searchingAll\n && scopedTokens.some((token) => loadingOf(token));\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={title}\n titleClassName={cx(\n \"min-w-0 flex-1 truncate text-base font-medium text-[#606060] md:flex-none\",\n fontSans,\n titleClassName,\n )}\n closeClassName={cx(view === \"token\" ? \"ml-0\" : undefined, closeClassName)}\n contentClassName={contentClassName}\n headerAction={view === \"token\" ? (\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"ml-auto hidden w-[215px] shrink-0 md:block\"\n inputClassName={cx(SEARCH_INPUT_CLASS, searchClassName)}\n />\n ) : null}\n cardClassName={cx(\"w-full max-h-[90vh] md:w-[474px]\", className)}\n >\n <div className=\"flex h-[min(520px,62vh)] min-h-0 flex-col overflow-hidden md:h-[min(555px,70vh)]\">\n {view === \"token\" ? (\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"mb-3 shrink-0 md:hidden\"\n inputClassName={cx(SEARCH_INPUT_CLASS, searchClassName)}\n />\n ) : null}\n <div className=\"flex min-h-0 flex-1\">\n <NetworkRail\n view={view}\n chainFilter={chainFilter}\n chips={sortedChains}\n fundedBlockchains={fundedBlockchains}\n walletConnected={walletConnected}\n showAllLabel={!payer}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n onSelectFilter={handleSelectFilter}\n onOpenNetworks={() => setView(\"network\")}\n className={railClassName}\n />\n {view === \"network\" ? (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col pl-3 md:pl-4\">\n <ChainPane\n chains={sortedChains}\n fundedBlockchains={fundedBlockchains}\n showWalletStatus={payer}\n onSelectFilter={handleSelectFilter}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n />\n </div>\n ) : (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col pl-3 md:pl-4\">\n <TokenPane\n sections={sections}\n selectedAssetId={selectedAssetId}\n loading={loading || awaitingBalances}\n showBalances={showBalances}\n showWalletStatus={payer}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={handleSelectToken}\n isTokenDisabled={(token) => (\n isBlockchainDisabled(token.blockchain, disabledBlockchains)\n || isChainKindLocked(token.chain.chainKind, lockChainKind)\n )}\n searchClassName={searchClassName}\n rowClassName={rowClassName}\n />\n </div>\n )}\n </div>\n </div>\n </Dialog>\n );\n}\n","import { useSyncExternalStore } from \"react\";\nimport {\n MAX_RECENT_ASSETS,\n MAX_RECENT_BLOCKCHAINS,\n TOKEN_SELECT_PREFS_STORAGE_KEY,\n TOKEN_SELECT_PREFS_VERSION,\n} from \"./config\";\n\nexport type TokenSelectPrefs = {\n recentAssetIds: string[];\n recentBlockchains: string[];\n};\n\nconst EMPTY_PREFS: TokenSelectPrefs = { recentAssetIds: [], recentBlockchains: [] };\n\nexport function rememberRecentAsset(recent: string[], assetId: string): string[] {\n const id = assetId.trim();\n if (!id) return recent;\n return [id, ...recent.filter((item) => item !== id)].slice(0, MAX_RECENT_ASSETS);\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\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 recentBlockchains?: string[];\n };\n const recentBlockchains = version >= 1\n ? (Array.isArray(state.recentBlockchains) ? state.recentBlockchains : [])\n : (typeof state.lastBlockchain === \"string\" && state.lastBlockchain ? [state.lastBlockchain] : []);\n const recentAssetIds = version >= TOKEN_SELECT_PREFS_VERSION && Array.isArray(state.recentAssetIds)\n ? state.recentAssetIds.filter((id) => typeof id === \"string\" && id.trim()).slice(0, MAX_RECENT_ASSETS)\n : (typeof state.lastAssetId === \"string\" && state.lastAssetId ? [state.lastAssetId] : []);\n return { recentAssetIds, 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 recentAssetIds: rememberRecentAsset(prefs.recentAssetIds, assetId),\n recentBlockchains: rememberRecentBlockchain(prefs.recentBlockchains, blockchain),\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 { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\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 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): string {\n if (kind === \"evm\") return \"EVM\";\n if (kind === \"near\") return \"Near\";\n if (kind === \"solana\") return \"Solana\";\n if (kind === \"tron\") return \"Tron\";\n if (kind === \"zec\") return \"Zcash\";\n return 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 type { ReactNode } from \"react\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { chainKindLabel, cx, fontSans } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type ChainPaneProps = {\n chains: SidebarChain[];\n fundedBlockchains: ReadonlySet<string>;\n showWalletStatus?: boolean;\n onSelectFilter: (filter: string) => void;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n};\n\nfunction lockReason(lockChainKind: ChainKind): string {\n return `Recipient address is on ${chainKindLabel(lockChainKind)}; edit the recipient to change chain`;\n}\n\nexport function ChainPane(props: ChainPaneProps) {\n const {\n chains,\n fundedBlockchains,\n showWalletStatus = true,\n onSelectFilter,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n } = props;\n\n function wrapDisabled(disabled: boolean, reason: string | undefined, content: ReactNode) {\n if (!disabled || !reason) return content;\n return (\n <Tooltip side=\"right\" triggerClassName=\"min-w-0 flex-1\" content={reason}>\n {content}\n </Tooltip>\n );\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <p className={cx(\"shrink-0 text-sm font-medium text-[#aaa]\", fontSans)}>All Networks</p>\n <div className=\"mt-3 flex min-h-0 flex-1 flex-col overflow-y-auto\">\n {chains.map((chain) => {\n const locked = isChainKindLocked(chain.chainKind, lockChainKind);\n const chainDisabled = isBlockchainDisabled(chain.blockchain, disabledBlockchains);\n const disabled = locked || chainDisabled;\n const reason = chainDisabled\n ? disabledReason\n : locked && lockChainKind\n ? lockReason(lockChainKind)\n : undefined;\n return (\n <div\n key={chain.blockchain}\n className={cx(\n \"flex min-h-14 w-full items-center gap-2 rounded-[12px] px-2 md:min-h-[66px] md:gap-3 md:px-3\",\n disabled ? \"opacity-40\" : \"hover:bg-[#F6F6F6]\",\n )}\n >\n {wrapDisabled(\n disabled,\n reason,\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onSelectFilter(chain.blockchain);\n }}\n className={cx(\n \"flex min-w-0 flex-1 items-center gap-3 border-0 bg-transparent text-left\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <span className=\"relative size-8 shrink-0\">\n <img src={chain.logo} alt=\"\" className=\"size-8 object-cover\" />\n {fundedBlockchains.has(chain.blockchain) ? (\n <span className=\"absolute -top-0.5 -right-0.5 size-2 rounded-full border border-white bg-[#06f] md:size-2.5\" />\n ) : null}\n </span>\n <span className={cx(\"truncate text-sm font-medium text-black md:text-base\", fontSans)}>{chain.chainName}</span>\n </button>,\n )}\n {showWalletStatus ? <ChainWalletStatus kind={chain.chainKind} /> : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { MouseEvent } from \"react\";\nimport { IconLogout } from \"@stableflow/pay-ui/icons/logout\";\nimport { usePayWidgets } from \"./context\";\nimport { cx, fontSans, formatAddress } from \"./format\";\nimport type { ChainKind } from \"./types\";\n\nfunction stop(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport function ChainWalletStatus({ kind }: { kind: ChainKind }) {\n const { wallet, onCopyAddress } = usePayWidgets();\n const account = wallet.accounts[kind];\n const address = account?.address?.trim() || \"\";\n const hideDisconnect = account?.canDisconnect === false;\n\n if (!address) {\n return (\n <button\n type=\"button\"\n onClick={(event) => {\n stop(event);\n void wallet.connect(kind);\n }}\n className={cx(\"shrink-0 cursor-pointer border-0 bg-transparent p-0 text-xs font-medium text-[#3F8AFB] hover:underline\", fontSans)}\n >\n {account?.connecting ? \"Connecting…\" : \"Connect\"}\n </button>\n );\n }\n\n return (\n <div className=\"flex min-w-0 items-center gap-1\" onClick={stop}>\n <button\n type=\"button\"\n onClick={async (event) => {\n stop(event);\n if (!onCopyAddress) return;\n onCopyAddress(address);\n }}\n className={cx(\"truncate border-0 bg-transparent p-0 text-xs text-[#606060] hover:text-black\", fontSans)}\n >\n {formatAddress(address)}\n </button>\n {hideDisconnect ? null : (\n <button\n type=\"button\"\n aria-label=\"Disconnect\"\n onClick={(event) => {\n stop(event);\n void wallet.disconnect(kind);\n }}\n className=\"inline-flex shrink-0 cursor-pointer border-0 bg-transparent p-0 text-[#ff5656]\"\n >\n <IconLogout className=\"size-3\" />\n </button>\n )}\n </div>\n );\n}\n","import { ALL_CHAIN_FILTER, DISCONNECTED_CHAIN_ORDER } from \"./config\";\nimport type { ChainKind, PayToken, PopularTokenRef } from \"./types\";\n\nexport type SidebarChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n logo: string;\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, \"contractAddress\" | \"symbol\" | \"providerSymbol\">,\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\nconst DISCONNECTED_CHAIN_RANK = new Map<string, number>(\n DISCONNECTED_CHAIN_ORDER.map((code, index) => [code, index]),\n);\n\nexport type { PopularTokenRef };\nexport function parsePopularTokens(raw: string | null | undefined): PopularTokenRef[] {\n if (!raw?.trim()) return [];\n const refs: PopularTokenRef[] = [];\n for (const part of raw.split(\",\")) {\n const trimmed = part.trim();\n const colon = trimmed.indexOf(\":\");\n if (colon <= 0 || colon >= trimmed.length - 1) continue;\n const blockchain = trimmed.slice(0, colon).trim().toLowerCase();\n const symbol = trimmed.slice(colon + 1).trim();\n if (!blockchain || !symbol || symbol.includes(\":\")) continue;\n refs.push({ blockchain, symbol: symbol.toUpperCase() });\n }\n return refs;\n}\n\nexport function popularTokensForWallets<T extends {\n blockchain: string;\n symbol: string;\n chain: { chainKind: ChainKind };\n}>(\n tokens: T[],\n configured: readonly PopularTokenRef[],\n isChainConnected: (chainKind: ChainKind) => boolean,\n): T[] {\n const result: T[] = [];\n for (const ref of configured) {\n const token = tokens.find((item) => (\n item.blockchain === ref.blockchain && item.symbol.toUpperCase() === ref.symbol\n ));\n if (!token || !isChainConnected(token.chain.chainKind)) continue;\n result.push(token);\n }\n return result;\n}\n\n/**\n * No wallet: preferred chains first, then any other chain in the incoming order.\n * A connected wallet with balances: funded chains first by total USD.\n * A connected wallet without balances: keep registry order.\n */\nexport function sortChainsForSidebar<T extends Pick<PayToken, \"blockchain\">>(\n chains: SidebarChain[],\n tokens: T[],\n options: {\n showBalances: boolean;\n walletConnected: boolean;\n getBalanceUsd: (token: T) => number;\n },\n): SidebarChain[] {\n if (!options.walletConnected) {\n const tail = DISCONNECTED_CHAIN_ORDER.length;\n return chains\n .map((chain, index) => ({ chain, index }))\n .sort((left, right) => {\n const leftRank = DISCONNECTED_CHAIN_RANK.get(left.chain.blockchain) ?? tail;\n const rightRank = DISCONNECTED_CHAIN_RANK.get(right.chain.blockchain) ?? tail;\n if (leftRank !== rightRank) return leftRank - rightRank;\n return left.index - right.index;\n })\n .map((item) => item.chain);\n }\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 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 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 type { ReactNode } from \"react\";\nimport { IconAllNetworks } from \"@stableflow/pay-ui/icons/all-networks\";\nimport { IconWallet } from \"@stableflow/pay-ui/icons/wallet\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ALL_CHAIN_FILTER } from \"./config\";\nimport { chainKindLabel, cx, fontSans } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type NetworkRailProps = {\n view: \"token\" | \"network\";\n chainFilter: string;\n chips: SidebarChain[];\n fundedBlockchains: ReadonlySet<string>;\n walletConnected: boolean;\n showAllLabel?: boolean;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n onSelectFilter: (filter: string) => void;\n onOpenNetworks: () => void;\n className?: string;\n};\n\nfunction chipClass(selected: boolean, disabled: boolean) {\n return cx(\n \"relative flex size-10 shrink-0 items-center justify-center rounded-[12px] border border-solid md:size-[50px]\",\n selected ? \"border-[#06f] bg-[rgba(0,102,255,0.1)]\" : \"border-transparent bg-transparent\",\n disabled ? \"cursor-not-allowed opacity-40\" : \"cursor-pointer hover:bg-black/5\",\n );\n}\n\nexport function NetworkRail(props: NetworkRailProps) {\n const {\n view,\n chainFilter,\n chips,\n fundedBlockchains,\n walletConnected,\n showAllLabel = false,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n onSelectFilter,\n onOpenNetworks,\n className,\n } = props;\n\n function wrapDisabled(disabled: boolean, reason: string | undefined, content: ReactNode) {\n if (!disabled || !reason) return content;\n return (\n <Tooltip side=\"right\" content={reason}>\n {content}\n </Tooltip>\n );\n }\n\n return (\n <div className={cx(\"flex h-full w-[52px] shrink-0 flex-col items-center border-r border-[#e3e3e3] pr-2 md:w-[72px] md:pr-3\", className)}>\n {showAllLabel ? (\n <button\n type=\"button\"\n aria-label=\"All\"\n onClick={() => onSelectFilter(ALL_CHAIN_FILTER)}\n className={chipClass(view === \"token\" && chainFilter === ALL_CHAIN_FILTER, false)}\n >\n <span className={cx(\"text-xs font-medium text-black md:text-sm\", fontSans)}>All</span>\n </button>\n ) : (\n <button\n type=\"button\"\n aria-label=\"Wallet\"\n disabled={!walletConnected}\n onClick={() => {\n if (!walletConnected) return;\n onSelectFilter(ALL_CHAIN_FILTER);\n }}\n className={walletConnected\n ? chipClass(view === \"token\" && chainFilter === ALL_CHAIN_FILTER, false)\n : \"relative flex size-10 shrink-0 cursor-not-allowed items-center justify-center rounded-[12px] border border-solid border-transparent md:size-[50px]\"}\n >\n {walletConnected ? (\n <IconWallet className=\"size-4 text-black\" />\n ) : (\n <span className=\"flex size-8 items-center justify-center rounded-[8px] bg-[#EFEFEF]\">\n <IconWallet className=\"size-4 text-[#9FA7BA]\" />\n </span>\n )}\n </button>\n )}\n <div className=\"mt-2 flex min-h-0 w-full flex-1 flex-col items-center gap-2 overflow-y-auto\">\n {chips.map((chain) => {\n const locked = isChainKindLocked(chain.chainKind, lockChainKind);\n const chainDisabled = isBlockchainDisabled(chain.blockchain, disabledBlockchains);\n const disabled = locked || chainDisabled;\n const reason = chainDisabled\n ? disabledReason\n : locked\n ? `Recipient address is on ${chainKindLabel(lockChainKind!)}; edit the recipient to change chain`\n : undefined;\n const selected = view === \"token\" && chainFilter === chain.blockchain;\n return (\n <span key={chain.blockchain}>\n {wrapDisabled(\n disabled,\n reason,\n <button\n type=\"button\"\n aria-label={chain.chainName}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onSelectFilter(chain.blockchain);\n }}\n className={chipClass(selected, disabled)}\n >\n <img src={chain.logo} alt=\"\" className=\"size-6 object-cover md:size-8\" />\n {fundedBlockchains.has(chain.blockchain) ? (\n <span className=\"absolute top-1 right-1 size-2 rounded-full border border-white bg-[#06f] md:size-2.5\" />\n ) : null}\n </button>,\n )}\n </span>\n );\n })}\n </div>\n <div className=\"mt-2 flex w-full shrink-0 justify-center border-t border-[#e3e3e3] pt-2\">\n <button\n type=\"button\"\n aria-label=\"All networks\"\n onClick={onOpenNetworks}\n className={chipClass(view === \"network\", false)}\n >\n <IconAllNetworks className=\"size-4 text-black\" />\n </button>\n </div>\n </div>\n );\n}\n","import { SearchInput } from \"@stableflow/pay-ui/search-input\";\nimport { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { cx, fontSans, formatDisplayAmount } from \"./format\";\nimport type { ChainKind, PayToken } from \"./types\";\nimport { tokenBalanceUsd } from \"./utils\";\n\nexport type TokenListSection = {\n id: string;\n title?: string | null;\n walletKind?: ChainKind | null;\n tokens: PayToken[];\n badgeAssetId?: string | null;\n};\n\nexport type TokenPaneProps = {\n sections: TokenListSection[];\n selectedAssetId?: string | null;\n loading: boolean;\n showBalances?: boolean;\n showWalletStatus?: boolean;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n search?: string;\n onSearchChange?: (value: string) => void;\n showSearch?: boolean;\n searchClassName?: string;\n rowClassName?: string;\n};\n\nexport function TokenPane(props: TokenPaneProps) {\n const {\n sections,\n selectedAssetId,\n loading,\n showBalances = false,\n showWalletStatus = true,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n search = \"\",\n onSearchChange,\n showSearch = false,\n searchClassName,\n rowClassName,\n } = props;\n const visibleSections = sections.filter((section) => section.title || section.tokens.length > 0);\n const hasTokens = sections.some((section) => section.tokens.length > 0);\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {showSearch && onSearchChange ? (\n <SearchInput\n value={search}\n onChange={onSearchChange}\n placeholder=\"search or paste address\"\n className=\"mb-3 shrink-0\"\n inputClassName={cx(\n \"h-[36px] rounded-[18px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30\",\n searchClassName,\n )}\n />\n ) : null}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n {visibleSections.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-2 md:px-3.5\">\n <p className={cx(\"min-w-0 truncate text-sm font-medium text-[#aaa]\", fontSans)}>{section.title}</p>\n {showWalletStatus && section.walletKind ? <ChainWalletStatus kind={section.walletKind} /> : null}\n </div>\n ) : null}\n {section.tokens.map((token) => (\n <TokenRow\n key={`${section.id}-${token.assetId}`}\n token={token}\n selected={token.assetId === selectedAssetId}\n recent={token.assetId === section.badgeAssetId}\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 {loading && !hasTokens ? <TokenListSkeleton /> : null}\n {!loading && !hasTokens ? (\n <p className={cx(\"px-1 py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction TokenListSkeleton() {\n return (\n <div aria-hidden>\n {Array.from({ length: 6 }, (_, index) => (\n <div key={index} className=\"flex items-center gap-2.5 px-2 py-3 md:px-3.5\">\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\nfunction TokenRow(props: {\n token: PayToken;\n selected: boolean;\n recent: 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, recent, 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 w-full items-center justify-between gap-2 rounded-[12px] border-0 bg-transparent px-2 py-3 text-left hover:bg-[#F6F6F6] md:px-3.5\",\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 <img src={token.logo} alt=\"\" className=\"size-8 rounded-full object-cover\" />\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=\"flex min-w-0 items-center gap-1.5\">\n <span className={cx(\"truncate text-sm font-semibold text-black\", fontSans)}>{token.symbol}</span>\n {recent ? (\n <span className={cx(\"shrink-0 rounded-[9px] bg-[#06f]/10 px-1.5 text-[10px] font-medium leading-[18px] text-[#06f]\", fontSans)}>\n Recently Used\n </span>\n ) : null}\n </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 text-[#606060]\", fontSans)}>—</span>\n )}\n </span>\n ) : null}\n </button>\n );\n}\n"],"mappings":"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","names":["useEffect","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","useEffect","useEffect","useMemo","useSyncExternalStore","SearchInput","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","jsx","jsx","jsxs","Tooltip","jsx","jsxs","Tooltip","jsx","jsxs","jsx","jsxs","prefs","useSyncExternalStore","useMemo","owners","useEffect","ownerKey","matched","SearchInput"]}
|
|
1
|
+
{"version":3,"sources":["../../src/token-select/context.tsx","../../src/token-select/balances.ts","../../src/token-select/config.ts","../../src/token-select/pay-config.ts","../../src/token-select/logos.ts","../../src/token-select/TokenSelectDialog.tsx","../../src/token-select/prefs.ts","../../src/token-select/format.ts","../../src/token-select/chain-pane.tsx","../../src/token-select/chain-wallet-status.tsx","../../src/token-select/utils.ts","../../src/token-select/network-rail.tsx","../../src/token-select/token-pane.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo, type ReactNode } from \"react\";\nimport { clearPayTokenBalances, setBalanceReader } from \"./balances\";\nimport { setChainKindOverrides, usePayConfig } from \"./pay-config\";\nimport type { ChainKind, PayConfigSource, PayWallet, PopularTokenRef, ReadBalances } from \"./types\";\n\ntype PayWidgetsContextValue = {\n wallet: PayWallet;\n popularTokens: PopularTokenRef[];\n onCopyAddress?: (address: string) => void;\n};\n\nconst PayWidgetsContext = createContext<PayWidgetsContextValue | null>(null);\n\nexport type PayWidgetsProviderProps = {\n apiHost?: string;\n popularTokens?: PopularTokenRef[];\n wallet: PayWallet;\n readBalances: ReadBalances;\n onConfig?: (config: PayConfigSource) => void;\n onCopyAddress?: (address: string) => void;\n chainKinds?: Partial<Record<string, ChainKind>>;\n children: ReactNode;\n};\n\nexport function PayWidgetsProvider(props: PayWidgetsProviderProps) {\n const {\n apiHost,\n popularTokens = [],\n wallet,\n readBalances,\n onConfig,\n onCopyAddress,\n chainKinds,\n children,\n } = props;\n const config = usePayConfig({ apiHost });\n\n useEffect(() => {\n setChainKindOverrides(chainKinds);\n }, [chainKinds]);\n\n useEffect(() => {\n setBalanceReader(readBalances);\n return () => setBalanceReader(null);\n }, [readBalances]);\n\n useEffect(() => {\n if (config.status === \"success\" && config.source) onConfig?.(config.source);\n }, [config.source, config.status, onConfig]);\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 value = useMemo(\n () => ({ wallet, popularTokens, onCopyAddress }),\n [wallet, popularTokens, onCopyAddress],\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\nconst listeners = new Set<() => void>();\nlet balances: Record<string, TokenBalance> = {};\nlet reader: ReadBalances | null = null;\nconst chainInflight = new Map<string, Promise<void>>();\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}\n\nexport function clearPayTokenBalances() {\n balances = {};\n emit();\n}\n\nexport function getPayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n if (!owner || !assetId) return undefined;\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 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 CONFIG_STALE_MS = 30 * 60 * 1000;\nexport const ALL_CHAIN_FILTER = \"all\";\nexport const DEFAULT_API_HOST = \"https://api.stableflow.ai\";\nexport const POPULAR_SECTION_TITLE = \"Popular on your network\";\nexport const TOKEN_SELECT_PREFS_STORAGE_KEY = \"stableflow-pay:token-select-prefs:v1\";\nexport const TOKEN_SELECT_PREFS_VERSION = 2;\nexport const MAX_RECENT_BLOCKCHAINS = 16;\nexport const MAX_RECENT_ASSETS = 3;\n\n/** Preferred sidebar order when no wallet is connected. Later config chains append after this list. */\nexport const DISCONNECTED_CHAIN_ORDER = [\n \"near\",\n \"sol\",\n \"tron\",\n \"eth\",\n \"bsc\",\n \"arb\",\n \"base\",\n \"pol\",\n \"avax\",\n \"op\",\n \"bera\",\n \"gnosis\",\n \"xlayer\",\n \"scroll\",\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 { useCallback, useEffect, useSyncExternalStore } from \"react\";\nimport { CONFIG_STALE_MS, DEFAULT_API_HOST, 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\nexport type PayConfigStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\nexport type PayConfigSnapshot = {\n apiHost: string;\n chains: PayChain[];\n tokens: PayToken[];\n source: PayConfigSource | null;\n status: PayConfigStatus;\n error: string | null;\n fetchedAt: number | null;\n};\n\ntype ChainKindMap = Partial<Record<string, ChainKind>>;\n\nconst listeners = new Set<() => void>();\nlet chainKindOverrides: ChainKindMap = {};\nlet snapshot: PayConfigSnapshot = {\n apiHost: DEFAULT_API_HOST,\n chains: [],\n tokens: [],\n source: null,\n status: \"idle\",\n error: null,\n fetchedAt: null,\n};\nlet inflight: Promise<void> | null = null;\n\nfunction emit(next: PayConfigSnapshot) {\n snapshot = 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 getPayConfigSnapshot(): PayConfigSnapshot {\n return snapshot;\n}\n\nexport function setChainKindOverrides(overrides: ChainKindMap | null | undefined) {\n chainKindOverrides = overrides ?? {};\n if (snapshot.source) {\n const normalized = normalizePayConfig(snapshot.source, chainKindOverrides);\n emit({ ...snapshot, chains: normalized.chains, tokens: normalized.tokens });\n }\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 = chainKindOverrides): 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, overrides: ChainKindMap = chainKindOverrides): {\n chains: PayChain[];\n tokens: PayToken[];\n} {\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 const visible = hasNearWrap\n ? tokens.filter((token) => !(token.symbol === \"NEAR\" && token.blockchain === \"near\" && isNativeAddress(token.contractAddress)))\n : tokens;\n return { chains, tokens: visible };\n}\n\nexport function configUrl(apiHost: string): string {\n return `${apiHost.replace(/\\/$/, \"\")}/v1/pay/config`;\n}\n\nasync function load(apiHost: string, force: boolean) {\n const fresh = snapshot.apiHost === apiHost\n && snapshot.status === \"success\"\n && snapshot.fetchedAt != null\n && Date.now() - snapshot.fetchedAt < CONFIG_STALE_MS;\n if (!force && fresh) return;\n if (inflight && !force) return inflight;\n\n emit({ ...snapshot, apiHost, status: snapshot.tokens.length > 0 ? snapshot.status : \"loading\", error: null });\n const run = (async () => {\n try {\n const response = await fetch(configUrl(apiHost));\n if (!response.ok) throw new Error(`Config request failed (${response.status})`);\n const source = mapPayConfigSource(await response.json());\n const normalized = normalizePayConfig(source, chainKindOverrides);\n emit({\n apiHost,\n source,\n chains: normalized.chains,\n tokens: normalized.tokens,\n status: \"success\",\n error: null,\n fetchedAt: Date.now(),\n });\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"Failed to load config\";\n emit({\n ...snapshot,\n apiHost,\n status: snapshot.source ? \"success\" : \"error\",\n error: message,\n });\n } finally {\n inflight = null;\n }\n })();\n inflight = run;\n return run;\n}\n\nexport function refetchPayConfig(apiHost = snapshot.apiHost) {\n return load(apiHost, true);\n}\n\nexport function usePayConfigSnapshot(): PayConfigSnapshot {\n return useSyncExternalStore(subscribe, getPayConfigSnapshot, getPayConfigSnapshot);\n}\n\nexport function usePayConfig(options?: { apiHost?: string }) {\n const apiHost = options?.apiHost?.trim() || DEFAULT_API_HOST;\n const current = useSyncExternalStore(subscribe, getPayConfigSnapshot, getPayConfigSnapshot);\n const refetch = useCallback(() => {\n void refetchPayConfig(apiHost);\n }, [apiHost]);\n\n useEffect(() => {\n void load(apiHost, false);\n }, [apiHost]);\n\n return {\n chains: current.apiHost === apiHost ? current.chains : [],\n tokens: current.apiHost === apiHost ? current.tokens : [],\n source: current.apiHost === apiHost ? current.source : null,\n status: current.apiHost === apiHost ? current.status : \"loading\" as const,\n error: current.apiHost === apiHost ? current.error : null,\n refetch,\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\nfunction logoPath(path: string): string {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return `${LOGO_HOST}${normalized}`;\n}\n\nexport function evmTypeLogoUrl(): string {\n return logoPath(\"/stableflow/networks/type-evm.svg\");\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 { 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 { ALL_CHAIN_FILTER, POPULAR_SECTION_TITLE, TOKEN_BALANCE_POLL_MS } from \"./config\";\nimport { usePayWidgets } from \"./context\";\nimport { usePayConfigSnapshot } from \"./pay-config\";\nimport { getTokenSelectPrefs, setLastBlockchain, setLastToken, useTokenSelectPrefs } from \"./prefs\";\nimport { cx, fontSans } from \"./format\";\nimport { ChainPane } from \"./chain-pane\";\nimport { NetworkRail } from \"./network-rail\";\nimport { TokenPane, type TokenListSection } from \"./token-pane\";\nimport type { ChainKind, ChainOwners, PayToken, TokenSelectRole } from \"./types\";\nimport {\n chainHasBalance,\n initialChainFilter,\n isBlockchainDisabled,\n isChainKindLocked,\n matchesChainFilter,\n popularTokensForWallets,\n positiveBalanceTokens,\n recentTokensInOrder,\n sortChainsForSidebar,\n sortTokensByBalance,\n sortTokensBySymbol,\n tokenBalanceUsd,\n tokenMatchesSearch,\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 closeClassName?: string;\n contentClassName?: string;\n searchClassName?: string;\n railClassName?: string;\n rowClassName?: string;\n};\n\nconst SEARCH_INPUT_CLASS = \"h-[36px] rounded-[18px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30\";\n\nfunction chainsFromTokens(tokens: PayToken[]) {\n const byCode = new Map<string, PayToken[\"chain\"]>();\n for (const token of tokens) {\n if (!byCode.has(token.blockchain)) byCode.set(token.blockchain, token.chain);\n }\n return Array.from(byCode.values());\n}\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 closeClassName,\n contentClassName,\n searchClassName,\n railClassName,\n rowClassName,\n } = props;\n const payer = role === \"payer\";\n const showBalances = payer;\n const { wallet, popularTokens: popularRefs } = usePayWidgets();\n const { tokens, status } = usePayConfigSnapshot();\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 as ChainKind] = address;\n }\n return owners;\n }, [wallet.accounts]);\n const owners = showBalances ? { ...connectedOwners, ...balanceOwners } : {};\n const walletConnected = hasAnyOwner(connectedOwners);\n const walletWasConnected = useRef<boolean | null>(null);\n const [search, setSearch] = useState(\"\");\n const [chainFilter, setChainFilter] = useState(ALL_CHAIN_FILTER);\n const [view, setView] = useState<\"token\" | \"network\">(\"token\");\n const loading = status === \"loading\" || status === \"idle\";\n\n useEffect(() => {\n if (!open) return;\n setSearch(\"\");\n if (lockChainKind) {\n setView(\"token\");\n return;\n }\n if (!payer) {\n setView(\"token\");\n setChainFilter(ALL_CHAIN_FILTER);\n }\n }, [open, lockChainKind, payer]);\n\n useEffect(() => {\n if (!open || !lockChainKind || tokens.length === 0) return;\n setChainFilter(initialChainFilter(\n lockChainKind,\n getTokenSelectPrefs().recentBlockchains,\n chainsFromTokens(tokens),\n ));\n }, [open, lockChainKind, tokens]);\n\n useEffect(() => {\n if (!open) {\n walletWasConnected.current = null;\n return;\n }\n if (lockChainKind || !payer) {\n walletWasConnected.current = walletConnected;\n return;\n }\n const previous = walletWasConnected.current;\n walletWasConnected.current = walletConnected;\n if (previous !== null && previous === walletConnected) return;\n setView(walletConnected ? \"token\" : \"network\");\n setChainFilter(ALL_CHAIN_FILTER);\n }, [open, lockChainKind, payer, walletConnected]);\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 ownerKey = ([\"evm\", \"near\", \"solana\", \"tron\", \"zec\"] as const)\n .map((kind) => `${kind}:${owners[kind] ?? \"\"}`)\n .join(\"|\");\n const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join(\"|\"), [scopedTokens]);\n const ownersRef = useRef(owners);\n const tokensRef = useRef(scopedTokens);\n ownersRef.current = owners;\n tokensRef.current = scopedTokens;\n\n useEffect(() => {\n if (!showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;\n void ensurePayTokenBalances(ownersRef.current, tokensRef.current);\n const id = window.setInterval(() => {\n void ensurePayTokenBalances(ownersRef.current, tokensRef.current, { force: true });\n }, TOKEN_BALANCE_POLL_MS);\n return () => window.clearInterval(id);\n }, [showBalances, open, ownerKey, tokenKey]);\n\n function balanceOf(token: PayToken) {\n return getPayTokenBalance(ownerForToken(owners, token), 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 entry = getPayTokenBalance(owner, token.assetId);\n return entry?.formatted == null && (!entry || entry.status === \"loading\");\n }\n\n const availableChains = useMemo(() => {\n const codes = new Set(scopedTokens.map((token) => token.blockchain));\n const byCode = new Map<string, PayToken[\"chain\"]>();\n for (const token of scopedTokens) {\n if (codes.has(token.blockchain) && !byCode.has(token.blockchain)) byCode.set(token.blockchain, token.chain);\n }\n return Array.from(byCode.values());\n }, [scopedTokens]);\n\n const sortedChains = useMemo(\n () => sortChainsForSidebar(availableChains, scopedTokens, {\n showBalances,\n walletConnected,\n getBalanceUsd: (token) => tokenBalanceUsd(token, getPayTokenBalance(ownerForToken(owners, token), token.assetId)?.formatted),\n }),\n [availableChains, scopedTokens, showBalances, walletConnected, owners, balanceEntries],\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) => (\n getPayTokenBalance(ownerForToken(owners, token), token.assetId)?.formatted\n ))) {\n funded.add(chain.blockchain);\n }\n }\n return funded;\n }, [availableChains, owners, scopedTokens, showBalances, balanceEntries]);\n\n const popularTokens = useMemo(\n () => popularTokensForWallets(scopedTokens, popularRefs, (kind) => Boolean(connectedOwners[kind])),\n [scopedTokens, popularRefs, connectedOwners],\n );\n\n const newestAssetId = showBalances ? prefs.recentAssetIds[0] ?? null : null;\n const searchingAll = chainFilter === ALL_CHAIN_FILTER && search.trim().length > 0;\n const walletKind = chainFilter === ALL_CHAIN_FILTER\n ? null\n : availableChains.find((chain) => chain.blockchain === chainFilter)?.chainKind ?? null;\n\n const sections = useMemo((): TokenListSection[] => {\n if (showBalances && chainFilter === ALL_CHAIN_FILTER && searchingAll) {\n const matched = scopedTokens.filter((token) => tokenMatchesSearch(token, search));\n return [{\n id: \"search\",\n tokens: sortTokensByBalance(matched, usdOf, loadingOf),\n badgeAssetId: newestAssetId,\n }];\n }\n\n if (showBalances && chainFilter === ALL_CHAIN_FILTER) {\n const next: TokenListSection[] = [];\n const recent = recentTokensInOrder(scopedTokens, prefs.recentAssetIds);\n if (recent.length > 0) {\n next.push({\n id: \"recent\",\n title: \"Recently Used\",\n tokens: recent,\n badgeAssetId: newestAssetId,\n });\n }\n const yours = positiveBalanceTokens(scopedTokens, usdOf);\n if (yours.length > 0) {\n next.push({ id: \"yours\", title: \"Your Tokens\", tokens: yours });\n }\n if (popularTokens.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popularTokens });\n }\n return next;\n }\n\n const matched = scopedTokens.filter((token) => (\n matchesChainFilter(token, chainFilter) && tokenMatchesSearch(token, search)\n ));\n\n if (!showBalances && chainFilter === ALL_CHAIN_FILTER && !search.trim()) {\n const next: TokenListSection[] = [];\n if (popularTokens.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popularTokens });\n }\n next.push({ id: \"all\", tokens: sortTokensBySymbol(matched) });\n return next;\n }\n\n const chainName = availableChains.find((chain) => chain.blockchain === chainFilter)?.chainName ?? chainFilter;\n return [{\n id: chainFilter,\n title: chainName,\n walletKind,\n tokens: showBalances ? sortTokensByBalance(matched, usdOf, loadingOf) : sortTokensBySymbol(matched),\n badgeAssetId: showBalances ? newestAssetId : null,\n }];\n }, [\n showBalances,\n chainFilter,\n searchingAll,\n search,\n scopedTokens,\n prefs.recentAssetIds,\n newestAssetId,\n walletKind,\n balanceEntries,\n owners,\n popularTokens,\n availableChains,\n ]);\n\n function handleSelectFilter(filter: string) {\n setChainFilter(filter);\n if (filter !== ALL_CHAIN_FILTER) setLastBlockchain(filter);\n setView(\"token\");\n }\n\n function handleSelectToken(token: PayToken) {\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 onSelect({ token });\n onClose();\n }\n\n const awaitingBalances = showBalances\n && chainFilter === ALL_CHAIN_FILTER\n && !searchingAll\n && scopedTokens.some((token) => loadingOf(token));\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={title}\n titleClassName={cx(\n \"min-w-0 flex-1 truncate text-base font-medium text-[#606060] md:flex-none\",\n fontSans,\n titleClassName,\n )}\n closeClassName={cx(view === \"token\" ? \"ml-0\" : undefined, closeClassName)}\n contentClassName={contentClassName}\n headerAction={view === \"token\" ? (\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"ml-auto hidden w-[215px] shrink-0 md:block\"\n inputClassName={cx(SEARCH_INPUT_CLASS, searchClassName)}\n />\n ) : null}\n cardClassName={cx(\"w-full max-h-[90vh] md:w-[474px]\", className)}\n >\n <div className=\"flex h-[min(520px,62vh)] min-h-0 flex-col overflow-hidden md:h-[min(555px,70vh)]\">\n {view === \"token\" ? (\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"mb-3 shrink-0 md:hidden\"\n inputClassName={cx(SEARCH_INPUT_CLASS, searchClassName)}\n />\n ) : null}\n <div className=\"flex min-h-0 flex-1\">\n <NetworkRail\n view={view}\n chainFilter={chainFilter}\n chips={sortedChains}\n fundedBlockchains={fundedBlockchains}\n walletConnected={walletConnected}\n showAllLabel={!payer}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n onSelectFilter={handleSelectFilter}\n onOpenNetworks={() => setView(\"network\")}\n className={railClassName}\n />\n {view === \"network\" ? (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col pl-3 md:pl-4\">\n <ChainPane\n chains={sortedChains}\n fundedBlockchains={fundedBlockchains}\n showWalletStatus={payer}\n onSelectFilter={handleSelectFilter}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n />\n </div>\n ) : (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col pl-3 md:pl-4\">\n <TokenPane\n sections={sections}\n selectedAssetId={selectedAssetId}\n loading={loading || awaitingBalances}\n showBalances={showBalances}\n showWalletStatus={payer}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={handleSelectToken}\n isTokenDisabled={(token) => (\n isBlockchainDisabled(token.blockchain, disabledBlockchains)\n || isChainKindLocked(token.chain.chainKind, lockChainKind)\n )}\n searchClassName={searchClassName}\n rowClassName={rowClassName}\n />\n </div>\n )}\n </div>\n </div>\n </Dialog>\n );\n}\n","import { useSyncExternalStore } from \"react\";\nimport {\n MAX_RECENT_ASSETS,\n MAX_RECENT_BLOCKCHAINS,\n TOKEN_SELECT_PREFS_STORAGE_KEY,\n TOKEN_SELECT_PREFS_VERSION,\n} from \"./config\";\n\nexport type TokenSelectPrefs = {\n recentAssetIds: string[];\n recentBlockchains: string[];\n};\n\nconst EMPTY_PREFS: TokenSelectPrefs = { recentAssetIds: [], recentBlockchains: [] };\n\nexport function rememberRecentAsset(recent: string[], assetId: string): string[] {\n const id = assetId.trim();\n if (!id) return recent;\n return [id, ...recent.filter((item) => item !== id)].slice(0, MAX_RECENT_ASSETS);\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\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 recentBlockchains?: string[];\n };\n const recentBlockchains = version >= 1\n ? (Array.isArray(state.recentBlockchains) ? state.recentBlockchains : [])\n : (typeof state.lastBlockchain === \"string\" && state.lastBlockchain ? [state.lastBlockchain] : []);\n const recentAssetIds = version >= TOKEN_SELECT_PREFS_VERSION && Array.isArray(state.recentAssetIds)\n ? state.recentAssetIds.filter((id) => typeof id === \"string\" && id.trim()).slice(0, MAX_RECENT_ASSETS)\n : (typeof state.lastAssetId === \"string\" && state.lastAssetId ? [state.lastAssetId] : []);\n return { recentAssetIds, 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 recentAssetIds: rememberRecentAsset(prefs.recentAssetIds, assetId),\n recentBlockchains: rememberRecentBlockchain(prefs.recentBlockchains, blockchain),\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 { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\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 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): string {\n if (kind === \"evm\") return \"EVM\";\n if (kind === \"near\") return \"Near\";\n if (kind === \"solana\") return \"Solana\";\n if (kind === \"tron\") return \"Tron\";\n if (kind === \"zec\") return \"Zcash\";\n return 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 { useState, type ReactNode } from \"react\";\nimport { IconArrowDown } from \"@stableflow/pay-ui/icons/arrow-down\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { chainKindLabel, cx, fontSans } from \"./format\";\nimport { evmTypeLogoUrl } from \"./logos\";\nimport type { ChainKind } from \"./types\";\nimport { groupEvmChains, isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type ChainPaneProps = {\n chains: SidebarChain[];\n fundedBlockchains: ReadonlySet<string>;\n showWalletStatus?: boolean;\n onSelectFilter: (filter: string) => void;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n};\n\nfunction lockReason(lockChainKind: ChainKind): string {\n return `Recipient address is on ${chainKindLabel(lockChainKind)}; edit the recipient to change chain`;\n}\n\nexport function ChainPane(props: ChainPaneProps) {\n const {\n chains,\n fundedBlockchains,\n showWalletStatus = true,\n onSelectFilter,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n } = props;\n const [evmExpanded, setEvmExpanded] = useState(true);\n\n function wrapDisabled(disabled: boolean, reason: string | undefined, content: ReactNode) {\n if (!disabled || !reason) return content;\n return (\n <Tooltip side=\"right\" triggerClassName=\"min-w-0 flex-1\" content={reason}>\n {content}\n </Tooltip>\n );\n }\n\n function chainRow(chain: SidebarChain, nested: boolean) {\n const locked = isChainKindLocked(chain.chainKind, lockChainKind);\n const chainDisabled = isBlockchainDisabled(chain.blockchain, disabledBlockchains);\n const disabled = locked || chainDisabled;\n const reason = chainDisabled\n ? disabledReason\n : locked && lockChainKind\n ? lockReason(lockChainKind)\n : undefined;\n return (\n <div\n key={chain.blockchain}\n className={cx(\n \"flex min-h-14 w-full items-center gap-2 rounded-[12px] px-2 md:min-h-[66px] md:gap-3 md:px-3\",\n disabled ? \"opacity-40\" : \"hover:bg-[#F6F6F6]\",\n nested ? \"min-h-12 md:min-h-14\" : \"\",\n )}\n >\n {wrapDisabled(\n disabled,\n reason,\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onSelectFilter(chain.blockchain);\n }}\n className={cx(\n \"flex min-w-0 flex-1 items-center gap-3 border-0 bg-transparent text-left\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <span className=\"relative size-8 shrink-0\">\n <img src={chain.logo} alt=\"\" className=\"size-8 object-cover\" />\n {fundedBlockchains.has(chain.blockchain) ? (\n <span className=\"absolute -top-0.5 -right-0.5 size-2 rounded-full border border-white bg-[#06f] md:size-2.5\" />\n ) : null}\n </span>\n <span className={cx(\"truncate text-sm font-medium text-black md:text-base\", fontSans)}>{chain.chainName}</span>\n </button>,\n )}\n {showWalletStatus && !nested ? <ChainWalletStatus kind={chain.chainKind} /> : null}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <p className={cx(\"shrink-0 text-sm font-medium text-[#aaa]\", fontSans)}>All Networks</p>\n <div className=\"mt-3 flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto\">\n {groupEvmChains(chains).map((entry) => {\n if (entry.kind === \"chain\") return chainRow(entry.chain, false);\n return (\n <div key=\"evm\" className=\"rounded-[12px] px-2 md:px-3 py-2 hover:bg-[rgba(185,215,255,0.1)]\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-[10px] bg-[#627EEA]\">\n <img src={evmTypeLogoUrl()} alt=\"\" className=\"size-5 object-contain\" />\n </span>\n <span className={cx(\"truncate text-sm font-medium text-black md:text-base\", fontSans)}>EVM-based</span>\n </div>\n {showWalletStatus ? <ChainWalletStatus kind=\"evm\" /> : <span className=\"min-w-0 flex-1\" />}\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n {evmExpanded ? <span className=\"min-w-0 flex-1\" /> : (\n <span className=\"flex min-w-0 flex-1 overflow-hidden\">\n {entry.chains.map((chain, index) => (\n <img\n key={chain.blockchain}\n src={chain.logo}\n alt=\"\"\n style={{ zIndex: entry.chains.length - index }}\n className={index === 0\n ? \"relative size-4 shrink-0 rounded-[4px] border border-white object-cover\"\n : \"relative -ml-1.5 size-4 shrink-0 rounded-[4px] border border-white object-cover\"}\n />\n ))}\n </span>\n )}\n <button\n type=\"button\"\n aria-expanded={evmExpanded}\n aria-label={evmExpanded ? \"Collapse EVM-based\" : \"Expand EVM-based\"}\n onClick={() => setEvmExpanded((open) => !open)}\n className=\"ml-auto inline-flex shrink-0 cursor-pointer border-0 bg-transparent p-1 text-[#606060]\"\n >\n <IconArrowDown className={cx(\"size-3 transition-transform\", evmExpanded ? \"rotate-180\" : \"\")} />\n </button>\n </div>\n {evmExpanded ? (\n <div className=\"mt-2 border-t border-[#e3e3e3] pt-1\">\n {entry.chains.map((chain) => chainRow(chain, true))}\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { MouseEvent } from \"react\";\nimport { IconCopy } from \"@stableflow/pay-ui/icons/copy\";\nimport { IconLogout } from \"@stableflow/pay-ui/icons/logout\";\nimport { usePayWidgets } from \"./context\";\nimport { cx, fontSans, formatAddress } from \"./format\";\nimport type { ChainKind } from \"./types\";\n\nfunction stop(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport function ChainWalletStatus({ kind }: { kind: ChainKind }) {\n const { wallet, onCopyAddress } = usePayWidgets();\n const account = wallet.accounts[kind];\n const address = account?.address?.trim() || \"\";\n const hideDisconnect = account?.canDisconnect === false;\n\n if (!address) {\n return (\n <button\n type=\"button\"\n onClick={(event) => {\n stop(event);\n void wallet.connect(kind);\n }}\n className={cx(\"shrink-0 cursor-pointer border-0 bg-transparent p-0 text-xs font-medium text-[#3F8AFB] hover:underline\", fontSans)}\n >\n {account?.connecting ? \"Connecting…\" : \"Connect\"}\n </button>\n );\n }\n\n return (\n <div className=\"flex min-w-0 items-center gap-1\" onClick={stop}>\n <button\n type=\"button\"\n onClick={async (event) => {\n stop(event);\n if (!onCopyAddress) return;\n onCopyAddress(address);\n }}\n className={cx(\"truncate border-0 bg-transparent p-0 text-xs text-[#606060] hover:text-black\", fontSans)}\n >\n {formatAddress(address)}\n </button>\n <button\n type=\"button\"\n aria-label=\"Copy address\"\n onClick={(event) => {\n stop(event);\n if (!onCopyAddress) return;\n onCopyAddress(address);\n }}\n className=\"inline-flex shrink-0 cursor-pointer border-0 bg-transparent p-0 text-[#606060] hover:text-black\"\n >\n <IconCopy className=\"size-3\" />\n </button>\n {hideDisconnect ? null : (\n <button\n type=\"button\"\n aria-label=\"Disconnect\"\n onClick={(event) => {\n stop(event);\n void wallet.disconnect(kind);\n }}\n className=\"inline-flex shrink-0 cursor-pointer border-0 bg-transparent p-0 text-[#ff5656]\"\n >\n <IconLogout className=\"size-3\" />\n </button>\n )}\n </div>\n );\n}\n","import { ALL_CHAIN_FILTER, DISCONNECTED_CHAIN_ORDER } from \"./config\";\nimport type { ChainKind, PayToken, PopularTokenRef } from \"./types\";\n\nexport type SidebarChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n logo: string;\n};\n\nexport type SidebarEntry =\n | { kind: \"chain\"; chain: SidebarChain }\n | { kind: \"evm\"; chains: SidebarChain[] };\n\n/** Fold every EVM chain into one group at the first EVM chain's position. */\nexport function groupEvmChains(chains: readonly SidebarChain[]): SidebarEntry[] {\n const evm = chains.filter((chain) => chain.chainKind === \"evm\");\n if (evm.length === 0) return chains.map((chain) => ({ kind: \"chain\", chain }));\n let placed = false;\n const entries: SidebarEntry[] = [];\n for (const chain of chains) {\n if (chain.chainKind === \"evm\") {\n if (!placed) {\n entries.push({ kind: \"evm\", chains: evm });\n placed = true;\n }\n continue;\n }\n entries.push({ kind: \"chain\", chain });\n }\n return entries;\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, \"contractAddress\" | \"symbol\" | \"providerSymbol\">,\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\nconst DISCONNECTED_CHAIN_RANK = new Map<string, number>(\n DISCONNECTED_CHAIN_ORDER.map((code, index) => [code, index]),\n);\n\nexport type { PopularTokenRef };\nexport function parsePopularTokens(raw: string | null | undefined): PopularTokenRef[] {\n if (!raw?.trim()) return [];\n const refs: PopularTokenRef[] = [];\n for (const part of raw.split(\",\")) {\n const trimmed = part.trim();\n const colon = trimmed.indexOf(\":\");\n if (colon <= 0 || colon >= trimmed.length - 1) continue;\n const blockchain = trimmed.slice(0, colon).trim().toLowerCase();\n const symbol = trimmed.slice(colon + 1).trim();\n if (!blockchain || !symbol || symbol.includes(\":\")) continue;\n refs.push({ blockchain, symbol: symbol.toUpperCase() });\n }\n return refs;\n}\n\nexport function popularTokensForWallets<T extends {\n blockchain: string;\n symbol: string;\n chain: { chainKind: ChainKind };\n}>(\n tokens: T[],\n configured: readonly PopularTokenRef[],\n isChainConnected: (chainKind: ChainKind) => boolean,\n): T[] {\n const result: T[] = [];\n for (const ref of configured) {\n const token = tokens.find((item) => (\n item.blockchain === ref.blockchain && item.symbol.toUpperCase() === ref.symbol\n ));\n if (!token || !isChainConnected(token.chain.chainKind)) continue;\n result.push(token);\n }\n return result;\n}\n\n/**\n * No wallet: preferred chains first, then any other chain in the incoming order.\n * A connected wallet with balances: funded chains first by total USD.\n * A connected wallet without balances: keep registry order.\n */\nexport function sortChainsForSidebar<T extends Pick<PayToken, \"blockchain\">>(\n chains: SidebarChain[],\n tokens: T[],\n options: {\n showBalances: boolean;\n walletConnected: boolean;\n getBalanceUsd: (token: T) => number;\n },\n): SidebarChain[] {\n if (!options.walletConnected) {\n const tail = DISCONNECTED_CHAIN_ORDER.length;\n return chains\n .map((chain, index) => ({ chain, index }))\n .sort((left, right) => {\n const leftRank = DISCONNECTED_CHAIN_RANK.get(left.chain.blockchain) ?? tail;\n const rightRank = DISCONNECTED_CHAIN_RANK.get(right.chain.blockchain) ?? tail;\n if (leftRank !== rightRank) return leftRank - rightRank;\n return left.index - right.index;\n })\n .map((item) => item.chain);\n }\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 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 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 type { ReactNode } from \"react\";\nimport { IconAllNetworks } from \"@stableflow/pay-ui/icons/all-networks\";\nimport { IconWallet } from \"@stableflow/pay-ui/icons/wallet\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ALL_CHAIN_FILTER } from \"./config\";\nimport { chainKindLabel, cx, fontSans } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type NetworkRailProps = {\n view: \"token\" | \"network\";\n chainFilter: string;\n chips: SidebarChain[];\n fundedBlockchains: ReadonlySet<string>;\n walletConnected: boolean;\n showAllLabel?: boolean;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n onSelectFilter: (filter: string) => void;\n onOpenNetworks: () => void;\n className?: string;\n};\n\nfunction chipClass(selected: boolean, disabled: boolean) {\n return cx(\n \"relative flex size-10 shrink-0 items-center justify-center rounded-[12px] border border-solid md:size-[50px]\",\n selected ? \"border-[#06f] bg-[rgba(0,102,255,0.1)]\" : \"border-transparent bg-transparent\",\n disabled ? \"cursor-not-allowed opacity-40\" : \"cursor-pointer hover:bg-black/5\",\n );\n}\n\nexport function NetworkRail(props: NetworkRailProps) {\n const {\n view,\n chainFilter,\n chips,\n fundedBlockchains,\n walletConnected,\n showAllLabel = false,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n onSelectFilter,\n onOpenNetworks,\n className,\n } = props;\n\n function wrapDisabled(disabled: boolean, reason: string | undefined, content: ReactNode) {\n if (!disabled || !reason) return content;\n return (\n <Tooltip side=\"right\" content={reason}>\n {content}\n </Tooltip>\n );\n }\n\n return (\n <div className={cx(\"flex h-full w-[52px] shrink-0 flex-col items-center border-r border-[#e3e3e3] pr-2 md:w-[72px] md:pr-3\", className)}>\n {showAllLabel ? (\n <button\n type=\"button\"\n aria-label=\"All\"\n onClick={() => onSelectFilter(ALL_CHAIN_FILTER)}\n className={chipClass(view === \"token\" && chainFilter === ALL_CHAIN_FILTER, false)}\n >\n <span className={cx(\"text-xs font-medium text-black md:text-sm\", fontSans)}>All</span>\n </button>\n ) : (\n <button\n type=\"button\"\n aria-label=\"Wallet\"\n disabled={!walletConnected}\n onClick={() => {\n if (!walletConnected) return;\n onSelectFilter(ALL_CHAIN_FILTER);\n }}\n className={walletConnected\n ? chipClass(view === \"token\" && chainFilter === ALL_CHAIN_FILTER, false)\n : \"relative flex size-10 shrink-0 cursor-not-allowed items-center justify-center rounded-[12px] border border-solid border-transparent md:size-[50px]\"}\n >\n {walletConnected ? (\n <IconWallet className=\"size-4 text-black\" />\n ) : (\n <span className=\"flex size-8 items-center justify-center rounded-[8px] bg-[#EFEFEF]\">\n <IconWallet className=\"size-4 text-[#9FA7BA]\" />\n </span>\n )}\n </button>\n )}\n <div className=\"mt-2 flex min-h-0 w-full flex-1 flex-col items-center gap-2 overflow-y-auto\">\n {chips.map((chain) => {\n const locked = isChainKindLocked(chain.chainKind, lockChainKind);\n const chainDisabled = isBlockchainDisabled(chain.blockchain, disabledBlockchains);\n const disabled = locked || chainDisabled;\n const reason = chainDisabled\n ? disabledReason\n : locked\n ? `Recipient address is on ${chainKindLabel(lockChainKind!)}; edit the recipient to change chain`\n : undefined;\n const selected = view === \"token\" && chainFilter === chain.blockchain;\n return (\n <span key={chain.blockchain}>\n {wrapDisabled(\n disabled,\n reason,\n <button\n type=\"button\"\n aria-label={chain.chainName}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onSelectFilter(chain.blockchain);\n }}\n className={chipClass(selected, disabled)}\n >\n <img src={chain.logo} alt=\"\" className=\"size-6 object-cover md:size-8\" />\n {fundedBlockchains.has(chain.blockchain) ? (\n <span className=\"absolute top-1 right-1 size-2 rounded-full border border-white bg-[#06f] md:size-2.5\" />\n ) : null}\n </button>,\n )}\n </span>\n );\n })}\n </div>\n <div className=\"mt-2 flex w-full shrink-0 justify-center border-t border-[#e3e3e3] pt-2\">\n <button\n type=\"button\"\n aria-label=\"All networks\"\n onClick={onOpenNetworks}\n className={chipClass(view === \"network\", false)}\n >\n <IconAllNetworks className=\"size-4 text-black\" />\n </button>\n </div>\n </div>\n );\n}\n","import { SearchInput } from \"@stableflow/pay-ui/search-input\";\nimport { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { cx, fontSans, formatDisplayAmount } from \"./format\";\nimport type { ChainKind, PayToken } from \"./types\";\nimport { tokenBalanceUsd } from \"./utils\";\n\nexport type TokenListSection = {\n id: string;\n title?: string | null;\n walletKind?: ChainKind | null;\n tokens: PayToken[];\n badgeAssetId?: string | null;\n};\n\nexport type TokenPaneProps = {\n sections: TokenListSection[];\n selectedAssetId?: string | null;\n loading: boolean;\n showBalances?: boolean;\n showWalletStatus?: boolean;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n search?: string;\n onSearchChange?: (value: string) => void;\n showSearch?: boolean;\n searchClassName?: string;\n rowClassName?: string;\n};\n\nexport function TokenPane(props: TokenPaneProps) {\n const {\n sections,\n selectedAssetId,\n loading,\n showBalances = false,\n showWalletStatus = true,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n search = \"\",\n onSearchChange,\n showSearch = false,\n searchClassName,\n rowClassName,\n } = props;\n const visibleSections = sections.filter((section) => section.title || section.tokens.length > 0);\n const hasTokens = sections.some((section) => section.tokens.length > 0);\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {showSearch && onSearchChange ? (\n <SearchInput\n value={search}\n onChange={onSearchChange}\n placeholder=\"search or paste address\"\n className=\"mb-3 shrink-0\"\n inputClassName={cx(\n \"h-[36px] rounded-[18px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30\",\n searchClassName,\n )}\n />\n ) : null}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto\">\n {visibleSections.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-2 md:px-3.5\">\n <p className={cx(\"min-w-0 truncate text-sm font-medium text-[#aaa]\", fontSans)}>{section.title}</p>\n {showWalletStatus && section.walletKind ? <ChainWalletStatus kind={section.walletKind} /> : null}\n </div>\n ) : null}\n {section.tokens.map((token) => (\n <TokenRow\n key={`${section.id}-${token.assetId}`}\n token={token}\n selected={token.assetId === selectedAssetId}\n recent={token.assetId === section.badgeAssetId}\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 {loading && !hasTokens ? <TokenListSkeleton /> : null}\n {!loading && !hasTokens ? (\n <p className={cx(\"px-1 py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction TokenListSkeleton() {\n return (\n <div aria-hidden>\n {Array.from({ length: 6 }, (_, index) => (\n <div key={index} className=\"flex items-center gap-2.5 px-2 py-3 md:px-3.5\">\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\nfunction TokenRow(props: {\n token: PayToken;\n selected: boolean;\n recent: 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, recent, 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 w-full items-center justify-between gap-2 rounded-[12px] border-0 bg-transparent px-2 py-3 text-left hover:bg-[#F6F6F6] md:px-3.5\",\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 <img src={token.logo} alt=\"\" className=\"size-8 rounded-full object-cover\" />\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=\"flex min-w-0 items-center gap-1.5\">\n <span className={cx(\"truncate text-sm font-semibold text-black\", fontSans)}>{token.symbol}</span>\n {recent ? (\n <span className={cx(\"shrink-0 rounded-[9px] bg-[#06f]/10 px-1.5 text-[10px] font-medium leading-[18px] text-[#06f]\", fontSans)}>\n Recently Used\n </span>\n ) : null}\n </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 text-[#606060]\", fontSans)}>—</span>\n )}\n </span>\n ) : null}\n </button>\n );\n}\n"],"mappings":"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","names":["useEffect","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","useEffect","useEffect","useMemo","useState","useSyncExternalStore","SearchInput","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","jsx","jsx","jsxs","Tooltip","jsx","jsxs","Tooltip","jsx","jsxs","jsx","jsxs","prefs","useSyncExternalStore","useMemo","owners","useState","useEffect","ownerKey","matched","SearchInput"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stableflow/pay-widgets",
|
|
3
|
-
"version": "0.0.1
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"description": "Business widgets for Stableflow Pay. Data comes in through props and callbacks.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"stableflow",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"clsx": "^2.1.1",
|
|
33
33
|
"tailwind-merge": "^3.7.0",
|
|
34
|
-
"@stableflow/pay-ui": "0.0.1
|
|
34
|
+
"@stableflow/pay-ui": "0.0.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/react": "^19.1.9",
|