@stableflow/pay-widgets 0.2.0-beta-e820becee0-20261012 → 0.2.0-beta-90dffc3d2f-20261012
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 +140 -100
- package/dist/token-select/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -297,7 +297,7 @@ function usePayWidgets() {
|
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
// src/token-select/TokenSelectDialog.tsx
|
|
300
|
-
import { useEffect as
|
|
300
|
+
import { useEffect as useEffect3, useLayoutEffect, useMemo, useRef as useRef2, useState as useState2, useSyncExternalStore as useSyncExternalStore3 } from "react";
|
|
301
301
|
import { Dialog } from "@stableflow/pay-ui/dialog";
|
|
302
302
|
import { SearchInput } from "@stableflow/pay-ui/search-input";
|
|
303
303
|
|
|
@@ -909,7 +909,80 @@ function useTokenSelectPrefs() {
|
|
|
909
909
|
// src/token-select/token-pane.tsx
|
|
910
910
|
import { IconChevron as IconChevron2 } from "@stableflow/pay-ui/icons/chevron";
|
|
911
911
|
import { Skeleton } from "@stableflow/pay-ui/skeleton";
|
|
912
|
-
|
|
912
|
+
|
|
913
|
+
// src/token-select/lazy-image.tsx
|
|
914
|
+
import { useEffect as useEffect2, useRef, useState } from "react";
|
|
915
|
+
import { useInView } from "motion/react";
|
|
916
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
917
|
+
function LazyImage(props) {
|
|
918
|
+
const { src, fallbackSrc, alt = "", className } = props;
|
|
919
|
+
const ref = useRef(null);
|
|
920
|
+
const inView = useInView(ref, { once: true });
|
|
921
|
+
const [failedSrc, setFailedSrc] = useState(null);
|
|
922
|
+
useEffect2(() => {
|
|
923
|
+
setFailedSrc(null);
|
|
924
|
+
}, [src]);
|
|
925
|
+
const requested = src.trim();
|
|
926
|
+
const useFallback = requested.length === 0 || failedSrc === requested;
|
|
927
|
+
const shown = useFallback ? fallbackSrc : requested;
|
|
928
|
+
return /* @__PURE__ */ jsx6("span", { ref, className: "block size-full", children: inView ? /* @__PURE__ */ jsx6(
|
|
929
|
+
"img",
|
|
930
|
+
{
|
|
931
|
+
src: shown,
|
|
932
|
+
alt,
|
|
933
|
+
className,
|
|
934
|
+
onError: () => {
|
|
935
|
+
if (!useFallback) setFailedSrc(requested);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
) : null });
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
// src/token-select/logos.ts
|
|
942
|
+
var LOGO_HOST = "https://assets.dapdap.net";
|
|
943
|
+
var CHAIN_LOGO_ALIAS = {
|
|
944
|
+
eth: "ethereum",
|
|
945
|
+
ethereum: "ethereum",
|
|
946
|
+
base: "base",
|
|
947
|
+
arb: "arbitrum",
|
|
948
|
+
arbitrum: "arbitrum",
|
|
949
|
+
op: "optimism",
|
|
950
|
+
optimism: "optimism",
|
|
951
|
+
pol: "polygon",
|
|
952
|
+
polygon: "polygon",
|
|
953
|
+
bsc: "bsc",
|
|
954
|
+
avax: "avalanche",
|
|
955
|
+
avalanche: "avalanche",
|
|
956
|
+
gnosis: "gnosis",
|
|
957
|
+
scroll: "scroll",
|
|
958
|
+
xlayer: "xlayer",
|
|
959
|
+
bera: "berachain",
|
|
960
|
+
berachain: "berachain",
|
|
961
|
+
near: "near",
|
|
962
|
+
sol: "solana",
|
|
963
|
+
solana: "solana",
|
|
964
|
+
tron: "tron",
|
|
965
|
+
zec: "zcash",
|
|
966
|
+
zcash: "zcash"
|
|
967
|
+
};
|
|
968
|
+
var DEFAULT_TOKEN_LOGO = `${LOGO_HOST}/tokens/default_icon.png`;
|
|
969
|
+
function logoPath(path) {
|
|
970
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
971
|
+
return `${LOGO_HOST}${normalized}`;
|
|
972
|
+
}
|
|
973
|
+
function chainLogoUrl(blockchainOrNetwork) {
|
|
974
|
+
const key = String(blockchainOrNetwork || "").toLowerCase();
|
|
975
|
+
const file = CHAIN_LOGO_ALIAS[key] || key.replace(/\s+/g, "");
|
|
976
|
+
return logoPath(`/stableflow/networks/${file}.png`);
|
|
977
|
+
}
|
|
978
|
+
function tokenLogoUrl(symbol) {
|
|
979
|
+
const upper = String(symbol || "").toUpperCase();
|
|
980
|
+
const file = upper === "USDT0" ? "usdt" : upper.toLowerCase();
|
|
981
|
+
return logoPath(`/stableflow/tokens/${file}.png`);
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
// src/token-select/token-pane.tsx
|
|
985
|
+
import { Fragment, jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
913
986
|
function TokenPane(props) {
|
|
914
987
|
const {
|
|
915
988
|
sections,
|
|
@@ -926,14 +999,14 @@ function TokenPane(props) {
|
|
|
926
999
|
} = props;
|
|
927
1000
|
const visibleSections = sections.filter((section) => section.title || section.tokens.length > 0);
|
|
928
1001
|
const hasTokens = sections.some((section) => section.tokens.length > 0);
|
|
929
|
-
return /* @__PURE__ */
|
|
930
|
-
header ? /* @__PURE__ */
|
|
1002
|
+
return /* @__PURE__ */ jsx7("div", { className: "flex h-full min-h-0 flex-1 flex-col", children: /* @__PURE__ */ jsx7("div", { className: cx("min-h-0 flex-1 overflow-y-auto", thinScrollbar), children: /* @__PURE__ */ jsxs4("div", { className: "px-2.5 pt-[17px] pb-3", children: [
|
|
1003
|
+
header ? /* @__PURE__ */ jsx7(ChainListHeader, { header, showWalletStatus }) : null,
|
|
931
1004
|
visibleSections.map((section) => /* @__PURE__ */ jsxs4("section", { className: "mb-2", children: [
|
|
932
1005
|
section.title ? /* @__PURE__ */ jsxs4("div", { className: "mb-1 flex items-center justify-between gap-2 px-3.5", children: [
|
|
933
|
-
/* @__PURE__ */
|
|
934
|
-
showWalletStatus && section.walletKind ? /* @__PURE__ */
|
|
1006
|
+
/* @__PURE__ */ jsx7("p", { className: cx("min-w-0 truncate text-sm font-medium text-[#aaa]", fontSans), children: section.title }),
|
|
1007
|
+
showWalletStatus && section.walletKind ? /* @__PURE__ */ jsx7(ChainWalletStatus, { kind: section.walletKind }) : null
|
|
935
1008
|
] }) : null,
|
|
936
|
-
section.tokens.map((token) => /* @__PURE__ */
|
|
1009
|
+
section.tokens.map((token) => /* @__PURE__ */ jsx7(
|
|
937
1010
|
TokenRow,
|
|
938
1011
|
{
|
|
939
1012
|
token,
|
|
@@ -949,8 +1022,8 @@ function TokenPane(props) {
|
|
|
949
1022
|
`${section.id}-${token.assetId}`
|
|
950
1023
|
))
|
|
951
1024
|
] }, section.id)),
|
|
952
|
-
loading && !hasTokens ? /* @__PURE__ */
|
|
953
|
-
!loading && !hasTokens ? /* @__PURE__ */
|
|
1025
|
+
loading && !hasTokens ? /* @__PURE__ */ jsx7(TokenListSkeleton, {}) : null,
|
|
1026
|
+
!loading && !hasTokens ? /* @__PURE__ */ jsx7("p", { className: cx("px-3.5 py-4 text-[13px] text-[#606060]", fontSans), children: "No tokens found" }) : null
|
|
954
1027
|
] }) }) });
|
|
955
1028
|
}
|
|
956
1029
|
function ChainListHeader(props) {
|
|
@@ -964,20 +1037,20 @@ function ChainListHeader(props) {
|
|
|
964
1037
|
onClick: header.onBack,
|
|
965
1038
|
className: cx("flex min-w-0 cursor-pointer items-center gap-3 border-0 bg-transparent p-0 text-sm font-medium text-[#aaa]", fontSans),
|
|
966
1039
|
children: [
|
|
967
|
-
/* @__PURE__ */
|
|
968
|
-
/* @__PURE__ */
|
|
1040
|
+
/* @__PURE__ */ jsx7(IconChevron2, { className: "rotate-180 text-[#aaa]" }),
|
|
1041
|
+
/* @__PURE__ */ jsx7("span", { className: "truncate", children: header.title })
|
|
969
1042
|
]
|
|
970
1043
|
}
|
|
971
|
-
) : /* @__PURE__ */
|
|
972
|
-
showWalletStatus && walletKind ? /* @__PURE__ */
|
|
1044
|
+
) : /* @__PURE__ */ jsx7("p", { className: cx("min-w-0 truncate text-sm font-medium text-[#aaa]", fontSans), children: header.title }),
|
|
1045
|
+
showWalletStatus && walletKind ? /* @__PURE__ */ jsx7(ChainWalletStatus, { kind: walletKind }) : null
|
|
973
1046
|
] });
|
|
974
1047
|
}
|
|
975
1048
|
function TokenListSkeleton() {
|
|
976
|
-
return /* @__PURE__ */
|
|
977
|
-
/* @__PURE__ */
|
|
1049
|
+
return /* @__PURE__ */ jsx7("div", { "aria-hidden": true, children: Array.from({ length: 6 }, (_, index) => /* @__PURE__ */ jsxs4("div", { className: "flex h-[66px] items-center gap-2.5 px-3.5", children: [
|
|
1050
|
+
/* @__PURE__ */ jsx7(Skeleton, { className: "size-8 shrink-0 rounded-full" }),
|
|
978
1051
|
/* @__PURE__ */ jsxs4("span", { className: "flex min-w-0 flex-1 flex-col gap-1.5", children: [
|
|
979
|
-
/* @__PURE__ */
|
|
980
|
-
/* @__PURE__ */
|
|
1052
|
+
/* @__PURE__ */ jsx7(Skeleton, { className: "h-3.5 w-24" }),
|
|
1053
|
+
/* @__PURE__ */ jsx7(Skeleton, { className: "h-3 w-16" })
|
|
981
1054
|
] })
|
|
982
1055
|
] }, index)) });
|
|
983
1056
|
}
|
|
@@ -999,8 +1072,15 @@ function TokenRow(props) {
|
|
|
999
1072
|
children: [
|
|
1000
1073
|
/* @__PURE__ */ jsxs4("span", { className: "flex min-w-0 items-center gap-2.5", children: [
|
|
1001
1074
|
/* @__PURE__ */ jsxs4("span", { className: "relative size-8 shrink-0", children: [
|
|
1002
|
-
/* @__PURE__ */
|
|
1003
|
-
|
|
1075
|
+
/* @__PURE__ */ jsx7(
|
|
1076
|
+
LazyImage,
|
|
1077
|
+
{
|
|
1078
|
+
src: token.logo,
|
|
1079
|
+
fallbackSrc: DEFAULT_TOKEN_LOGO,
|
|
1080
|
+
className: "size-8 rounded-[12px] object-cover"
|
|
1081
|
+
}
|
|
1082
|
+
),
|
|
1083
|
+
/* @__PURE__ */ jsx7(
|
|
1004
1084
|
"img",
|
|
1005
1085
|
{
|
|
1006
1086
|
src: token.chain.logo,
|
|
@@ -1011,29 +1091,29 @@ function TokenRow(props) {
|
|
|
1011
1091
|
] }),
|
|
1012
1092
|
/* @__PURE__ */ jsxs4("span", { className: "min-w-0", children: [
|
|
1013
1093
|
/* @__PURE__ */ jsxs4("span", { className: "flex min-w-0 items-center gap-1.5", children: [
|
|
1014
|
-
/* @__PURE__ */
|
|
1015
|
-
recent ? /* @__PURE__ */
|
|
1094
|
+
/* @__PURE__ */ jsx7("span", { className: cx("truncate text-sm font-semibold text-black", fontSans), children: token.symbol }),
|
|
1095
|
+
recent ? /* @__PURE__ */ jsx7("span", { className: cx("shrink-0 rounded-[9px] bg-[#06f]/10 px-1.5 text-[10px] font-medium leading-[18px] text-[#06f]", fontSans), children: "Recently Used" }) : null
|
|
1016
1096
|
] }),
|
|
1017
|
-
/* @__PURE__ */
|
|
1097
|
+
/* @__PURE__ */ jsx7("span", { className: cx("mt-0.5 block truncate text-xs text-[#606060]", fontSans), children: token.chain.chainName })
|
|
1018
1098
|
] })
|
|
1019
1099
|
] }),
|
|
1020
|
-
showBalances ? /* @__PURE__ */
|
|
1100
|
+
showBalances ? /* @__PURE__ */ jsx7("span", { className: "shrink-0 text-right", children: loadingBalance ? /* @__PURE__ */ jsx7(
|
|
1021
1101
|
"span",
|
|
1022
1102
|
{
|
|
1023
1103
|
className: "inline-block size-3.5 animate-spin rounded-full border-2 border-[#606060] border-r-transparent",
|
|
1024
1104
|
"aria-label": "Loading balance"
|
|
1025
1105
|
}
|
|
1026
1106
|
) : formatted != null ? /* @__PURE__ */ jsxs4(Fragment, { children: [
|
|
1027
|
-
/* @__PURE__ */
|
|
1028
|
-
usd >= 0 ? /* @__PURE__ */
|
|
1029
|
-
] }) : /* @__PURE__ */
|
|
1107
|
+
/* @__PURE__ */ jsx7("span", { className: cx("block text-sm font-medium text-black", fontSans), children: formatDisplayAmount(formatted, { prefix: "", maxDecimals: 4 }) }),
|
|
1108
|
+
usd >= 0 ? /* @__PURE__ */ jsx7("span", { className: cx("block text-xs text-[#606060]", fontSans), children: formatDisplayAmount(usd, { prefix: "$", showDust: true }) }) : null
|
|
1109
|
+
] }) : /* @__PURE__ */ jsx7("span", { className: cx("text-sm font-medium text-black", fontSans), children: "-" }) }) : null
|
|
1030
1110
|
]
|
|
1031
1111
|
}
|
|
1032
1112
|
);
|
|
1033
1113
|
}
|
|
1034
1114
|
|
|
1035
1115
|
// src/token-select/search-results.tsx
|
|
1036
|
-
import { jsx as
|
|
1116
|
+
import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1037
1117
|
function SearchResults(props) {
|
|
1038
1118
|
const {
|
|
1039
1119
|
groups,
|
|
@@ -1048,13 +1128,13 @@ function SearchResults(props) {
|
|
|
1048
1128
|
rowClassName
|
|
1049
1129
|
} = props;
|
|
1050
1130
|
const hasTokens = groups.some((group) => group.tokens.length > 0);
|
|
1051
|
-
return /* @__PURE__ */
|
|
1131
|
+
return /* @__PURE__ */ jsx8("div", { className: "flex h-full min-h-0 flex-1 flex-col", children: /* @__PURE__ */ jsx8("div", { className: cx("min-h-0 flex-1 overflow-y-auto", thinScrollbar), children: /* @__PURE__ */ jsxs5("div", { className: "px-2.5 pt-[17px] pb-3", children: [
|
|
1052
1132
|
groups.map((group) => /* @__PURE__ */ jsxs5("section", { className: "mb-2", children: [
|
|
1053
1133
|
/* @__PURE__ */ jsxs5("div", { className: "mb-1 flex items-center justify-between gap-2 px-3.5", children: [
|
|
1054
|
-
/* @__PURE__ */
|
|
1055
|
-
showWalletStatus ? /* @__PURE__ */
|
|
1134
|
+
/* @__PURE__ */ jsx8("p", { className: cx("min-w-0 truncate text-sm font-medium text-[#aaa]", fontSans), children: group.chainName }),
|
|
1135
|
+
showWalletStatus ? /* @__PURE__ */ jsx8(ChainWalletStatus, { kind: group.chainKind }) : null
|
|
1056
1136
|
] }),
|
|
1057
|
-
group.tokens.map((token) => /* @__PURE__ */
|
|
1137
|
+
group.tokens.map((token) => /* @__PURE__ */ jsx8(
|
|
1058
1138
|
TokenRow,
|
|
1059
1139
|
{
|
|
1060
1140
|
token,
|
|
@@ -1070,7 +1150,7 @@ function SearchResults(props) {
|
|
|
1070
1150
|
token.assetId
|
|
1071
1151
|
))
|
|
1072
1152
|
] }, group.blockchain)),
|
|
1073
|
-
!loading && !hasTokens ? /* @__PURE__ */
|
|
1153
|
+
!loading && !hasTokens ? /* @__PURE__ */ jsx8("p", { className: cx("px-3.5 py-4 text-[13px] text-[#606060]", fontSans), children: "No tokens found" }) : null
|
|
1074
1154
|
] }) }) });
|
|
1075
1155
|
}
|
|
1076
1156
|
|
|
@@ -1081,7 +1161,7 @@ function ownerKey2(owners) {
|
|
|
1081
1161
|
}
|
|
1082
1162
|
|
|
1083
1163
|
// src/token-select/TokenSelectDialog.tsx
|
|
1084
|
-
import { jsx as
|
|
1164
|
+
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1085
1165
|
var SEARCH_INPUT_CLASS = "h-[36px] rounded-[18px] border-[#e3e3e3] bg-[#f6f6f6] text-sm placeholder:text-black/30";
|
|
1086
1166
|
function ownerForToken(owners, token) {
|
|
1087
1167
|
return owners[token.chain.chainKind] ?? null;
|
|
@@ -1152,20 +1232,20 @@ function TokenSelectDialog(props) {
|
|
|
1152
1232
|
[showBalances, connectedOwners, balanceOwners]
|
|
1153
1233
|
);
|
|
1154
1234
|
const walletConnected = hasAnyOwner(connectedOwners);
|
|
1155
|
-
const [search, setSearch] =
|
|
1156
|
-
const [view, setView] =
|
|
1157
|
-
const [slideDirection, setSlideDirection] =
|
|
1158
|
-
const networksScrollRef =
|
|
1159
|
-
const savedNetworksScroll =
|
|
1160
|
-
const walletConnectedRef =
|
|
1161
|
-
const payerRef =
|
|
1162
|
-
const lockRef =
|
|
1163
|
-
const tokensRef =
|
|
1235
|
+
const [search, setSearch] = useState2("");
|
|
1236
|
+
const [view, setView] = useState2(payer ? { kind: "networks" } : { kind: "all" });
|
|
1237
|
+
const [slideDirection, setSlideDirection] = useState2(1);
|
|
1238
|
+
const networksScrollRef = useRef2(null);
|
|
1239
|
+
const savedNetworksScroll = useRef2(0);
|
|
1240
|
+
const walletConnectedRef = useRef2(walletConnected);
|
|
1241
|
+
const payerRef = useRef2(payer);
|
|
1242
|
+
const lockRef = useRef2(lockChainKind);
|
|
1243
|
+
const tokensRef = useRef2(tokens);
|
|
1164
1244
|
walletConnectedRef.current = walletConnected;
|
|
1165
1245
|
payerRef.current = payer;
|
|
1166
1246
|
lockRef.current = lockChainKind;
|
|
1167
1247
|
tokensRef.current = tokens;
|
|
1168
|
-
|
|
1248
|
+
useEffect3(() => {
|
|
1169
1249
|
if (!open) return;
|
|
1170
1250
|
setSearch("");
|
|
1171
1251
|
const lock = lockRef.current;
|
|
@@ -1187,7 +1267,7 @@ function TokenSelectDialog(props) {
|
|
|
1187
1267
|
}
|
|
1188
1268
|
setView(walletConnectedRef.current ? { kind: "wallet" } : { kind: "networks" });
|
|
1189
1269
|
}, [open]);
|
|
1190
|
-
|
|
1270
|
+
useEffect3(() => {
|
|
1191
1271
|
if (!open || !lockChainKind) return;
|
|
1192
1272
|
const filter = initialChainFilter(lockChainKind, getTokenSelectPrefs().recentBlockchains, chainsFromTokens(tokens));
|
|
1193
1273
|
if (filter === ALL_CHAIN_FILTER) return;
|
|
@@ -1208,11 +1288,11 @@ function TokenSelectDialog(props) {
|
|
|
1208
1288
|
}, [tokens, allowed, excludeNative, payer]);
|
|
1209
1289
|
const ownersKey = ownerKey2(owners);
|
|
1210
1290
|
const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join("|"), [scopedTokens]);
|
|
1211
|
-
const ownersRef =
|
|
1212
|
-
const scopedRef =
|
|
1291
|
+
const ownersRef = useRef2(owners);
|
|
1292
|
+
const scopedRef = useRef2(scopedTokens);
|
|
1213
1293
|
ownersRef.current = owners;
|
|
1214
1294
|
scopedRef.current = scopedTokens;
|
|
1215
|
-
|
|
1295
|
+
useEffect3(() => {
|
|
1216
1296
|
if (balanceMode !== "async" || !showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;
|
|
1217
1297
|
void ensurePayTokenBalances(ownersRef.current, scopedRef.current);
|
|
1218
1298
|
const id = window.setInterval(() => {
|
|
@@ -1234,9 +1314,11 @@ function TokenSelectDialog(props) {
|
|
|
1234
1314
|
if (!showBalances) return false;
|
|
1235
1315
|
const owner = ownerForToken(owners, token);
|
|
1236
1316
|
if (!owner) return false;
|
|
1317
|
+
const formatted = balanceOf(token);
|
|
1318
|
+
if (formatted != null && formatted !== "") return false;
|
|
1237
1319
|
if (balanceMode === "sync") return syncIsBalanceLoading?.(token, owner) ?? false;
|
|
1238
1320
|
const entry = getPayTokenBalance(owner, token.assetId);
|
|
1239
|
-
return
|
|
1321
|
+
return !entry || entry.status === "loading";
|
|
1240
1322
|
}
|
|
1241
1323
|
const availableChains = useMemo(() => chainsFromTokens(scopedTokens), [scopedTokens]);
|
|
1242
1324
|
const fundedBlockchains = useMemo(() => {
|
|
@@ -1258,7 +1340,7 @@ function TokenSelectDialog(props) {
|
|
|
1258
1340
|
});
|
|
1259
1341
|
}, [payer, availableChains, owners, fundedBlockchains, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance]);
|
|
1260
1342
|
const networkChains = useMemo(() => sortChainsAlpha(availableChains), [availableChains]);
|
|
1261
|
-
|
|
1343
|
+
useEffect3(() => {
|
|
1262
1344
|
if (!open || !payer || lockChainKind) return;
|
|
1263
1345
|
setView((current) => {
|
|
1264
1346
|
if (current.kind === "wallet" && !walletConnected) return { kind: "networks" };
|
|
@@ -1389,7 +1471,7 @@ function TokenSelectDialog(props) {
|
|
|
1389
1471
|
const awaitingBalances = showBalances && sections.every((section) => section.tokens.length === 0) && scopedTokens.some((token) => loadingOf(token));
|
|
1390
1472
|
const tokenDisabled = (token) => isBlockchainDisabled(token.blockchain, disabledBlockchains) || isChainKindLocked(token.chain.chainKind, lockChainKind);
|
|
1391
1473
|
const sliding = view.kind === "networks" || view.kind === "network-chain";
|
|
1392
|
-
const tokenPane = /* @__PURE__ */
|
|
1474
|
+
const tokenPane = /* @__PURE__ */ jsx9(
|
|
1393
1475
|
TokenPane,
|
|
1394
1476
|
{
|
|
1395
1477
|
sections,
|
|
@@ -1405,7 +1487,7 @@ function TokenSelectDialog(props) {
|
|
|
1405
1487
|
rowClassName
|
|
1406
1488
|
}
|
|
1407
1489
|
);
|
|
1408
|
-
return /* @__PURE__ */
|
|
1490
|
+
return /* @__PURE__ */ jsx9(
|
|
1409
1491
|
Dialog,
|
|
1410
1492
|
{
|
|
1411
1493
|
open,
|
|
@@ -1419,7 +1501,7 @@ function TokenSelectDialog(props) {
|
|
|
1419
1501
|
headerClassName: cx("h-14 border-b border-[#e3e3e3] px-[22px] pr-4", headerClassName),
|
|
1420
1502
|
closeClassName: cx("md:ml-0", closeClassName),
|
|
1421
1503
|
contentClassName: cx("overflow-hidden", contentClassName),
|
|
1422
|
-
headerAction: /* @__PURE__ */
|
|
1504
|
+
headerAction: /* @__PURE__ */ jsx9(
|
|
1423
1505
|
SearchInput,
|
|
1424
1506
|
{
|
|
1425
1507
|
value: search,
|
|
@@ -1434,7 +1516,7 @@ function TokenSelectDialog(props) {
|
|
|
1434
1516
|
className
|
|
1435
1517
|
),
|
|
1436
1518
|
children: /* @__PURE__ */ jsxs6("div", { className: "flex h-[min(520px,62vh)] min-h-0 flex-col overflow-hidden md:h-[min(555px,70vh)]", children: [
|
|
1437
|
-
/* @__PURE__ */
|
|
1519
|
+
/* @__PURE__ */ jsx9(
|
|
1438
1520
|
SearchInput,
|
|
1439
1521
|
{
|
|
1440
1522
|
value: search,
|
|
@@ -1445,7 +1527,7 @@ function TokenSelectDialog(props) {
|
|
|
1445
1527
|
}
|
|
1446
1528
|
),
|
|
1447
1529
|
/* @__PURE__ */ jsxs6("div", { className: "flex min-h-0 flex-1", children: [
|
|
1448
|
-
/* @__PURE__ */
|
|
1530
|
+
/* @__PURE__ */ jsx9(
|
|
1449
1531
|
NetworkRail,
|
|
1450
1532
|
{
|
|
1451
1533
|
role: payer ? "payer" : "receiver",
|
|
@@ -1463,7 +1545,7 @@ function TokenSelectDialog(props) {
|
|
|
1463
1545
|
className: railClassName
|
|
1464
1546
|
}
|
|
1465
1547
|
),
|
|
1466
|
-
searching ? /* @__PURE__ */
|
|
1548
|
+
searching ? /* @__PURE__ */ jsx9(
|
|
1467
1549
|
SearchResults,
|
|
1468
1550
|
{
|
|
1469
1551
|
groups: searchGroups,
|
|
@@ -1477,12 +1559,12 @@ function TokenSelectDialog(props) {
|
|
|
1477
1559
|
isTokenDisabled: tokenDisabled,
|
|
1478
1560
|
rowClassName
|
|
1479
1561
|
}
|
|
1480
|
-
) : sliding ? /* @__PURE__ */
|
|
1562
|
+
) : sliding ? /* @__PURE__ */ jsx9(
|
|
1481
1563
|
PaneTransition,
|
|
1482
1564
|
{
|
|
1483
1565
|
paneKey: view.kind === "network-chain" ? `network-chain:${view.blockchain}` : "networks",
|
|
1484
1566
|
direction: slideDirection,
|
|
1485
|
-
children: view.kind === "networks" ? /* @__PURE__ */
|
|
1567
|
+
children: view.kind === "networks" ? /* @__PURE__ */ jsx9(
|
|
1486
1568
|
ChainPane,
|
|
1487
1569
|
{
|
|
1488
1570
|
chains: networkChains,
|
|
@@ -1495,55 +1577,13 @@ function TokenSelectDialog(props) {
|
|
|
1495
1577
|
}
|
|
1496
1578
|
) : tokenPane
|
|
1497
1579
|
}
|
|
1498
|
-
) : /* @__PURE__ */
|
|
1580
|
+
) : /* @__PURE__ */ jsx9("div", { className: "relative min-h-0 flex-1", children: tokenPane })
|
|
1499
1581
|
] })
|
|
1500
1582
|
] })
|
|
1501
1583
|
}
|
|
1502
1584
|
);
|
|
1503
1585
|
}
|
|
1504
1586
|
|
|
1505
|
-
// src/token-select/logos.ts
|
|
1506
|
-
var LOGO_HOST = "https://assets.dapdap.net";
|
|
1507
|
-
var CHAIN_LOGO_ALIAS = {
|
|
1508
|
-
eth: "ethereum",
|
|
1509
|
-
ethereum: "ethereum",
|
|
1510
|
-
base: "base",
|
|
1511
|
-
arb: "arbitrum",
|
|
1512
|
-
arbitrum: "arbitrum",
|
|
1513
|
-
op: "optimism",
|
|
1514
|
-
optimism: "optimism",
|
|
1515
|
-
pol: "polygon",
|
|
1516
|
-
polygon: "polygon",
|
|
1517
|
-
bsc: "bsc",
|
|
1518
|
-
avax: "avalanche",
|
|
1519
|
-
avalanche: "avalanche",
|
|
1520
|
-
gnosis: "gnosis",
|
|
1521
|
-
scroll: "scroll",
|
|
1522
|
-
xlayer: "xlayer",
|
|
1523
|
-
bera: "berachain",
|
|
1524
|
-
berachain: "berachain",
|
|
1525
|
-
near: "near",
|
|
1526
|
-
sol: "solana",
|
|
1527
|
-
solana: "solana",
|
|
1528
|
-
tron: "tron",
|
|
1529
|
-
zec: "zcash",
|
|
1530
|
-
zcash: "zcash"
|
|
1531
|
-
};
|
|
1532
|
-
function logoPath(path) {
|
|
1533
|
-
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
1534
|
-
return `${LOGO_HOST}${normalized}`;
|
|
1535
|
-
}
|
|
1536
|
-
function chainLogoUrl(blockchainOrNetwork) {
|
|
1537
|
-
const key = String(blockchainOrNetwork || "").toLowerCase();
|
|
1538
|
-
const file = CHAIN_LOGO_ALIAS[key] || key.replace(/\s+/g, "");
|
|
1539
|
-
return logoPath(`/stableflow/networks/${file}.png`);
|
|
1540
|
-
}
|
|
1541
|
-
function tokenLogoUrl(symbol) {
|
|
1542
|
-
const upper = String(symbol || "").toUpperCase();
|
|
1543
|
-
const file = upper === "USDT0" ? "usdt" : upper.toLowerCase();
|
|
1544
|
-
return logoPath(`/stableflow/tokens/${file}.png`);
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
1587
|
// src/token-select/pay-config.ts
|
|
1548
1588
|
var ZERO_ADDRESS2 = "0x0000000000000000000000000000000000000000";
|
|
1549
1589
|
var WRAP_NEAR_CONTRACT = "wrap.near";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/token-select/context.tsx","../../src/token-select/balances.ts","../../src/token-select/config.ts","../../src/token-select/TokenSelectDialog.tsx","../../src/token-select/chain-pane.tsx","../../src/token-select/chain-wallet-status.tsx","../../src/token-select/format.ts","../../src/token-select/utils.ts","../../src/token-select/network-rail.tsx","../../src/token-select/pane-transition.tsx","../../src/token-select/prefs.ts","../../src/token-select/token-pane.tsx","../../src/token-select/search-results.tsx","../../src/token-select/types.ts","../../src/token-select/logos.ts","../../src/token-select/pay-config.ts"],"sourcesContent":["import { useEffect, type ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { clearPayTokenBalances, configureBalanceReaders, setBalanceTokens } from \"./balances\";\nimport { DEFAULT_STABLE_SYMBOLS } from \"./config\";\nimport type { PayToken, PayWallet, PopularTokenRef, ReadBalances } from \"./types\";\n\nexport type PayBalanceMode = \"async\" | \"sync\" | \"none\";\n\ntype PayWidgetsContextValue = {\n tokens: PayToken[];\n loading: boolean;\n wallet: PayWallet;\n popularTokens: PopularTokenRef[];\n stableSymbols: string[];\n chainKindLabels: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n balanceMode: PayBalanceMode;\n getBalance: ((token: PayToken, owner: string) => string | null | undefined) | null;\n isBalanceLoading: ((token: PayToken, owner: string) => boolean) | null;\n};\n\nconst PayWidgetsContext = createContext<PayWidgetsContextValue | null>(null);\n\nexport type PayWidgetsProviderProps = {\n tokens: PayToken[];\n loading?: boolean;\n wallet: PayWallet;\n readBalances?: ReadBalances;\n getBalance?: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading?: (token: PayToken, owner: string) => boolean;\n popularTokens?: PopularTokenRef[];\n stableSymbols?: string[];\n chainKindLabels?: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n children: ReactNode;\n};\n\nfunction isProduction() {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n return env === \"production\";\n}\n\nfunction warnBalanceMode(readBalances: ReadBalances | undefined, getBalance: PayWidgetsProviderProps[\"getBalance\"]) {\n if (isProduction()) return;\n if (readBalances && getBalance) {\n console.warn(\"PayWidgetsProvider: both readBalances and getBalance were passed; using readBalances.\");\n return;\n }\n if (!readBalances && !getBalance) {\n console.warn(\"PayWidgetsProvider: pass readBalances or getBalance so token balances can load.\");\n }\n}\n\nexport function PayWidgetsProvider(props: PayWidgetsProviderProps) {\n const {\n tokens,\n loading = false,\n popularTokens = [],\n wallet,\n readBalances,\n getBalance,\n isBalanceLoading,\n onCopyAddress,\n stableSymbols = [...DEFAULT_STABLE_SYMBOLS],\n chainKindLabels = {},\n children,\n } = props;\n\n useEffect(() => {\n warnBalanceMode(readBalances, getBalance);\n configureBalanceReaders({\n readBalances: readBalances ?? null,\n getBalance: getBalance ?? null,\n isBalanceLoading: isBalanceLoading ?? null,\n });\n return () => configureBalanceReaders({});\n }, [readBalances, getBalance, isBalanceLoading]);\n\n useEffect(() => {\n setBalanceTokens(tokens);\n }, [tokens]);\n\n const connected = Object.values(wallet.accounts).some((account) => Boolean(account?.address?.trim()));\n useEffect(() => {\n if (!connected) clearPayTokenBalances();\n }, [connected]);\n\n const balanceMode: PayBalanceMode = readBalances ? \"async\" : getBalance ? \"sync\" : \"none\";\n const value: PayWidgetsContextValue = {\n tokens,\n loading,\n wallet,\n popularTokens,\n stableSymbols,\n chainKindLabels,\n onCopyAddress,\n balanceMode,\n getBalance: balanceMode === \"sync\" ? getBalance ?? null : null,\n isBalanceLoading: balanceMode === \"sync\" ? isBalanceLoading ?? null : null,\n };\n\n return <PayWidgetsContext.Provider value={value}>{children}</PayWidgetsContext.Provider>;\n}\n\nexport function usePayWidgets(): PayWidgetsContextValue {\n const value = useContext(PayWidgetsContext);\n if (!value) {\n throw new Error(\"Token select must be rendered inside PayWidgetsProvider\");\n }\n return value;\n}\n","import { useSyncExternalStore } from \"react\";\nimport { TOKEN_BALANCE_POLL_MS } from \"./config\";\nimport type { BalanceReadResult, ChainKind, ChainOwners, PayToken, ReadBalances, TokenBalanceStatus } from \"./types\";\n\nexport type TokenBalance = {\n raw: string | null;\n formatted: string | null;\n status: TokenBalanceStatus;\n error: string | null;\n updatedAt: number | null;\n};\n\ntype SyncBalanceReader = {\n getBalance: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading: (token: PayToken, owner: string) => boolean;\n};\n\nconst listeners = new Set<() => void>();\nlet balances: Record<string, TokenBalance> = {};\nlet reader: ReadBalances | null = null;\nlet syncReader: SyncBalanceReader | null = null;\nlet tokensById = new Map<string, PayToken>();\nconst chainInflight = new Map<string, Promise<void>>();\n\nexport function configureBalanceReaders(options: {\n readBalances?: ReadBalances | null;\n getBalance?: SyncBalanceReader[\"getBalance\"] | null;\n isBalanceLoading?: SyncBalanceReader[\"isBalanceLoading\"] | null;\n}) {\n reader = options.readBalances ?? null;\n if (!options.readBalances && options.getBalance) {\n syncReader = {\n getBalance: options.getBalance,\n isBalanceLoading: options.isBalanceLoading ?? (() => false),\n };\n return;\n }\n syncReader = null;\n}\n\nexport function setBalanceTokens(tokens: readonly PayToken[]) {\n tokensById = new Map(tokens.map((token) => [token.assetId, token]));\n}\n\nexport function payBalanceMode(): \"async\" | \"sync\" | \"none\" {\n if (reader) return \"async\";\n if (syncReader) return \"sync\";\n return \"none\";\n}\n\nfunction emit() {\n balances = { ...balances };\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function subscribePayTokenBalances(listener: () => void) {\n return subscribe(listener);\n}\n\nexport function getPayTokenBalances() {\n return balances;\n}\n\nfunction ownerKey(owner: string, chainKind: ChainKind): string {\n return chainKind === \"solana\" || chainKind === \"zec\" ? owner : owner.toLowerCase();\n}\n\nfunction balanceKey(owner: string, assetId: string, chainKind: ChainKind): string {\n return `${ownerKey(owner, chainKind)}:${assetId}`;\n}\n\nfunction isFresh(entry: TokenBalance | undefined, now: number): boolean {\n return Boolean(\n entry\n && entry.status === \"success\"\n && entry.updatedAt != null\n && now - entry.updatedAt < TOKEN_BALANCE_POLL_MS,\n );\n}\n\nfunction loadingEntry(prev: TokenBalance | undefined): TokenBalance {\n if (!prev) return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n return { ...prev, status: \"loading\", error: null };\n}\n\nfunction withStaleOnError(prev: TokenBalance | undefined, next: TokenBalance): TokenBalance {\n if (next.status !== \"error\") return next;\n if (prev?.raw == null && prev?.formatted == null) return next;\n return { ...next, raw: prev.raw, formatted: prev.formatted, updatedAt: prev.updatedAt };\n}\n\nexport function setBalanceReader(next: ReadBalances | null) {\n reader = next;\n if (next) syncReader = null;\n}\n\nexport function clearPayTokenBalances() {\n balances = {};\n emit();\n}\n\nfunction syncBalance(owner: string, assetId: string): TokenBalance | undefined {\n if (!syncReader) return undefined;\n const token = tokensById.get(assetId);\n if (!token) return undefined;\n const loading = syncReader.isBalanceLoading(token, owner);\n const formatted = syncReader.getBalance(token, owner);\n if (loading && (formatted == null || formatted === \"\")) {\n return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n }\n if (formatted == null || formatted === \"\") return undefined;\n return { raw: null, formatted, status: \"success\", error: null, updatedAt: null };\n}\n\nexport function getPayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n if (!owner || !assetId) return undefined;\n if (syncReader) return syncBalance(owner, assetId);\n return balances[`${owner}:${assetId}`] ?? balances[`${owner.toLowerCase()}:${assetId}`];\n}\n\nexport function usePayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n const current = useSyncExternalStore(subscribe, getPayTokenBalances, getPayTokenBalances);\n if (!owner || !assetId) return undefined;\n return current[`${owner}:${assetId}`] ?? current[`${owner.toLowerCase()}:${assetId}`];\n}\n\nfunction writeResult(owner: string, token: PayToken, result: BalanceReadResult) {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n const prev = balances[key];\n const next: TokenBalance = \"error\" in result\n ? { raw: null, formatted: null, status: \"error\", error: result.error, updatedAt: Date.now() }\n : { raw: result.raw ?? null, formatted: result.formatted, status: \"success\", error: null, updatedAt: Date.now() };\n balances[key] = withStaleOnError(prev, next);\n}\n\nexport async function refreshPayTokenBalance(owner: string, token: PayToken): Promise<TokenBalance | null> {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n balances[key] = loadingEntry(balances[key]);\n emit();\n if (!reader) {\n balances[key] = withStaleOnError(balances[key], {\n raw: null,\n formatted: null,\n status: \"error\",\n error: \"Balance reader is not configured\",\n updatedAt: Date.now(),\n });\n emit();\n return balances[key] ?? null;\n }\n try {\n const results = await reader({\n owner,\n chainKind: token.chain.chainKind,\n blockchain: token.blockchain,\n tokens: [token],\n });\n const result = results.find((item) => item.assetId === token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n };\n writeResult(owner, token, result);\n } catch (cause) {\n writeResult(owner, token, {\n assetId: token.assetId,\n error: cause instanceof Error ? cause.message : \"Failed to read balance\",\n });\n }\n emit();\n return balances[key] ?? null;\n}\n\nfunction groupByChain(tokens: PayToken[]): Map<string, PayToken[]> {\n const groups = new Map<string, PayToken[]>();\n for (const token of tokens) {\n const list = groups.get(token.blockchain) ?? [];\n list.push(token);\n groups.set(token.blockchain, list);\n }\n return groups;\n}\n\nasync function fetchChain(owner: string, tokens: PayToken[], force: boolean) {\n const blockchain = tokens[0]?.blockchain;\n const kind = tokens[0]?.chain.chainKind;\n if (!blockchain || !kind) return;\n const now = Date.now();\n const stale = tokens.filter((token) => force || !isFresh(balances[balanceKey(owner, token.assetId, kind)], now));\n if (stale.length === 0) return;\n\n const flightKey = `${ownerKey(owner, kind)}:${blockchain}`;\n const pending = chainInflight.get(flightKey);\n if (pending) return pending;\n\n for (const token of stale) {\n const key = balanceKey(owner, token.assetId, kind);\n balances[key] = loadingEntry(balances[key]);\n }\n emit();\n\n const run = (async () => {\n if (!reader) {\n for (const token of stale) {\n writeResult(owner, token, { assetId: token.assetId, error: \"Balance reader is not configured\" });\n }\n emit();\n return;\n }\n try {\n const results = await reader({ owner, chainKind: kind, blockchain, tokens: stale });\n const byId = new Map(results.map((item) => [item.assetId, item]));\n for (const token of stale) {\n writeResult(owner, token, byId.get(token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n });\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"Failed to read balance\";\n for (const token of stale) writeResult(owner, token, { assetId: token.assetId, error: message });\n }\n emit();\n })();\n\n chainInflight.set(flightKey, run);\n return run.finally(() => {\n if (chainInflight.get(flightKey) === run) chainInflight.delete(flightKey);\n });\n}\n\nexport async function ensurePayTokenBalances(\n owners: ChainOwners,\n tokens: PayToken[],\n opts?: { force?: boolean },\n) {\n if (syncReader || !reader) return;\n const force = Boolean(opts?.force);\n const groups = groupByChain(tokens);\n await Promise.all(Array.from(groups.values()).map((group) => {\n const kind = group[0]?.chain.chainKind;\n const owner = kind ? owners[kind] : undefined;\n if (!owner) return Promise.resolve();\n return fetchChain(owner, group, force);\n }));\n}\n","export const TOKEN_BALANCE_POLL_MS = 60_000;\nexport const ALL_CHAIN_FILTER = \"all\";\nexport const DEFAULT_STABLE_SYMBOLS = [\"USDT\", \"USDC\"] as const;\nexport const 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\nexport const CHAIN_KIND_LABELS: Record<string, string> = {\n evm: \"EVM\",\n near: \"Near\",\n solana: \"Solana\",\n tron: \"Tron\",\n zec: \"Zcash\",\n};\n\n/** Built-in network code to wallet kind. Callers can override unknown codes. */\nexport const DEFAULT_CHAIN_KINDS = {\n eth: \"evm\",\n base: \"evm\",\n arb: \"evm\",\n op: \"evm\",\n pol: \"evm\",\n bsc: \"evm\",\n avax: \"evm\",\n gnosis: \"evm\",\n scroll: \"evm\",\n xlayer: \"evm\",\n bera: \"evm\",\n near: \"near\",\n sol: \"solana\",\n tron: \"tron\",\n zec: \"zec\",\n} as const;\n","import { useEffect, useLayoutEffect, 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 { ChainPane } from \"./chain-pane\";\nimport { cx, fontSans } from \"./format\";\nimport { NetworkRail, type RailSelection } from \"./network-rail\";\nimport { PaneTransition } from \"./pane-transition\";\nimport { getTokenSelectPrefs, setLastBlockchain, setLastToken, useTokenSelectPrefs } from \"./prefs\";\nimport { SearchResults } from \"./search-results\";\nimport { TokenPane, type TokenListSection, type TokenPaneHeader } from \"./token-pane\";\nimport { ownerKey, type ChainKind, type ChainOwners, type PayChain, type PayToken, type TokenSelectRole } from \"./types\";\nimport {\n chainHasBalance,\n chainsFromTokens,\n groupSearchResults,\n initialChainFilter,\n isBlockchainDisabled,\n isChainKindLocked,\n payerRailChains,\n popularTokensForWallets,\n positiveBalanceTokens,\n recentTokensInOrder,\n sortChainsAlpha,\n sortChainsForSidebar,\n sortTokensForChain,\n compareTokensByPriority,\n tokenBalanceUsd,\n} from \"./utils\";\n\nexport type TokenSelectSelection = {\n token: PayToken;\n};\n\nexport type PaneView =\n | { kind: \"wallet\" }\n | { kind: \"all\" }\n | { kind: \"rail-chain\"; blockchain: string }\n | { kind: \"networks\" }\n | { kind: \"network-chain\"; blockchain: string };\n\nexport type TokenSelectDialogProps = {\n open: boolean;\n onClose: () => void;\n onSelect: (selection: TokenSelectSelection) => void;\n role?: TokenSelectRole;\n title?: string;\n selectedAssetId?: string | null;\n balanceOwners?: ChainOwners;\n allowedBlockchains?: string[] | null;\n lockChainKind?: ChainKind | null;\n excludeNative?: boolean;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n className?: string;\n titleClassName?: string;\n headerClassName?: string;\n closeClassName?: string;\n contentClassName?: string;\n searchClassName?: string;\n 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 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\nfunction railSelection(view: PaneView): RailSelection {\n if (view.kind === \"wallet\") return { kind: \"wallet\" };\n if (view.kind === \"all\") return { kind: \"all\" };\n if (view.kind === \"rail-chain\") return { kind: \"chain\", blockchain: view.blockchain };\n return { kind: \"networks\" };\n}\n\nfunction chainByCode(chains: readonly PayChain[], blockchain: string): PayChain | undefined {\n return chains.find((chain) => chain.blockchain === blockchain);\n}\n\nexport function TokenSelectDialog(props: TokenSelectDialogProps) {\n const {\n open,\n onClose,\n onSelect,\n role = \"payer\",\n title = \"Select Token\",\n selectedAssetId,\n balanceOwners,\n allowedBlockchains = null,\n lockChainKind = null,\n excludeNative = false,\n disabledBlockchains = null,\n disabledReason,\n className,\n titleClassName,\n headerClassName,\n closeClassName,\n contentClassName,\n searchClassName,\n railClassName,\n rowClassName,\n } = props;\n const payer = role === \"payer\";\n const showBalances = payer;\n const {\n wallet,\n popularTokens: popularRefs,\n tokens,\n loading,\n stableSymbols,\n balanceMode,\n getBalance: syncGetBalance,\n isBalanceLoading: syncIsBalanceLoading,\n } = usePayWidgets();\n const prefs = useTokenSelectPrefs();\n const balanceEntries = useSyncExternalStore(subscribePayTokenBalances, getPayTokenBalances, getPayTokenBalances);\n const connectedOwners = useMemo(() => {\n const owners: ChainOwners = {};\n for (const [kind, account] of Object.entries(wallet.accounts)) {\n const address = account?.address?.trim();\n if (address) owners[kind] = address;\n }\n return owners;\n }, [wallet.accounts]);\n const owners = useMemo(\n () => (showBalances ? { ...connectedOwners, ...balanceOwners } : {}),\n [showBalances, connectedOwners, balanceOwners],\n );\n const walletConnected = hasAnyOwner(connectedOwners);\n const [search, setSearch] = useState(\"\");\n const [view, setView] = useState<PaneView>(payer ? { kind: \"networks\" } : { kind: \"all\" });\n const [slideDirection, setSlideDirection] = useState<1 | -1>(1);\n const networksScrollRef = useRef<HTMLDivElement>(null);\n const savedNetworksScroll = useRef(0);\n const walletConnectedRef = useRef(walletConnected);\n const payerRef = useRef(payer);\n const lockRef = useRef(lockChainKind);\n const tokensRef = useRef(tokens);\n walletConnectedRef.current = walletConnected;\n payerRef.current = payer;\n lockRef.current = lockChainKind;\n tokensRef.current = tokens;\n\n useEffect(() => {\n if (!open) return;\n setSearch(\"\");\n const lock = lockRef.current;\n if (lock) {\n const filter = initialChainFilter(\n lock,\n getTokenSelectPrefs().recentBlockchains,\n chainsFromTokens(tokensRef.current),\n );\n if (filter !== ALL_CHAIN_FILTER) {\n setView({ kind: \"rail-chain\", blockchain: filter });\n return;\n }\n return;\n }\n if (!payerRef.current) {\n setView({ kind: \"all\" });\n return;\n }\n setView(walletConnectedRef.current ? { kind: \"wallet\" } : { kind: \"networks\" });\n }, [open]);\n\n useEffect(() => {\n if (!open || !lockChainKind) return;\n const filter = initialChainFilter(lockChainKind, getTokenSelectPrefs().recentBlockchains, chainsFromTokens(tokens));\n if (filter === ALL_CHAIN_FILTER) return;\n setView((current) => (current.kind === \"rail-chain\" ? current : { kind: \"rail-chain\", blockchain: filter }));\n }, [open, lockChainKind, tokens]);\n\n const allowed = useMemo(() => {\n if (!allowedBlockchains || allowedBlockchains.length === 0) return null;\n return new Set(allowedBlockchains.map((code) => code.toLowerCase()));\n }, [allowedBlockchains]);\n\n const scopedTokens = useMemo(() => {\n return tokens.filter((token) => {\n if (allowed && !allowed.has(token.blockchain.toLowerCase())) return false;\n if (excludeNative && isNativeToken(token)) return false;\n if (payer && !token.supportPayment) return false;\n if (!payer && !token.supportReceive) return false;\n return true;\n });\n }, [tokens, allowed, excludeNative, payer]);\n\n const ownersKey = ownerKey(owners);\n const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join(\"|\"), [scopedTokens]);\n const ownersRef = useRef(owners);\n const scopedRef = useRef(scopedTokens);\n ownersRef.current = owners;\n scopedRef.current = scopedTokens;\n\n useEffect(() => {\n if (balanceMode !== \"async\" || !showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current);\n const id = window.setInterval(() => {\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current, { force: true });\n }, TOKEN_BALANCE_POLL_MS);\n return () => window.clearInterval(id);\n }, [balanceMode, showBalances, open, ownersKey, tokenKey]);\n\n function balanceOf(token: PayToken) {\n const owner = ownerForToken(owners, token);\n if (!showBalances || !owner) return undefined;\n if (balanceMode === \"sync\" && syncGetBalance) return syncGetBalance(token, owner) ?? undefined;\n return getPayTokenBalance(owner, token.assetId)?.formatted;\n }\n\n function usdOf(token: PayToken) {\n if (!showBalances) return -1;\n return tokenBalanceUsd(token, balanceOf(token));\n }\n\n function loadingOf(token: PayToken) {\n if (!showBalances) return false;\n const owner = ownerForToken(owners, token);\n if (!owner) return false;\n if (balanceMode === \"sync\") return syncIsBalanceLoading?.(token, owner) ?? false;\n const entry = getPayTokenBalance(owner, token.assetId);\n return entry?.formatted == null && (!entry || entry.status === \"loading\");\n }\n\n const availableChains = useMemo(() => chainsFromTokens(scopedTokens), [scopedTokens]);\n\n const fundedBlockchains = useMemo(() => {\n const funded = new Set<string>();\n if (!showBalances) return funded;\n for (const chain of availableChains) {\n if (chainHasBalance(chain.blockchain, scopedTokens, (token) => balanceOf(token))) {\n funded.add(chain.blockchain);\n }\n }\n return funded;\n }, [availableChains, owners, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const railChains = useMemo(() => {\n if (!payer) return sortChainsAlpha(availableChains);\n const connected = payerRailChains(availableChains, owners, fundedBlockchains);\n return sortChainsForSidebar(connected, scopedTokens, {\n showBalances,\n getBalanceUsd: (token) => tokenBalanceUsd(token, balanceOf(token)),\n });\n }, [payer, availableChains, owners, fundedBlockchains, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance]);\n\n const networkChains = useMemo(() => sortChainsAlpha(availableChains), [availableChains]);\n\n useEffect(() => {\n if (!open || !payer || lockChainKind) return;\n setView((current) => {\n if (current.kind === \"wallet\" && !walletConnected) return { kind: \"networks\" };\n if (current.kind === \"rail-chain\" && !railChains.some((chain) => chain.blockchain === current.blockchain)) {\n return walletConnected ? { kind: \"wallet\" } : { kind: \"networks\" };\n }\n return current;\n });\n }, [open, payer, lockChainKind, walletConnected, railChains]);\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 searching = search.trim().length > 0;\n\n const sections = useMemo((): TokenListSection[] => {\n if (view.kind === \"wallet\") {\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 if (view.kind === \"all\") {\n const next: TokenListSection[] = [];\n if (popularTokens.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popularTokens });\n }\n const sorted = scopedTokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n next.push({ id: \"all\", tokens: sorted });\n return next;\n }\n\n if (view.kind === \"rail-chain\" || view.kind === \"network-chain\") {\n const matched = scopedTokens.filter((token) => token.blockchain === view.blockchain);\n if (!payer) {\n const next: TokenListSection[] = [];\n const popular = popularTokens.filter((token) => token.blockchain === view.blockchain);\n if (popular.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popular });\n }\n next.push({\n id: view.blockchain,\n tokens: matched.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols)),\n });\n return next;\n }\n const chain = chainByCode(availableChains, view.blockchain);\n return [{\n id: view.blockchain,\n tokens: sortTokensForChain(matched, {\n withBalances: Boolean(chain && owners[chain.chainKind]),\n usdOf,\n loadingOf,\n stableSymbols,\n }),\n badgeAssetId: newestAssetId,\n }];\n }\n\n return [];\n }, [\n view,\n payer,\n scopedTokens,\n prefs.recentAssetIds,\n newestAssetId,\n balanceEntries,\n owners,\n popularTokens,\n availableChains,\n stableSymbols,\n balanceMode,\n syncGetBalance,\n syncIsBalanceLoading,\n ]);\n\n const searchGroups = useMemo(() => {\n if (!searching) return [];\n return groupSearchResults(scopedTokens, search, {\n role: payer ? \"payer\" : \"receiver\",\n usdOf,\n loadingOf,\n hasOwner: (kind) => Boolean(owners[kind]),\n stableSymbols,\n });\n }, [searching, scopedTokens, search, payer, owners, stableSymbols, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n function handleSelectChain(blockchain: string, fromNetworks: boolean) {\n setLastBlockchain(blockchain);\n if (fromNetworks) {\n savedNetworksScroll.current = networksScrollRef.current?.scrollTop ?? 0;\n setSlideDirection(1);\n setView({ kind: \"network-chain\", blockchain });\n return;\n }\n setView({ kind: \"rail-chain\", blockchain });\n }\n\n function handleBackToNetworks() {\n setSlideDirection(-1);\n setView({ kind: \"networks\" });\n }\n\n useLayoutEffect(() => {\n if (view.kind !== \"networks\" || slideDirection !== -1) return;\n const node = networksScrollRef.current;\n if (!node) return;\n node.scrollTop = savedNetworksScroll.current;\n }, [view, slideDirection]);\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 activeChain = view.kind === \"rail-chain\" || view.kind === \"network-chain\"\n ? chainByCode(availableChains, view.blockchain)\n : undefined;\n const chainHeader: TokenPaneHeader | null = view.kind === \"network-chain\"\n ? { kind: \"back\", title: activeChain?.chainName ?? view.blockchain, onBack: handleBackToNetworks, walletKind: activeChain?.chainKind }\n : view.kind === \"rail-chain\"\n ? { kind: \"chain\", title: activeChain?.chainName ?? view.blockchain, walletKind: activeChain?.chainKind }\n : null;\n\n const awaitingBalances = showBalances\n && sections.every((section) => section.tokens.length === 0)\n && scopedTokens.some((token) => loadingOf(token));\n const tokenDisabled = (token: PayToken) => (\n isBlockchainDisabled(token.blockchain, disabledBlockchains)\n || isChainKindLocked(token.chain.chainKind, lockChainKind)\n );\n const sliding = view.kind === \"networks\" || view.kind === \"network-chain\";\n\n const tokenPane = (\n <TokenPane\n sections={sections}\n header={chainHeader}\n selectedAssetId={selectedAssetId}\n loading={loading || awaitingBalances}\n showBalances={showBalances}\n showWalletStatus={payer}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={handleSelectToken}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n />\n );\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 headerClassName={cx(\"h-14 border-b border-[#e3e3e3] px-[22px] pr-4\", headerClassName)}\n closeClassName={cx(\"md:ml-0\", closeClassName)}\n contentClassName={cx(\"overflow-hidden\", contentClassName)}\n headerAction={(\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 )}\n cardClassName={cx(\n \"w-full max-h-[90vh] gap-0 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-0 shadow-[0_0_40px_0_rgba(0,0,0,0.06)] md:w-[474px] md:rounded-[12px] md:p-0\",\n className,\n )}\n >\n <div className=\"flex h-[min(520px,62vh)] min-h-0 flex-col overflow-hidden md:h-[min(555px,70vh)]\">\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"mb-3 shrink-0 px-[22px] md:hidden\"\n inputClassName={cx(SEARCH_INPUT_CLASS, searchClassName)}\n />\n <div className=\"flex min-h-0 flex-1\">\n <NetworkRail\n role={payer ? \"payer\" : \"receiver\"}\n walletConnected={walletConnected}\n selection={railSelection(view)}\n chains={railChains}\n fundedBlockchains={fundedBlockchains}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n onSelectWallet={() => setView({ kind: \"wallet\" })}\n onSelectAll={() => setView({ kind: \"all\" })}\n onSelectNetworks={() => setView({ kind: \"networks\" })}\n onSelectChain={(blockchain) => handleSelectChain(blockchain, false)}\n className={railClassName}\n />\n {searching ? (\n <SearchResults\n groups={searchGroups}\n selectedAssetId={selectedAssetId}\n loading={loading}\n showBalances={showBalances}\n showWalletStatus={payer}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={handleSelectToken}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n />\n ) : sliding ? (\n <PaneTransition\n paneKey={view.kind === \"network-chain\" ? `network-chain:${view.blockchain}` : \"networks\"}\n direction={slideDirection}\n >\n {view.kind === \"networks\" ? (\n <ChainPane\n chains={networkChains}\n showWalletStatus={payer}\n onSelectChain={(blockchain) => handleSelectChain(blockchain, true)}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n scrollRef={networksScrollRef}\n />\n ) : tokenPane}\n </PaneTransition>\n ) : (\n <div className=\"relative min-h-0 flex-1\">{tokenPane}</div>\n )}\n </div>\n </div>\n </Dialog>\n );\n}\n","import type { ReactNode, Ref } from \"react\";\nimport { IconChevron } from \"@stableflow/pay-ui/icons/chevron\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { usePayWidgets } from \"./context\";\nimport { chainKindLabel, cx, fontSans, thinScrollbar } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type ChainPaneProps = {\n chains: SidebarChain[];\n showWalletStatus?: boolean;\n onSelectChain: (blockchain: string) => void;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n scrollRef?: Ref<HTMLDivElement>;\n};\n\nfunction lockReason(lockChainKind: ChainKind, labels: Record<string, string>): string {\n return `Recipient address is on ${chainKindLabel(lockChainKind, labels)}; edit the recipient to change chain`;\n}\n\nexport function ChainPane(props: ChainPaneProps) {\n const {\n chains,\n showWalletStatus = true,\n onSelectChain,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n scrollRef,\n } = props;\n const { chainKindLabels } = usePayWidgets();\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 h-full min-h-0 flex-col\">\n <div ref={scrollRef} className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-2.5 pt-[17px] pb-3\">\n <p className={cx(\"px-3.5 text-sm font-medium text-[#aaa]\", fontSans)}>All Networks</p>\n <div className=\"mt-1\">\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, chainKindLabels)\n : undefined;\n return (\n <div\n key={chain.blockchain}\n className={cx(\n \"flex h-[66px] w-full items-center gap-4 rounded-[12px] px-3.5\",\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 onSelectChain(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 <img src={chain.logo} alt=\"\" className=\"size-8 shrink-0 object-cover\" />\n <span className={cx(\"truncate text-sm font-medium text-black\", fontSans)}>{chain.chainName}</span>\n </button>,\n )}\n {showWalletStatus ? <ChainWalletStatus kind={chain.chainKind} /> : <span className=\"min-w-0 flex-1\" />}\n <button\n type=\"button\"\n aria-label={`Open ${chain.chainName}`}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onSelectChain(chain.blockchain);\n }}\n className={cx(\n \"inline-flex shrink-0 border-0 bg-transparent p-0 text-[#606060]\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <IconChevron />\n </button>\n </div>\n );\n })}\n </div>\n </div>\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 { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CHAIN_KIND_LABELS } from \"./config\";\n\n/** Host-independent sans stack. Underscores in the arbitrary value become spaces. */\nexport const fontSans = \"[font-family:Montserrat,PingFang_SC,system-ui,sans-serif]\";\n\nexport const thinScrollbar = \"[&::-webkit-scrollbar]:w-[4px] [&::-webkit-scrollbar-thumb]:rounded-[12px] [&::-webkit-scrollbar-thumb]:bg-[#d9d9d9] [&::-webkit-scrollbar-track]:bg-transparent supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] [scrollbar-color:#d9d9d9_transparent]\";\n\nexport function cx(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function formatAddress(address: string | null | undefined, prefix = 4, suffix = 5): string {\n if (!address) return \"\";\n if (!address.startsWith(\"0x\") && address.length <= 32) return address;\n if (address.length <= prefix + suffix) return address;\n return `${address.slice(0, prefix)}...${address.slice(-suffix)}`;\n}\n\nexport function chainKindLabel(kind: string, labels?: Record<string, string>): string {\n return labels?.[kind] ?? CHAIN_KIND_LABELS[kind] ?? kind;\n}\n\n/** Truncate a decimal string toward zero and group the integer part. */\nexport function formatDisplayAmount(\n value: string | number,\n options: { maxDecimals?: number; prefix?: string; showDust?: boolean } = {},\n): string {\n const maxDecimals = options.maxDecimals ?? 2;\n const prefix = options.prefix ?? \"\";\n const text = String(value).trim();\n const negative = text.startsWith(\"-\");\n const unsigned = negative ? text.slice(1) : text;\n if (!/^\\d+(\\.\\d+)?$/.test(unsigned)) return `${prefix}0`;\n\n const numeric = Number(unsigned);\n const minUnit = 10 ** -maxDecimals;\n if (options.showDust && numeric > 0 && numeric < minUnit) {\n const dust = `<${minUnit.toFixed(maxDecimals)}`;\n return prefix ? `${prefix} ${dust}` : dust;\n }\n\n const [intPart, fracPart = \"\"] = unsigned.split(\".\");\n const fraction = fracPart.slice(0, maxDecimals).replace(/0+$/, \"\");\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n const body = fraction.length > 0 ? `${grouped}.${fraction}` : grouped;\n return `${prefix}${negative ? \"-\" : \"\"}${body}`;\n}\n","import { ALL_CHAIN_FILTER, DEFAULT_STABLE_SYMBOLS } from \"./config\";\nimport type { ChainKind, PayChain, PayToken, PopularTokenRef } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type SidebarChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n logo: string;\n};\n\nexport function chainsFromTokens(tokens: readonly { blockchain: string; chain: PayChain }[]): PayChain[] {\n const byCode = new Map<string, PayChain>();\n for (const token of tokens) {\n const code = token.chain.blockchain || token.blockchain;\n if (!byCode.has(code)) byCode.set(code, token.chain);\n }\n return Array.from(byCode.values());\n}\n\n/** USD value of a token balance using config `price`. Unknown balance is -1 (sort last). */\nexport function tokenBalanceUsd(\n token: Pick<PayToken, \"price\">,\n formatted: string | null | undefined,\n): number {\n if (formatted == null || formatted === \"\") return -1;\n const amount = Number(formatted);\n if (!Number.isFinite(amount)) return -1;\n const price = Number(token.price);\n return amount * (Number.isFinite(price) ? price : 0);\n}\n\nexport function tokenMatchesSearch(\n token: Pick<PayToken, \"symbol\" | \"providerSymbol\"> & { contractAddress?: string | null },\n query: string,\n): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n if (token.symbol.toLowerCase().includes(q)) return true;\n if (token.providerSymbol.toLowerCase().includes(q)) return true;\n return Boolean(token.contractAddress?.toLowerCase().includes(q));\n}\n\nexport function matchesChainFilter(token: Pick<PayToken, \"blockchain\">, chainFilter: string): boolean {\n if (chainFilter === ALL_CHAIN_FILTER) return true;\n return token.blockchain === chainFilter;\n}\n\nexport function formattedBalancePositive(formatted: string | null | undefined): boolean {\n if (formatted == null || formatted === \"\") return false;\n const amount = Number(formatted);\n return Number.isFinite(amount) && amount > 0;\n}\n\nexport function chainHasBalance<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalance: (token: T) => string | null | undefined,\n): boolean {\n return tokens.some(\n (token) => token.blockchain === blockchain && formattedBalancePositive(getBalance(token)),\n );\n}\n\nexport function chainBalanceUsd<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): number {\n let total = 0;\n for (const token of tokens) {\n if (token.blockchain !== blockchain) continue;\n const usd = getBalanceUsd(token);\n if (usd > 0) total += usd;\n }\n return total;\n}\n\nexport 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\nexport function sortChainsAlpha<T extends { chainName: string }>(chains: readonly T[]): T[] {\n return chains.slice().sort((left, right) => left.chainName.localeCompare(right.chainName));\n}\n\n/** Funded chains first by total USD, then chain name. Hidden balances keep the incoming order. */\nexport function sortChainsForSidebar<T extends Pick<PayToken, \"blockchain\">>(\n chains: SidebarChain[],\n tokens: T[],\n options: {\n showBalances: boolean;\n getBalanceUsd: (token: T) => number;\n },\n): SidebarChain[] {\n if (!options.showBalances) return chains.slice();\n return chains.slice().sort((left, right) => {\n const leftUsd = chainBalanceUsd(left.blockchain, tokens, options.getBalanceUsd);\n const rightUsd = chainBalanceUsd(right.blockchain, tokens, options.getBalanceUsd);\n if (rightUsd !== leftUsd) return rightUsd - leftUsd;\n return left.chainName.localeCompare(right.chainName);\n });\n}\n\nexport function payerRailChains<T extends { blockchain: string; chainKind: string }>(\n chains: readonly T[],\n owners: Partial<Record<string, string | null | undefined>>,\n fundedSet: ReadonlySet<string>,\n): T[] {\n return chains.filter((chain) => {\n if (!owners[chain.chainKind]) return false;\n if (chain.chainKind === \"evm\" && !fundedSet.has(chain.blockchain)) return false;\n return true;\n });\n}\n\nexport function initialChainFilter(\n lockChainKind: ChainKind | null | undefined,\n recentBlockchains: readonly string[],\n chains: readonly SidebarChain[],\n): string {\n if (!lockChainKind) return ALL_CHAIN_FILTER;\n const matching = chains.filter((chain) => chain.chainKind === lockChainKind);\n if (matching.length === 0) return ALL_CHAIN_FILTER;\n for (const code of recentBlockchains) {\n if (matching.some((chain) => chain.blockchain === code)) return code;\n }\n return matching[0].blockchain;\n}\n\nexport function isBlockchainDisabled(\n blockchain: string,\n disabledBlockchains: string[] | null | undefined,\n): boolean {\n if (!disabledBlockchains?.length) return false;\n const code = blockchain.toLowerCase();\n return disabledBlockchains.some((item) => item.toLowerCase() === code);\n}\n\nexport function isChainKindLocked(\n chainKind: ChainKind,\n lockChainKind: ChainKind | null | undefined,\n): boolean {\n return Boolean(lockChainKind && chainKind !== lockChainKind);\n}\n\nconst BALANCE_RANK_FUNDED = 0;\nconst BALANCE_RANK_LOADING = 1;\nconst BALANCE_RANK_EMPTY = 2;\n\nfunction tokenBalanceRank(usd: number, loading: boolean): number {\n if (loading) return BALANCE_RANK_LOADING;\n if (usd > 0) return BALANCE_RANK_FUNDED;\n return BALANCE_RANK_EMPTY;\n}\n\nexport function compareTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(left: T, right: T): number {\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\n/** Positive USD first, then balances still loading, then zero or unknown. */\nexport function sortTokensByBalance<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n isLoading: (token: T) => boolean,\n): T[] {\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(getBalanceUsd(left), isLoading(left));\n const rightRank = tokenBalanceRank(getBalanceUsd(right), isLoading(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = getBalanceUsd(right) - getBalanceUsd(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensBySymbol(left, right);\n });\n}\n\nexport function sortTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(tokens: T[]): T[] {\n return tokens.slice().sort(compareTokensBySymbol);\n}\n\nexport function positiveBalanceTokens<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): T[] {\n return sortTokensByBalance(\n tokens.filter((token) => getBalanceUsd(token) > 0),\n getBalanceUsd,\n () => false,\n );\n}\n\nexport function isGasToken(token: {\n contractAddress?: string | null;\n symbol: string;\n blockchain: string;\n}): boolean {\n const addr = String(token.contractAddress || \"\").trim().toLowerCase();\n if (!addr || addr === \"native\" || addr === ZERO_ADDRESS) return true;\n return token.blockchain === \"near\" && token.symbol.toUpperCase() === \"NEAR\";\n}\n\nexport function stableSymbolIndex(symbol: string, stableSymbols: readonly string[]): number {\n const upper = symbol.toUpperCase();\n return stableSymbols.findIndex((item) => item.toUpperCase() === upper);\n}\n\nexport function tokenPriority(\n token: { contractAddress?: string | null; symbol: string; blockchain: string },\n stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS,\n): number {\n if (stableSymbolIndex(token.symbol, stableSymbols) >= 0) return 0;\n if (isGasToken(token)) return 1;\n return 2;\n}\n\nexport function compareTokensByPriority<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(left: T, right: T, stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS): number {\n const leftPriority = tokenPriority(left, stableSymbols);\n const rightPriority = tokenPriority(right, stableSymbols);\n if (leftPriority !== rightPriority) return leftPriority - rightPriority;\n if (leftPriority === 0) {\n const leftIndex = stableSymbolIndex(left.symbol, stableSymbols);\n const rightIndex = stableSymbolIndex(right.symbol, stableSymbols);\n if (leftIndex !== rightIndex) return leftIndex - rightIndex;\n }\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\nexport function sortTokensForChain<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(\n tokens: readonly T[],\n options: {\n withBalances: boolean;\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n stableSymbols?: readonly string[];\n },\n): T[] {\n const stableSymbols = options.stableSymbols ?? DEFAULT_STABLE_SYMBOLS;\n if (!options.withBalances) {\n return tokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n }\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(options.usdOf(left), options.loadingOf(left));\n const rightRank = tokenBalanceRank(options.usdOf(right), options.loadingOf(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = options.usdOf(right) - options.usdOf(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensByPriority(left, right, stableSymbols);\n });\n}\n\nconst EVM_SEARCH_GROUP = \"evm\";\nconst EVM_SEARCH_GROUP_NAME = \"EVM-based\";\n\nexport type SearchResultGroup<T> = {\n blockchain: string;\n chainName: string;\n chainKind: string;\n tokens: T[];\n};\n\nexport function groupSearchResults<T extends {\n blockchain: string;\n symbol: string;\n providerSymbol: string;\n contractAddress?: string | null;\n chain: { chainName: string; chainKind: string };\n}>(\n tokens: readonly T[],\n query: string,\n options: {\n role: \"payer\" | \"receiver\";\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n hasOwner: (chainKind: string) => boolean;\n stableSymbols?: readonly string[];\n },\n): SearchResultGroup<T>[] {\n const matched = tokens.filter((token) => tokenMatchesSearch(token, query));\n const groups = new Map<string, T[]>();\n for (const token of matched) {\n const key = token.chain.chainKind === EVM_SEARCH_GROUP ? EVM_SEARCH_GROUP : token.blockchain;\n const list = groups.get(key) ?? [];\n list.push(token);\n groups.set(key, list);\n }\n const stableSymbols = options.stableSymbols ?? DEFAULT_STABLE_SYMBOLS;\n const built = Array.from(groups.entries()).map(([key, groupTokens]) => {\n const chain = groupTokens[0].chain;\n const folded = key === EVM_SEARCH_GROUP;\n const sorted = options.role === \"payer\"\n ? sortTokensForChain(groupTokens, {\n withBalances: options.hasOwner(chain.chainKind),\n usdOf: options.usdOf,\n loadingOf: options.loadingOf,\n stableSymbols,\n })\n : groupTokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n return {\n blockchain: folded ? EVM_SEARCH_GROUP : key,\n chainName: folded ? EVM_SEARCH_GROUP_NAME : chain.chainName,\n chainKind: chain.chainKind,\n tokens: sorted,\n usd: sorted.reduce((total, token) => {\n const usd = options.usdOf(token);\n return usd > 0 ? total + usd : total;\n }, 0),\n };\n });\n built.sort((left, right) => {\n if (options.role === \"payer\" && right.usd !== left.usd) return right.usd - left.usd;\n return left.chainName.localeCompare(right.chainName);\n });\n return built.map(({ blockchain, chainName, chainKind, tokens: groupTokens }) => ({\n blockchain,\n chainName,\n chainKind,\n tokens: groupTokens,\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 { usePayWidgets } from \"./context\";\nimport { chainKindLabel, cx, fontSans, thinScrollbar } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type RailSelection =\n | { kind: \"wallet\" }\n | { kind: \"all\" }\n | { kind: \"networks\" }\n | { kind: \"chain\"; blockchain: string };\n\nexport type NetworkRailProps = {\n role: \"payer\" | \"receiver\";\n walletConnected: boolean;\n selection: RailSelection;\n chains: SidebarChain[];\n fundedBlockchains: ReadonlySet<string>;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n onSelectWallet: () => void;\n onSelectAll: () => void;\n onSelectNetworks: () => void;\n onSelectChain: (blockchain: string) => void;\n className?: string;\n};\n\nfunction chipClass(selected: boolean, disabled: boolean) {\n return cx(\n \"relative flex size-[50px] shrink-0 items-center justify-center rounded-[12px] border border-solid\",\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 role,\n walletConnected,\n selection,\n chains,\n fundedBlockchains,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n onSelectWallet,\n onSelectAll,\n onSelectNetworks,\n onSelectChain,\n className,\n } = props;\n const { chainKindLabels } = usePayWidgets();\n const payer = role === \"payer\";\n const networksSelected = selection.kind === \"networks\";\n const allSelected = selection.kind === \"all\";\n const walletSelected = selection.kind === \"wallet\";\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 function chainButton(chain: SidebarChain) {\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!, chainKindLabels)}; edit the recipient to change chain`\n : undefined;\n const selected = selection.kind === \"chain\" && selection.blockchain === 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 onSelectChain(chain.blockchain);\n }}\n className={chipClass(selected, disabled)}\n >\n <img src={chain.logo} alt=\"\" className=\"size-8 object-cover\" />\n {fundedBlockchains.has(chain.blockchain) ? (\n <span className=\"absolute top-1 right-1 size-2.5 rounded-full border border-white bg-[#06f]\" />\n ) : null}\n </button>,\n )}\n </span>\n );\n }\n\n return (\n <div className={cx(\"box-border flex h-full w-[76px] shrink-0 flex-col items-center border-r border-[#e3e3e3] pt-3\", className)}>\n {payer && walletConnected ? (\n <button type=\"button\" aria-label=\"Wallet\" onClick={onSelectWallet} className={chipClass(walletSelected, false)}>\n <IconWallet className={walletSelected ? \"size-5 text-[#06f]\" : \"size-5 text-black\"} />\n </button>\n ) : null}\n {payer && !walletConnected ? (\n <button type=\"button\" aria-label=\"All networks\" onClick={onSelectNetworks} className={chipClass(networksSelected, false)}>\n <IconAllNetworks className=\"size-5 text-black\" />\n </button>\n ) : null}\n {!payer ? (\n <button type=\"button\" aria-label=\"All\" onClick={onSelectAll} className={chipClass(allSelected, false)}>\n <span className={cx(\"text-sm font-medium text-black\", fontSans)}>All</span>\n </button>\n ) : null}\n {payer && walletConnected ? (\n <div className={cx(\"mt-3.5 flex min-h-0 w-full flex-1 flex-col items-center gap-3.5 overflow-y-auto\", thinScrollbar)}>\n {chains.map((chain) => chainButton(chain))}\n <div className=\"h-px w-8 shrink-0 bg-[#e3e3e3]\" />\n <button type=\"button\" aria-label=\"All networks\" onClick={onSelectNetworks} className={chipClass(networksSelected, false)}>\n <IconAllNetworks className=\"size-5 text-black\" />\n </button>\n <div className=\"pb-3\" />\n </div>\n ) : null}\n {!payer ? (\n <div className={cx(\"mt-3.5 flex min-h-0 w-full flex-1 flex-col items-center gap-3.5 overflow-y-auto\", thinScrollbar)}>\n {chains.map((chain) => chainButton(chain))}\n <div className=\"pb-3\" />\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\n\nconst EASE: [number, number, number, number] = [0.32, 0.72, 0, 1];\n\nconst variants = {\n enter: (direction: number) => ({ x: direction > 0 ? 24 : -24, opacity: 0 }),\n center: { x: 0, opacity: 1 },\n exit: (direction: number) => ({ x: direction > 0 ? -24 : 24, opacity: 0 }),\n};\n\nexport function PaneTransition(props: { paneKey: string; direction: number; children: ReactNode }) {\n const reduce = useReducedMotion();\n if (reduce) {\n return <div className=\"relative min-h-0 flex-1 overflow-hidden\">{props.children}</div>;\n }\n return (\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n <AnimatePresence initial={false} custom={props.direction}>\n <motion.div\n key={props.paneKey}\n custom={props.direction}\n variants={variants}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{ duration: 0.22, ease: EASE }}\n className=\"absolute inset-0 flex min-h-0 flex-col\"\n >\n {props.children}\n </motion.div>\n </AnimatePresence>\n </div>\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 { IconChevron } from \"@stableflow/pay-ui/icons/chevron\";\nimport { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { cx, fontSans, formatDisplayAmount, thinScrollbar } 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 TokenPaneHeader =\n | { kind: \"back\"; title: string; onBack: () => void; walletKind?: ChainKind | null }\n | { kind: \"chain\"; title: string; walletKind?: ChainKind | null };\n\nexport type TokenPaneProps = {\n sections: TokenListSection[];\n selectedAssetId?: string | null;\n loading: boolean;\n showBalances?: boolean;\n showWalletStatus?: boolean;\n header?: TokenPaneHeader | null;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n rowClassName?: string;\n};\n\nexport function TokenPane(props: TokenPaneProps) {\n const {\n sections,\n selectedAssetId,\n loading,\n showBalances = false,\n showWalletStatus = true,\n header = null,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\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 h-full min-h-0 flex-1 flex-col\">\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-2.5 pt-[17px] pb-3\">\n {header ? (\n <ChainListHeader header={header} showWalletStatus={showWalletStatus} />\n ) : null}\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-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-3.5 py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChainListHeader(props: { header: TokenPaneHeader; showWalletStatus: boolean }) {\n const { header, showWalletStatus } = props;\n const walletKind = header.walletKind;\n return (\n <div className=\"mb-1 flex items-center justify-between gap-3 px-3.5\">\n {header.kind === \"back\" ? (\n <button\n type=\"button\"\n onClick={header.onBack}\n className={cx(\"flex min-w-0 cursor-pointer items-center gap-3 border-0 bg-transparent p-0 text-sm font-medium text-[#aaa]\", fontSans)}\n >\n <IconChevron className=\"rotate-180 text-[#aaa]\" />\n <span className=\"truncate\">{header.title}</span>\n </button>\n ) : (\n <p className={cx(\"min-w-0 truncate text-sm font-medium text-[#aaa]\", fontSans)}>{header.title}</p>\n )}\n {showWalletStatus && walletKind ? <ChainWalletStatus kind={walletKind} /> : null}\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 h-[66px] items-center gap-2.5 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\nexport function 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 h-[66px] w-full cursor-pointer items-center justify-between gap-2 rounded-[12px] border-0 bg-transparent px-3.5 text-left hover:bg-[#f6f6f6]\",\n selected && \"bg-[#f6f6f6]\",\n disabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n className,\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <span className=\"relative size-8 shrink-0\">\n <img src={token.logo} alt=\"\" className=\"size-8 rounded-[12px] 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 font-medium text-black\", fontSans)}>-</span>\n )}\n </span>\n ) : null}\n </button>\n );\n}\n","import { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { cx, fontSans, thinScrollbar } from \"./format\";\nimport { TokenRow } from \"./token-pane\";\nimport type { PayToken } from \"./types\";\nimport type { SearchResultGroup } from \"./utils\";\n\nexport type SearchResultsProps = {\n groups: SearchResultGroup<PayToken>[];\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 rowClassName?: string;\n};\n\nexport function SearchResults(props: SearchResultsProps) {\n const {\n groups,\n selectedAssetId,\n loading,\n showBalances = false,\n showWalletStatus = true,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n rowClassName,\n } = props;\n const hasTokens = groups.some((group) => group.tokens.length > 0);\n\n return (\n <div className=\"flex h-full min-h-0 flex-1 flex-col\">\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-2.5 pt-[17px] pb-3\">\n {groups.map((group) => (\n <section key={group.blockchain} className=\"mb-2\">\n <div className=\"mb-1 flex items-center justify-between gap-2 px-3.5\">\n <p className={cx(\"min-w-0 truncate text-sm font-medium text-[#aaa]\", fontSans)}>{group.chainName}</p>\n {showWalletStatus ? <ChainWalletStatus kind={group.chainKind} /> : null}\n </div>\n {group.tokens.map((token) => (\n <TokenRow\n key={token.assetId}\n token={token}\n selected={token.assetId === selectedAssetId}\n recent={false}\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 ? (\n <p className={cx(\"px-3.5 py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","export type ChainKind = string;\n\nexport const KNOWN_CHAIN_KINDS = [\"evm\", \"near\", \"solana\", \"tron\", \"zec\"] as const;\n\nexport type PayChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n chainId?: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayToken = {\n assetId: string;\n symbol: string;\n providerSymbol: string;\n blockchain: string;\n decimals: number;\n contractAddress: string | null;\n price: number;\n logo: string;\n supportPayment: boolean;\n supportReceive: boolean;\n chain: PayChain;\n};\n\n/** API-shaped payload. Callers can pass this into their own chain registry. */\nexport type PayConfigSource = {\n chains: PayConfigSourceChain[];\n tokens: PayConfigSourceToken[];\n};\n\nexport type PayConfigSourceChain = {\n network: string;\n chainId: string;\n chainName: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayConfigSourceToken = {\n symbol: string;\n network: string;\n decimals: number;\n contractAddress: string;\n price: string;\n supportPayment: boolean;\n supportReceive: boolean;\n};\n\nexport type PopularTokenRef = {\n blockchain: string;\n symbol: string;\n};\n\nexport type WalletAccountInput = {\n address?: string | null;\n icon?: string | null;\n connecting?: boolean;\n /** False inside a Safe App, where the host owns the connection. */\n canDisconnect?: boolean;\n};\n\nexport type PayWallet = {\n accounts: Partial<Record<ChainKind, WalletAccountInput>>;\n connect: (kind: ChainKind) => void | Promise<void>;\n disconnect: (kind: ChainKind) => void | Promise<void>;\n};\n\nexport type BalanceReadSuccess = {\n assetId: string;\n formatted: string;\n /** Integer token units, as a decimal string. */\n raw?: string;\n};\n\nexport type BalanceReadFailure = {\n assetId: string;\n error: string;\n};\n\nexport type BalanceReadResult = BalanceReadSuccess | BalanceReadFailure;\n\nexport type ReadBalances = (batch: {\n owner: string;\n chainKind: ChainKind;\n blockchain: string;\n tokens: PayToken[];\n}) => Promise<BalanceReadResult[]>;\n\nexport type TokenSelectRole = \"payer\" | \"receiver\";\n\nexport type ChainOwners = Partial<Record<string, string>>;\n\n/** Stable identity for the connected owners. Keys are sorted so order does not matter. */\nexport function ownerKey(owners: ChainOwners): string {\n return Object.keys(owners)\n .sort()\n .map((kind) => `${kind}:${owners[kind] ?? \"\"}`)\n .join(\"|\");\n}\n\nexport type TokenBalanceStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n","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 { DEFAULT_CHAIN_KINDS } from \"./config\";\nimport { chainLogoUrl, tokenLogoUrl } from \"./logos\";\nimport type { ChainKind, PayChain, PayConfigSource, PayConfigSourceChain, PayConfigSourceToken, PayToken } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst WRAP_NEAR_CONTRACT = \"wrap.near\";\n\ntype ChainKindMap = Partial<Record<string, ChainKind>>;\n\nexport type NormalizePayConfigOptions = {\n chainKinds?: ChainKindMap;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction apiText(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nfunction apiNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction asBoolean(value: unknown, fallback = true): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.trim().toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n return fallback;\n}\n\nfunction mapSourceChain(raw: unknown): PayConfigSourceChain {\n const row = asRecord(raw) ?? {};\n return {\n network: apiText(row.network),\n chainId: apiText(row.chain_id ?? row.chainId),\n chainName: apiText(row.chain_name ?? row.chainName),\n logo: apiText(row.logo),\n explorer: apiText(row.explorer),\n };\n}\n\nfunction mapSourceToken(raw: unknown): PayConfigSourceToken {\n const row = asRecord(raw) ?? {};\n return {\n symbol: apiText(row.symbol),\n network: apiText(row.network),\n decimals: apiNumber(row.decimals) ?? 0,\n contractAddress: apiText(row.contract_address ?? row.contractAddress),\n price: apiText(row.price),\n supportPayment: asBoolean(row.support_payment ?? row.supportPayment),\n supportReceive: asBoolean(row.support_receive ?? row.supportReceive),\n };\n}\n\nfunction configBody(raw: unknown): Record<string, unknown> {\n const row = asRecord(raw) ?? {};\n const data = asRecord(row.data);\n if (typeof row.code === \"number\" && data) return data;\n return row;\n}\n\nexport function mapPayConfigSource(raw: unknown): PayConfigSource {\n const row = configBody(raw);\n const chains = Array.isArray(row.chains) ? row.chains.map(mapSourceChain) : [];\n const tokens = Array.isArray(row.tokens) ? row.tokens.map(mapSourceToken) : [];\n return { chains, tokens };\n}\n\nexport function chainKindFor(network: string, overrides: ChainKindMap = {}): ChainKind | null {\n const key = network.trim().toLowerCase();\n if (!key) return null;\n return overrides[key] ?? DEFAULT_CHAIN_KINDS[key as keyof typeof DEFAULT_CHAIN_KINDS] ?? null;\n}\n\nfunction normalizeSymbol(symbol: string): string | null {\n const upper = symbol.trim().toUpperCase();\n if (!upper) return null;\n if (upper === \"USDT0\") return \"USDT\";\n if (upper === \"WNEAR\") return \"NEAR\";\n return upper;\n}\n\nexport function tokenAssetId(network: string, symbol: string, contractAddress: string | null | undefined): string {\n const addr = String(contractAddress || \"\").trim();\n return `${network}:${symbol}:${addr || \"native\"}`;\n}\n\nfunction isNativeAddress(contractAddress: string | null): boolean {\n const addr = String(contractAddress || \"\").trim();\n if (!addr) return true;\n const lower = addr.toLowerCase();\n return lower === \"native\" || lower === ZERO_ADDRESS;\n}\n\nexport function normalizePayConfig(source: PayConfigSource, options?: NormalizePayConfigOptions): PayToken[] {\n const overrides = options?.chainKinds ?? {};\n const chains: PayChain[] = [];\n for (const chain of source.chains) {\n const chainKind = chainKindFor(chain.network, overrides);\n if (!chainKind || !chain.network) continue;\n chains.push({\n blockchain: chain.network,\n chainName: chain.chainName || chain.network,\n chainKind,\n chainId: chain.chainId || undefined,\n logo: chain.logo || chainLogoUrl(chain.network),\n explorer: chain.explorer,\n });\n }\n const chainByCode = new Map(chains.map((chain) => [chain.blockchain, chain]));\n const tokens: PayToken[] = [];\n for (const token of source.tokens) {\n const chain = chainByCode.get(token.network);\n if (!chain) continue;\n const symbol = normalizeSymbol(token.symbol);\n if (!symbol) continue;\n if (!Number.isInteger(token.decimals) || token.decimals < 0) continue;\n const contractAddress = token.contractAddress.trim() || null;\n tokens.push({\n assetId: tokenAssetId(token.network, symbol, contractAddress),\n symbol,\n providerSymbol: token.symbol,\n blockchain: token.network,\n decimals: token.decimals,\n contractAddress,\n price: Number(token.price || 1),\n logo: tokenLogoUrl(symbol),\n supportPayment: token.supportPayment,\n supportReceive: token.supportReceive,\n chain,\n });\n }\n const hasNearWrap = tokens.some((token) => (\n token.symbol === \"NEAR\" && token.blockchain === \"near\" && token.contractAddress?.toLowerCase() === WRAP_NEAR_CONTRACT\n ));\n if (!hasNearWrap) return tokens;\n return tokens.filter((token) => !(token.symbol === \"NEAR\" && token.blockchain === \"near\" && isNativeAddress(token.contractAddress)));\n}\n"],"mappings":"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","names":["useEffect","useSyncExternalStore","jsx","jsx","jsxs","Tooltip","jsx","jsxs","Tooltip","jsx","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","IconChevron","jsx","jsxs","IconChevron","jsx","jsxs","ownerKey","jsx","jsxs","prefs","useSyncExternalStore","owners","useEffect","ownerKey","ZERO_ADDRESS","chainByCode"]}
|
|
1
|
+
{"version":3,"sources":["../../src/token-select/context.tsx","../../src/token-select/balances.ts","../../src/token-select/config.ts","../../src/token-select/TokenSelectDialog.tsx","../../src/token-select/chain-pane.tsx","../../src/token-select/chain-wallet-status.tsx","../../src/token-select/format.ts","../../src/token-select/utils.ts","../../src/token-select/network-rail.tsx","../../src/token-select/pane-transition.tsx","../../src/token-select/prefs.ts","../../src/token-select/token-pane.tsx","../../src/token-select/lazy-image.tsx","../../src/token-select/logos.ts","../../src/token-select/search-results.tsx","../../src/token-select/types.ts","../../src/token-select/pay-config.ts"],"sourcesContent":["import { useEffect, type ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { clearPayTokenBalances, configureBalanceReaders, setBalanceTokens } from \"./balances\";\nimport { DEFAULT_STABLE_SYMBOLS } from \"./config\";\nimport type { PayToken, PayWallet, PopularTokenRef, ReadBalances } from \"./types\";\n\nexport type PayBalanceMode = \"async\" | \"sync\" | \"none\";\n\ntype PayWidgetsContextValue = {\n tokens: PayToken[];\n loading: boolean;\n wallet: PayWallet;\n popularTokens: PopularTokenRef[];\n stableSymbols: string[];\n chainKindLabels: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n balanceMode: PayBalanceMode;\n getBalance: ((token: PayToken, owner: string) => string | null | undefined) | null;\n isBalanceLoading: ((token: PayToken, owner: string) => boolean) | null;\n};\n\nconst PayWidgetsContext = createContext<PayWidgetsContextValue | null>(null);\n\nexport type PayWidgetsProviderProps = {\n tokens: PayToken[];\n loading?: boolean;\n wallet: PayWallet;\n readBalances?: ReadBalances;\n getBalance?: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading?: (token: PayToken, owner: string) => boolean;\n popularTokens?: PopularTokenRef[];\n stableSymbols?: string[];\n chainKindLabels?: Record<string, string>;\n onCopyAddress?: (address: string) => void;\n children: ReactNode;\n};\n\nfunction isProduction() {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n return env === \"production\";\n}\n\nfunction warnBalanceMode(readBalances: ReadBalances | undefined, getBalance: PayWidgetsProviderProps[\"getBalance\"]) {\n if (isProduction()) return;\n if (readBalances && getBalance) {\n console.warn(\"PayWidgetsProvider: both readBalances and getBalance were passed; using readBalances.\");\n return;\n }\n if (!readBalances && !getBalance) {\n console.warn(\"PayWidgetsProvider: pass readBalances or getBalance so token balances can load.\");\n }\n}\n\nexport function PayWidgetsProvider(props: PayWidgetsProviderProps) {\n const {\n tokens,\n loading = false,\n popularTokens = [],\n wallet,\n readBalances,\n getBalance,\n isBalanceLoading,\n onCopyAddress,\n stableSymbols = [...DEFAULT_STABLE_SYMBOLS],\n chainKindLabels = {},\n children,\n } = props;\n\n useEffect(() => {\n warnBalanceMode(readBalances, getBalance);\n configureBalanceReaders({\n readBalances: readBalances ?? null,\n getBalance: getBalance ?? null,\n isBalanceLoading: isBalanceLoading ?? null,\n });\n return () => configureBalanceReaders({});\n }, [readBalances, getBalance, isBalanceLoading]);\n\n useEffect(() => {\n setBalanceTokens(tokens);\n }, [tokens]);\n\n const connected = Object.values(wallet.accounts).some((account) => Boolean(account?.address?.trim()));\n useEffect(() => {\n if (!connected) clearPayTokenBalances();\n }, [connected]);\n\n const balanceMode: PayBalanceMode = readBalances ? \"async\" : getBalance ? \"sync\" : \"none\";\n const value: PayWidgetsContextValue = {\n tokens,\n loading,\n wallet,\n popularTokens,\n stableSymbols,\n chainKindLabels,\n onCopyAddress,\n balanceMode,\n getBalance: balanceMode === \"sync\" ? getBalance ?? null : null,\n isBalanceLoading: balanceMode === \"sync\" ? isBalanceLoading ?? null : null,\n };\n\n return <PayWidgetsContext.Provider value={value}>{children}</PayWidgetsContext.Provider>;\n}\n\nexport function usePayWidgets(): PayWidgetsContextValue {\n const value = useContext(PayWidgetsContext);\n if (!value) {\n throw new Error(\"Token select must be rendered inside PayWidgetsProvider\");\n }\n return value;\n}\n","import { useSyncExternalStore } from \"react\";\nimport { TOKEN_BALANCE_POLL_MS } from \"./config\";\nimport type { BalanceReadResult, ChainKind, ChainOwners, PayToken, ReadBalances, TokenBalanceStatus } from \"./types\";\n\nexport type TokenBalance = {\n raw: string | null;\n formatted: string | null;\n status: TokenBalanceStatus;\n error: string | null;\n updatedAt: number | null;\n};\n\ntype SyncBalanceReader = {\n getBalance: (token: PayToken, owner: string) => string | null | undefined;\n isBalanceLoading: (token: PayToken, owner: string) => boolean;\n};\n\nconst listeners = new Set<() => void>();\nlet balances: Record<string, TokenBalance> = {};\nlet reader: ReadBalances | null = null;\nlet syncReader: SyncBalanceReader | null = null;\nlet tokensById = new Map<string, PayToken>();\nconst chainInflight = new Map<string, Promise<void>>();\n\nexport function configureBalanceReaders(options: {\n readBalances?: ReadBalances | null;\n getBalance?: SyncBalanceReader[\"getBalance\"] | null;\n isBalanceLoading?: SyncBalanceReader[\"isBalanceLoading\"] | null;\n}) {\n reader = options.readBalances ?? null;\n if (!options.readBalances && options.getBalance) {\n syncReader = {\n getBalance: options.getBalance,\n isBalanceLoading: options.isBalanceLoading ?? (() => false),\n };\n return;\n }\n syncReader = null;\n}\n\nexport function setBalanceTokens(tokens: readonly PayToken[]) {\n tokensById = new Map(tokens.map((token) => [token.assetId, token]));\n}\n\nexport function payBalanceMode(): \"async\" | \"sync\" | \"none\" {\n if (reader) return \"async\";\n if (syncReader) return \"sync\";\n return \"none\";\n}\n\nfunction emit() {\n balances = { ...balances };\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function subscribePayTokenBalances(listener: () => void) {\n return subscribe(listener);\n}\n\nexport function getPayTokenBalances() {\n return balances;\n}\n\nfunction ownerKey(owner: string, chainKind: ChainKind): string {\n return chainKind === \"solana\" || chainKind === \"zec\" ? owner : owner.toLowerCase();\n}\n\nfunction balanceKey(owner: string, assetId: string, chainKind: ChainKind): string {\n return `${ownerKey(owner, chainKind)}:${assetId}`;\n}\n\nfunction isFresh(entry: TokenBalance | undefined, now: number): boolean {\n return Boolean(\n entry\n && entry.status === \"success\"\n && entry.updatedAt != null\n && now - entry.updatedAt < TOKEN_BALANCE_POLL_MS,\n );\n}\n\nfunction loadingEntry(prev: TokenBalance | undefined): TokenBalance {\n if (!prev) return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n return { ...prev, status: \"loading\", error: null };\n}\n\nfunction withStaleOnError(prev: TokenBalance | undefined, next: TokenBalance): TokenBalance {\n if (next.status !== \"error\") return next;\n if (prev?.raw == null && prev?.formatted == null) return next;\n return { ...next, raw: prev.raw, formatted: prev.formatted, updatedAt: prev.updatedAt };\n}\n\nexport function setBalanceReader(next: ReadBalances | null) {\n reader = next;\n if (next) syncReader = null;\n}\n\nexport function clearPayTokenBalances() {\n balances = {};\n emit();\n}\n\nfunction syncBalance(owner: string, assetId: string): TokenBalance | undefined {\n if (!syncReader) return undefined;\n const token = tokensById.get(assetId);\n if (!token) return undefined;\n const loading = syncReader.isBalanceLoading(token, owner);\n const formatted = syncReader.getBalance(token, owner);\n if (loading && (formatted == null || formatted === \"\")) {\n return { raw: null, formatted: null, status: \"loading\", error: null, updatedAt: null };\n }\n if (formatted == null || formatted === \"\") return undefined;\n return { raw: null, formatted, status: \"success\", error: null, updatedAt: null };\n}\n\nexport function getPayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n if (!owner || !assetId) return undefined;\n if (syncReader) return syncBalance(owner, assetId);\n return balances[`${owner}:${assetId}`] ?? balances[`${owner.toLowerCase()}:${assetId}`];\n}\n\nexport function usePayTokenBalance(owner: string | null | undefined, assetId: string | null | undefined): TokenBalance | undefined {\n const current = useSyncExternalStore(subscribe, getPayTokenBalances, getPayTokenBalances);\n if (!owner || !assetId) return undefined;\n return current[`${owner}:${assetId}`] ?? current[`${owner.toLowerCase()}:${assetId}`];\n}\n\nfunction writeResult(owner: string, token: PayToken, result: BalanceReadResult) {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n const prev = balances[key];\n const next: TokenBalance = \"error\" in result\n ? { raw: null, formatted: null, status: \"error\", error: result.error, updatedAt: Date.now() }\n : { raw: result.raw ?? null, formatted: result.formatted, status: \"success\", error: null, updatedAt: Date.now() };\n balances[key] = withStaleOnError(prev, next);\n}\n\nexport async function refreshPayTokenBalance(owner: string, token: PayToken): Promise<TokenBalance | null> {\n const key = balanceKey(owner, token.assetId, token.chain.chainKind);\n balances[key] = loadingEntry(balances[key]);\n emit();\n if (!reader) {\n balances[key] = withStaleOnError(balances[key], {\n raw: null,\n formatted: null,\n status: \"error\",\n error: \"Balance reader is not configured\",\n updatedAt: Date.now(),\n });\n emit();\n return balances[key] ?? null;\n }\n try {\n const results = await reader({\n owner,\n chainKind: token.chain.chainKind,\n blockchain: token.blockchain,\n tokens: [token],\n });\n const result = results.find((item) => item.assetId === token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n };\n writeResult(owner, token, result);\n } catch (cause) {\n writeResult(owner, token, {\n assetId: token.assetId,\n error: cause instanceof Error ? cause.message : \"Failed to read balance\",\n });\n }\n emit();\n return balances[key] ?? null;\n}\n\nfunction groupByChain(tokens: PayToken[]): Map<string, PayToken[]> {\n const groups = new Map<string, PayToken[]>();\n for (const token of tokens) {\n const list = groups.get(token.blockchain) ?? [];\n list.push(token);\n groups.set(token.blockchain, list);\n }\n return groups;\n}\n\nasync function fetchChain(owner: string, tokens: PayToken[], force: boolean) {\n const blockchain = tokens[0]?.blockchain;\n const kind = tokens[0]?.chain.chainKind;\n if (!blockchain || !kind) return;\n const now = Date.now();\n const stale = tokens.filter((token) => force || !isFresh(balances[balanceKey(owner, token.assetId, kind)], now));\n if (stale.length === 0) return;\n\n const flightKey = `${ownerKey(owner, kind)}:${blockchain}`;\n const pending = chainInflight.get(flightKey);\n if (pending) return pending;\n\n for (const token of stale) {\n const key = balanceKey(owner, token.assetId, kind);\n balances[key] = loadingEntry(balances[key]);\n }\n emit();\n\n const run = (async () => {\n if (!reader) {\n for (const token of stale) {\n writeResult(owner, token, { assetId: token.assetId, error: \"Balance reader is not configured\" });\n }\n emit();\n return;\n }\n try {\n const results = await reader({ owner, chainKind: kind, blockchain, tokens: stale });\n const byId = new Map(results.map((item) => [item.assetId, item]));\n for (const token of stale) {\n writeResult(owner, token, byId.get(token.assetId) ?? {\n assetId: token.assetId,\n error: \"Balance reader returned no result\",\n });\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"Failed to read balance\";\n for (const token of stale) writeResult(owner, token, { assetId: token.assetId, error: message });\n }\n emit();\n })();\n\n chainInflight.set(flightKey, run);\n return run.finally(() => {\n if (chainInflight.get(flightKey) === run) chainInflight.delete(flightKey);\n });\n}\n\nexport async function ensurePayTokenBalances(\n owners: ChainOwners,\n tokens: PayToken[],\n opts?: { force?: boolean },\n) {\n if (syncReader || !reader) return;\n const force = Boolean(opts?.force);\n const groups = groupByChain(tokens);\n await Promise.all(Array.from(groups.values()).map((group) => {\n const kind = group[0]?.chain.chainKind;\n const owner = kind ? owners[kind] : undefined;\n if (!owner) return Promise.resolve();\n return fetchChain(owner, group, force);\n }));\n}\n","export const TOKEN_BALANCE_POLL_MS = 60_000;\nexport const ALL_CHAIN_FILTER = \"all\";\nexport const DEFAULT_STABLE_SYMBOLS = [\"USDT\", \"USDC\"] as const;\nexport const 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\nexport const CHAIN_KIND_LABELS: Record<string, string> = {\n evm: \"EVM\",\n near: \"Near\",\n solana: \"Solana\",\n tron: \"Tron\",\n zec: \"Zcash\",\n};\n\n/** Built-in network code to wallet kind. Callers can override unknown codes. */\nexport const DEFAULT_CHAIN_KINDS = {\n eth: \"evm\",\n base: \"evm\",\n arb: \"evm\",\n op: \"evm\",\n pol: \"evm\",\n bsc: \"evm\",\n avax: \"evm\",\n gnosis: \"evm\",\n scroll: \"evm\",\n xlayer: \"evm\",\n bera: \"evm\",\n near: \"near\",\n sol: \"solana\",\n tron: \"tron\",\n zec: \"zec\",\n} as const;\n","import { useEffect, useLayoutEffect, 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 { ChainPane } from \"./chain-pane\";\nimport { cx, fontSans } from \"./format\";\nimport { NetworkRail, type RailSelection } from \"./network-rail\";\nimport { PaneTransition } from \"./pane-transition\";\nimport { getTokenSelectPrefs, setLastBlockchain, setLastToken, useTokenSelectPrefs } from \"./prefs\";\nimport { SearchResults } from \"./search-results\";\nimport { TokenPane, type TokenListSection, type TokenPaneHeader } from \"./token-pane\";\nimport { ownerKey, type ChainKind, type ChainOwners, type PayChain, type PayToken, type TokenSelectRole } from \"./types\";\nimport {\n chainHasBalance,\n chainsFromTokens,\n groupSearchResults,\n initialChainFilter,\n isBlockchainDisabled,\n isChainKindLocked,\n payerRailChains,\n popularTokensForWallets,\n positiveBalanceTokens,\n recentTokensInOrder,\n sortChainsAlpha,\n sortChainsForSidebar,\n sortTokensForChain,\n compareTokensByPriority,\n tokenBalanceUsd,\n} from \"./utils\";\n\nexport type TokenSelectSelection = {\n token: PayToken;\n};\n\nexport type PaneView =\n | { kind: \"wallet\" }\n | { kind: \"all\" }\n | { kind: \"rail-chain\"; blockchain: string }\n | { kind: \"networks\" }\n | { kind: \"network-chain\"; blockchain: string };\n\nexport type TokenSelectDialogProps = {\n open: boolean;\n onClose: () => void;\n onSelect: (selection: TokenSelectSelection) => void;\n role?: TokenSelectRole;\n title?: string;\n selectedAssetId?: string | null;\n balanceOwners?: ChainOwners;\n allowedBlockchains?: string[] | null;\n lockChainKind?: ChainKind | null;\n excludeNative?: boolean;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n className?: string;\n titleClassName?: string;\n headerClassName?: string;\n closeClassName?: string;\n contentClassName?: string;\n searchClassName?: string;\n 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 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\nfunction railSelection(view: PaneView): RailSelection {\n if (view.kind === \"wallet\") return { kind: \"wallet\" };\n if (view.kind === \"all\") return { kind: \"all\" };\n if (view.kind === \"rail-chain\") return { kind: \"chain\", blockchain: view.blockchain };\n return { kind: \"networks\" };\n}\n\nfunction chainByCode(chains: readonly PayChain[], blockchain: string): PayChain | undefined {\n return chains.find((chain) => chain.blockchain === blockchain);\n}\n\nexport function TokenSelectDialog(props: TokenSelectDialogProps) {\n const {\n open,\n onClose,\n onSelect,\n role = \"payer\",\n title = \"Select Token\",\n selectedAssetId,\n balanceOwners,\n allowedBlockchains = null,\n lockChainKind = null,\n excludeNative = false,\n disabledBlockchains = null,\n disabledReason,\n className,\n titleClassName,\n headerClassName,\n closeClassName,\n contentClassName,\n searchClassName,\n railClassName,\n rowClassName,\n } = props;\n const payer = role === \"payer\";\n const showBalances = payer;\n const {\n wallet,\n popularTokens: popularRefs,\n tokens,\n loading,\n stableSymbols,\n balanceMode,\n getBalance: syncGetBalance,\n isBalanceLoading: syncIsBalanceLoading,\n } = usePayWidgets();\n const prefs = useTokenSelectPrefs();\n const balanceEntries = useSyncExternalStore(subscribePayTokenBalances, getPayTokenBalances, getPayTokenBalances);\n const connectedOwners = useMemo(() => {\n const owners: ChainOwners = {};\n for (const [kind, account] of Object.entries(wallet.accounts)) {\n const address = account?.address?.trim();\n if (address) owners[kind] = address;\n }\n return owners;\n }, [wallet.accounts]);\n const owners = useMemo(\n () => (showBalances ? { ...connectedOwners, ...balanceOwners } : {}),\n [showBalances, connectedOwners, balanceOwners],\n );\n const walletConnected = hasAnyOwner(connectedOwners);\n const [search, setSearch] = useState(\"\");\n const [view, setView] = useState<PaneView>(payer ? { kind: \"networks\" } : { kind: \"all\" });\n const [slideDirection, setSlideDirection] = useState<1 | -1>(1);\n const networksScrollRef = useRef<HTMLDivElement>(null);\n const savedNetworksScroll = useRef(0);\n const walletConnectedRef = useRef(walletConnected);\n const payerRef = useRef(payer);\n const lockRef = useRef(lockChainKind);\n const tokensRef = useRef(tokens);\n walletConnectedRef.current = walletConnected;\n payerRef.current = payer;\n lockRef.current = lockChainKind;\n tokensRef.current = tokens;\n\n useEffect(() => {\n if (!open) return;\n setSearch(\"\");\n const lock = lockRef.current;\n if (lock) {\n const filter = initialChainFilter(\n lock,\n getTokenSelectPrefs().recentBlockchains,\n chainsFromTokens(tokensRef.current),\n );\n if (filter !== ALL_CHAIN_FILTER) {\n setView({ kind: \"rail-chain\", blockchain: filter });\n return;\n }\n return;\n }\n if (!payerRef.current) {\n setView({ kind: \"all\" });\n return;\n }\n setView(walletConnectedRef.current ? { kind: \"wallet\" } : { kind: \"networks\" });\n }, [open]);\n\n useEffect(() => {\n if (!open || !lockChainKind) return;\n const filter = initialChainFilter(lockChainKind, getTokenSelectPrefs().recentBlockchains, chainsFromTokens(tokens));\n if (filter === ALL_CHAIN_FILTER) return;\n setView((current) => (current.kind === \"rail-chain\" ? current : { kind: \"rail-chain\", blockchain: filter }));\n }, [open, lockChainKind, tokens]);\n\n const allowed = useMemo(() => {\n if (!allowedBlockchains || allowedBlockchains.length === 0) return null;\n return new Set(allowedBlockchains.map((code) => code.toLowerCase()));\n }, [allowedBlockchains]);\n\n const scopedTokens = useMemo(() => {\n return tokens.filter((token) => {\n if (allowed && !allowed.has(token.blockchain.toLowerCase())) return false;\n if (excludeNative && isNativeToken(token)) return false;\n if (payer && !token.supportPayment) return false;\n if (!payer && !token.supportReceive) return false;\n return true;\n });\n }, [tokens, allowed, excludeNative, payer]);\n\n const ownersKey = ownerKey(owners);\n const tokenKey = useMemo(() => scopedTokens.map((token) => token.assetId).join(\"|\"), [scopedTokens]);\n const ownersRef = useRef(owners);\n const scopedRef = useRef(scopedTokens);\n ownersRef.current = owners;\n scopedRef.current = scopedTokens;\n\n useEffect(() => {\n if (balanceMode !== \"async\" || !showBalances || !open || !hasAnyOwner(ownersRef.current) || !tokenKey) return;\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current);\n const id = window.setInterval(() => {\n void ensurePayTokenBalances(ownersRef.current, scopedRef.current, { force: true });\n }, TOKEN_BALANCE_POLL_MS);\n return () => window.clearInterval(id);\n }, [balanceMode, showBalances, open, ownersKey, tokenKey]);\n\n function balanceOf(token: PayToken) {\n const owner = ownerForToken(owners, token);\n if (!showBalances || !owner) return undefined;\n if (balanceMode === \"sync\" && syncGetBalance) return syncGetBalance(token, owner) ?? undefined;\n return getPayTokenBalance(owner, token.assetId)?.formatted;\n }\n\n function usdOf(token: PayToken) {\n if (!showBalances) return -1;\n return tokenBalanceUsd(token, balanceOf(token));\n }\n\n function loadingOf(token: PayToken) {\n if (!showBalances) return false;\n const owner = ownerForToken(owners, token);\n if (!owner) return false;\n const formatted = balanceOf(token);\n if (formatted != null && formatted !== \"\") return false;\n if (balanceMode === \"sync\") return syncIsBalanceLoading?.(token, owner) ?? false;\n const entry = getPayTokenBalance(owner, token.assetId);\n return !entry || entry.status === \"loading\";\n }\n\n const availableChains = useMemo(() => chainsFromTokens(scopedTokens), [scopedTokens]);\n\n const fundedBlockchains = useMemo(() => {\n const funded = new Set<string>();\n if (!showBalances) return funded;\n for (const chain of availableChains) {\n if (chainHasBalance(chain.blockchain, scopedTokens, (token) => balanceOf(token))) {\n funded.add(chain.blockchain);\n }\n }\n return funded;\n }, [availableChains, owners, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n const railChains = useMemo(() => {\n if (!payer) return sortChainsAlpha(availableChains);\n const connected = payerRailChains(availableChains, owners, fundedBlockchains);\n return sortChainsForSidebar(connected, scopedTokens, {\n showBalances,\n getBalanceUsd: (token) => tokenBalanceUsd(token, balanceOf(token)),\n });\n }, [payer, availableChains, owners, fundedBlockchains, scopedTokens, showBalances, balanceEntries, balanceMode, syncGetBalance]);\n\n const networkChains = useMemo(() => sortChainsAlpha(availableChains), [availableChains]);\n\n useEffect(() => {\n if (!open || !payer || lockChainKind) return;\n setView((current) => {\n if (current.kind === \"wallet\" && !walletConnected) return { kind: \"networks\" };\n if (current.kind === \"rail-chain\" && !railChains.some((chain) => chain.blockchain === current.blockchain)) {\n return walletConnected ? { kind: \"wallet\" } : { kind: \"networks\" };\n }\n return current;\n });\n }, [open, payer, lockChainKind, walletConnected, railChains]);\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 searching = search.trim().length > 0;\n\n const sections = useMemo((): TokenListSection[] => {\n if (view.kind === \"wallet\") {\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 if (view.kind === \"all\") {\n const next: TokenListSection[] = [];\n if (popularTokens.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popularTokens });\n }\n const sorted = scopedTokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n next.push({ id: \"all\", tokens: sorted });\n return next;\n }\n\n if (view.kind === \"rail-chain\" || view.kind === \"network-chain\") {\n const matched = scopedTokens.filter((token) => token.blockchain === view.blockchain);\n if (!payer) {\n const next: TokenListSection[] = [];\n const popular = popularTokens.filter((token) => token.blockchain === view.blockchain);\n if (popular.length > 0) {\n next.push({ id: \"popular\", title: POPULAR_SECTION_TITLE, tokens: popular });\n }\n next.push({\n id: view.blockchain,\n tokens: matched.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols)),\n });\n return next;\n }\n const chain = chainByCode(availableChains, view.blockchain);\n return [{\n id: view.blockchain,\n tokens: sortTokensForChain(matched, {\n withBalances: Boolean(chain && owners[chain.chainKind]),\n usdOf,\n loadingOf,\n stableSymbols,\n }),\n badgeAssetId: newestAssetId,\n }];\n }\n\n return [];\n }, [\n view,\n payer,\n scopedTokens,\n prefs.recentAssetIds,\n newestAssetId,\n balanceEntries,\n owners,\n popularTokens,\n availableChains,\n stableSymbols,\n balanceMode,\n syncGetBalance,\n syncIsBalanceLoading,\n ]);\n\n const searchGroups = useMemo(() => {\n if (!searching) return [];\n return groupSearchResults(scopedTokens, search, {\n role: payer ? \"payer\" : \"receiver\",\n usdOf,\n loadingOf,\n hasOwner: (kind) => Boolean(owners[kind]),\n stableSymbols,\n });\n }, [searching, scopedTokens, search, payer, owners, stableSymbols, balanceEntries, balanceMode, syncGetBalance, syncIsBalanceLoading]);\n\n function handleSelectChain(blockchain: string, fromNetworks: boolean) {\n setLastBlockchain(blockchain);\n if (fromNetworks) {\n savedNetworksScroll.current = networksScrollRef.current?.scrollTop ?? 0;\n setSlideDirection(1);\n setView({ kind: \"network-chain\", blockchain });\n return;\n }\n setView({ kind: \"rail-chain\", blockchain });\n }\n\n function handleBackToNetworks() {\n setSlideDirection(-1);\n setView({ kind: \"networks\" });\n }\n\n useLayoutEffect(() => {\n if (view.kind !== \"networks\" || slideDirection !== -1) return;\n const node = networksScrollRef.current;\n if (!node) return;\n node.scrollTop = savedNetworksScroll.current;\n }, [view, slideDirection]);\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 activeChain = view.kind === \"rail-chain\" || view.kind === \"network-chain\"\n ? chainByCode(availableChains, view.blockchain)\n : undefined;\n const chainHeader: TokenPaneHeader | null = view.kind === \"network-chain\"\n ? { kind: \"back\", title: activeChain?.chainName ?? view.blockchain, onBack: handleBackToNetworks, walletKind: activeChain?.chainKind }\n : view.kind === \"rail-chain\"\n ? { kind: \"chain\", title: activeChain?.chainName ?? view.blockchain, walletKind: activeChain?.chainKind }\n : null;\n\n const awaitingBalances = showBalances\n && sections.every((section) => section.tokens.length === 0)\n && scopedTokens.some((token) => loadingOf(token));\n const tokenDisabled = (token: PayToken) => (\n isBlockchainDisabled(token.blockchain, disabledBlockchains)\n || isChainKindLocked(token.chain.chainKind, lockChainKind)\n );\n const sliding = view.kind === \"networks\" || view.kind === \"network-chain\";\n\n const tokenPane = (\n <TokenPane\n sections={sections}\n header={chainHeader}\n selectedAssetId={selectedAssetId}\n loading={loading || awaitingBalances}\n showBalances={showBalances}\n showWalletStatus={payer}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={handleSelectToken}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n />\n );\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 headerClassName={cx(\"h-14 border-b border-[#e3e3e3] px-[22px] pr-4\", headerClassName)}\n closeClassName={cx(\"md:ml-0\", closeClassName)}\n contentClassName={cx(\"overflow-hidden\", contentClassName)}\n headerAction={(\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 )}\n cardClassName={cx(\n \"w-full max-h-[90vh] gap-0 rounded-[12px] border border-[#e0e0e0] bg-[#fdfdfd] p-0 shadow-[0_0_40px_0_rgba(0,0,0,0.06)] md:w-[474px] md:rounded-[12px] md:p-0\",\n className,\n )}\n >\n <div className=\"flex h-[min(520px,62vh)] min-h-0 flex-col overflow-hidden md:h-[min(555px,70vh)]\">\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder=\"search or paste address\"\n className=\"mb-3 shrink-0 px-[22px] md:hidden\"\n inputClassName={cx(SEARCH_INPUT_CLASS, searchClassName)}\n />\n <div className=\"flex min-h-0 flex-1\">\n <NetworkRail\n role={payer ? \"payer\" : \"receiver\"}\n walletConnected={walletConnected}\n selection={railSelection(view)}\n chains={railChains}\n fundedBlockchains={fundedBlockchains}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n onSelectWallet={() => setView({ kind: \"wallet\" })}\n onSelectAll={() => setView({ kind: \"all\" })}\n onSelectNetworks={() => setView({ kind: \"networks\" })}\n onSelectChain={(blockchain) => handleSelectChain(blockchain, false)}\n className={railClassName}\n />\n {searching ? (\n <SearchResults\n groups={searchGroups}\n selectedAssetId={selectedAssetId}\n loading={loading}\n showBalances={showBalances}\n showWalletStatus={payer}\n getBalance={balanceOf}\n isBalanceLoading={loadingOf}\n onSelectToken={handleSelectToken}\n isTokenDisabled={tokenDisabled}\n rowClassName={rowClassName}\n />\n ) : sliding ? (\n <PaneTransition\n paneKey={view.kind === \"network-chain\" ? `network-chain:${view.blockchain}` : \"networks\"}\n direction={slideDirection}\n >\n {view.kind === \"networks\" ? (\n <ChainPane\n chains={networkChains}\n showWalletStatus={payer}\n onSelectChain={(blockchain) => handleSelectChain(blockchain, true)}\n lockChainKind={lockChainKind}\n disabledBlockchains={disabledBlockchains}\n disabledReason={disabledReason}\n scrollRef={networksScrollRef}\n />\n ) : tokenPane}\n </PaneTransition>\n ) : (\n <div className=\"relative min-h-0 flex-1\">{tokenPane}</div>\n )}\n </div>\n </div>\n </Dialog>\n );\n}\n","import type { ReactNode, Ref } from \"react\";\nimport { IconChevron } from \"@stableflow/pay-ui/icons/chevron\";\nimport { Tooltip } from \"@stableflow/pay-ui/tooltip\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { usePayWidgets } from \"./context\";\nimport { chainKindLabel, cx, fontSans, thinScrollbar } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type ChainPaneProps = {\n chains: SidebarChain[];\n showWalletStatus?: boolean;\n onSelectChain: (blockchain: string) => void;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n scrollRef?: Ref<HTMLDivElement>;\n};\n\nfunction lockReason(lockChainKind: ChainKind, labels: Record<string, string>): string {\n return `Recipient address is on ${chainKindLabel(lockChainKind, labels)}; edit the recipient to change chain`;\n}\n\nexport function ChainPane(props: ChainPaneProps) {\n const {\n chains,\n showWalletStatus = true,\n onSelectChain,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n scrollRef,\n } = props;\n const { chainKindLabels } = usePayWidgets();\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 h-full min-h-0 flex-col\">\n <div ref={scrollRef} className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-2.5 pt-[17px] pb-3\">\n <p className={cx(\"px-3.5 text-sm font-medium text-[#aaa]\", fontSans)}>All Networks</p>\n <div className=\"mt-1\">\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, chainKindLabels)\n : undefined;\n return (\n <div\n key={chain.blockchain}\n className={cx(\n \"flex h-[66px] w-full items-center gap-4 rounded-[12px] px-3.5\",\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 onSelectChain(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 <img src={chain.logo} alt=\"\" className=\"size-8 shrink-0 object-cover\" />\n <span className={cx(\"truncate text-sm font-medium text-black\", fontSans)}>{chain.chainName}</span>\n </button>,\n )}\n {showWalletStatus ? <ChainWalletStatus kind={chain.chainKind} /> : <span className=\"min-w-0 flex-1\" />}\n <button\n type=\"button\"\n aria-label={`Open ${chain.chainName}`}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onSelectChain(chain.blockchain);\n }}\n className={cx(\n \"inline-flex shrink-0 border-0 bg-transparent p-0 text-[#606060]\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <IconChevron />\n </button>\n </div>\n );\n })}\n </div>\n </div>\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 { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CHAIN_KIND_LABELS } from \"./config\";\n\n/** Host-independent sans stack. Underscores in the arbitrary value become spaces. */\nexport const fontSans = \"[font-family:Montserrat,PingFang_SC,system-ui,sans-serif]\";\n\nexport const thinScrollbar = \"[&::-webkit-scrollbar]:w-[4px] [&::-webkit-scrollbar-thumb]:rounded-[12px] [&::-webkit-scrollbar-thumb]:bg-[#d9d9d9] [&::-webkit-scrollbar-track]:bg-transparent supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] [scrollbar-color:#d9d9d9_transparent]\";\n\nexport function cx(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function formatAddress(address: string | null | undefined, prefix = 4, suffix = 5): string {\n if (!address) return \"\";\n if (!address.startsWith(\"0x\") && address.length <= 32) return address;\n if (address.length <= prefix + suffix) return address;\n return `${address.slice(0, prefix)}...${address.slice(-suffix)}`;\n}\n\nexport function chainKindLabel(kind: string, labels?: Record<string, string>): string {\n return labels?.[kind] ?? CHAIN_KIND_LABELS[kind] ?? kind;\n}\n\n/** Truncate a decimal string toward zero and group the integer part. */\nexport function formatDisplayAmount(\n value: string | number,\n options: { maxDecimals?: number; prefix?: string; showDust?: boolean } = {},\n): string {\n const maxDecimals = options.maxDecimals ?? 2;\n const prefix = options.prefix ?? \"\";\n const text = String(value).trim();\n const negative = text.startsWith(\"-\");\n const unsigned = negative ? text.slice(1) : text;\n if (!/^\\d+(\\.\\d+)?$/.test(unsigned)) return `${prefix}0`;\n\n const numeric = Number(unsigned);\n const minUnit = 10 ** -maxDecimals;\n if (options.showDust && numeric > 0 && numeric < minUnit) {\n const dust = `<${minUnit.toFixed(maxDecimals)}`;\n return prefix ? `${prefix} ${dust}` : dust;\n }\n\n const [intPart, fracPart = \"\"] = unsigned.split(\".\");\n const fraction = fracPart.slice(0, maxDecimals).replace(/0+$/, \"\");\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n const body = fraction.length > 0 ? `${grouped}.${fraction}` : grouped;\n return `${prefix}${negative ? \"-\" : \"\"}${body}`;\n}\n","import { ALL_CHAIN_FILTER, DEFAULT_STABLE_SYMBOLS } from \"./config\";\nimport type { ChainKind, PayChain, PayToken, PopularTokenRef } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type SidebarChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n logo: string;\n};\n\nexport function chainsFromTokens(tokens: readonly { blockchain: string; chain: PayChain }[]): PayChain[] {\n const byCode = new Map<string, PayChain>();\n for (const token of tokens) {\n const code = token.chain.blockchain || token.blockchain;\n if (!byCode.has(code)) byCode.set(code, token.chain);\n }\n return Array.from(byCode.values());\n}\n\n/** USD value of a token balance using config `price`. Unknown balance is -1 (sort last). */\nexport function tokenBalanceUsd(\n token: Pick<PayToken, \"price\">,\n formatted: string | null | undefined,\n): number {\n if (formatted == null || formatted === \"\") return -1;\n const amount = Number(formatted);\n if (!Number.isFinite(amount)) return -1;\n const price = Number(token.price);\n return amount * (Number.isFinite(price) ? price : 0);\n}\n\nexport function tokenMatchesSearch(\n token: Pick<PayToken, \"symbol\" | \"providerSymbol\"> & { contractAddress?: string | null },\n query: string,\n): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n if (token.symbol.toLowerCase().includes(q)) return true;\n if (token.providerSymbol.toLowerCase().includes(q)) return true;\n return Boolean(token.contractAddress?.toLowerCase().includes(q));\n}\n\nexport function matchesChainFilter(token: Pick<PayToken, \"blockchain\">, chainFilter: string): boolean {\n if (chainFilter === ALL_CHAIN_FILTER) return true;\n return token.blockchain === chainFilter;\n}\n\nexport function formattedBalancePositive(formatted: string | null | undefined): boolean {\n if (formatted == null || formatted === \"\") return false;\n const amount = Number(formatted);\n return Number.isFinite(amount) && amount > 0;\n}\n\nexport function chainHasBalance<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalance: (token: T) => string | null | undefined,\n): boolean {\n return tokens.some(\n (token) => token.blockchain === blockchain && formattedBalancePositive(getBalance(token)),\n );\n}\n\nexport function chainBalanceUsd<T extends Pick<PayToken, \"blockchain\">>(\n blockchain: string,\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): number {\n let total = 0;\n for (const token of tokens) {\n if (token.blockchain !== blockchain) continue;\n const usd = getBalanceUsd(token);\n if (usd > 0) total += usd;\n }\n return total;\n}\n\nexport 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\nexport function sortChainsAlpha<T extends { chainName: string }>(chains: readonly T[]): T[] {\n return chains.slice().sort((left, right) => left.chainName.localeCompare(right.chainName));\n}\n\n/** Funded chains first by total USD, then chain name. Hidden balances keep the incoming order. */\nexport function sortChainsForSidebar<T extends Pick<PayToken, \"blockchain\">>(\n chains: SidebarChain[],\n tokens: T[],\n options: {\n showBalances: boolean;\n getBalanceUsd: (token: T) => number;\n },\n): SidebarChain[] {\n if (!options.showBalances) return chains.slice();\n return chains.slice().sort((left, right) => {\n const leftUsd = chainBalanceUsd(left.blockchain, tokens, options.getBalanceUsd);\n const rightUsd = chainBalanceUsd(right.blockchain, tokens, options.getBalanceUsd);\n if (rightUsd !== leftUsd) return rightUsd - leftUsd;\n return left.chainName.localeCompare(right.chainName);\n });\n}\n\nexport function payerRailChains<T extends { blockchain: string; chainKind: string }>(\n chains: readonly T[],\n owners: Partial<Record<string, string | null | undefined>>,\n fundedSet: ReadonlySet<string>,\n): T[] {\n return chains.filter((chain) => {\n if (!owners[chain.chainKind]) return false;\n if (chain.chainKind === \"evm\" && !fundedSet.has(chain.blockchain)) return false;\n return true;\n });\n}\n\nexport function initialChainFilter(\n lockChainKind: ChainKind | null | undefined,\n recentBlockchains: readonly string[],\n chains: readonly SidebarChain[],\n): string {\n if (!lockChainKind) return ALL_CHAIN_FILTER;\n const matching = chains.filter((chain) => chain.chainKind === lockChainKind);\n if (matching.length === 0) return ALL_CHAIN_FILTER;\n for (const code of recentBlockchains) {\n if (matching.some((chain) => chain.blockchain === code)) return code;\n }\n return matching[0].blockchain;\n}\n\nexport function isBlockchainDisabled(\n blockchain: string,\n disabledBlockchains: string[] | null | undefined,\n): boolean {\n if (!disabledBlockchains?.length) return false;\n const code = blockchain.toLowerCase();\n return disabledBlockchains.some((item) => item.toLowerCase() === code);\n}\n\nexport function isChainKindLocked(\n chainKind: ChainKind,\n lockChainKind: ChainKind | null | undefined,\n): boolean {\n return Boolean(lockChainKind && chainKind !== lockChainKind);\n}\n\nconst BALANCE_RANK_FUNDED = 0;\nconst BALANCE_RANK_LOADING = 1;\nconst BALANCE_RANK_EMPTY = 2;\n\nfunction tokenBalanceRank(usd: number, loading: boolean): number {\n if (loading) return BALANCE_RANK_LOADING;\n if (usd > 0) return BALANCE_RANK_FUNDED;\n return BALANCE_RANK_EMPTY;\n}\n\nexport function compareTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(left: T, right: T): number {\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\n/** Positive USD first, then balances still loading, then zero or unknown. */\nexport function sortTokensByBalance<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n isLoading: (token: T) => boolean,\n): T[] {\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(getBalanceUsd(left), isLoading(left));\n const rightRank = tokenBalanceRank(getBalanceUsd(right), isLoading(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = getBalanceUsd(right) - getBalanceUsd(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensBySymbol(left, right);\n });\n}\n\nexport function sortTokensBySymbol<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(tokens: T[]): T[] {\n return tokens.slice().sort(compareTokensBySymbol);\n}\n\nexport function positiveBalanceTokens<T extends {\n symbol: string;\n chain: { chainName: string };\n}>(\n tokens: T[],\n getBalanceUsd: (token: T) => number,\n): T[] {\n return sortTokensByBalance(\n tokens.filter((token) => getBalanceUsd(token) > 0),\n getBalanceUsd,\n () => false,\n );\n}\n\nexport function isGasToken(token: {\n contractAddress?: string | null;\n symbol: string;\n blockchain: string;\n}): boolean {\n const addr = String(token.contractAddress || \"\").trim().toLowerCase();\n if (!addr || addr === \"native\" || addr === ZERO_ADDRESS) return true;\n return token.blockchain === \"near\" && token.symbol.toUpperCase() === \"NEAR\";\n}\n\nexport function stableSymbolIndex(symbol: string, stableSymbols: readonly string[]): number {\n const upper = symbol.toUpperCase();\n return stableSymbols.findIndex((item) => item.toUpperCase() === upper);\n}\n\nexport function tokenPriority(\n token: { contractAddress?: string | null; symbol: string; blockchain: string },\n stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS,\n): number {\n if (stableSymbolIndex(token.symbol, stableSymbols) >= 0) return 0;\n if (isGasToken(token)) return 1;\n return 2;\n}\n\nexport function compareTokensByPriority<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(left: T, right: T, stableSymbols: readonly string[] = DEFAULT_STABLE_SYMBOLS): number {\n const leftPriority = tokenPriority(left, stableSymbols);\n const rightPriority = tokenPriority(right, stableSymbols);\n if (leftPriority !== rightPriority) return leftPriority - rightPriority;\n if (leftPriority === 0) {\n const leftIndex = stableSymbolIndex(left.symbol, stableSymbols);\n const rightIndex = stableSymbolIndex(right.symbol, stableSymbols);\n if (leftIndex !== rightIndex) return leftIndex - rightIndex;\n }\n return left.symbol.localeCompare(right.symbol) || left.chain.chainName.localeCompare(right.chain.chainName);\n}\n\nexport function sortTokensForChain<T extends {\n symbol: string;\n contractAddress?: string | null;\n blockchain: string;\n chain: { chainName: string };\n}>(\n tokens: readonly T[],\n options: {\n withBalances: boolean;\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n stableSymbols?: readonly string[];\n },\n): T[] {\n const stableSymbols = options.stableSymbols ?? DEFAULT_STABLE_SYMBOLS;\n if (!options.withBalances) {\n return tokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n }\n return tokens.slice().sort((left, right) => {\n const leftRank = tokenBalanceRank(options.usdOf(left), options.loadingOf(left));\n const rightRank = tokenBalanceRank(options.usdOf(right), options.loadingOf(right));\n if (leftRank !== rightRank) return leftRank - rightRank;\n if (leftRank === BALANCE_RANK_FUNDED) {\n const byUsd = options.usdOf(right) - options.usdOf(left);\n if (byUsd !== 0) return byUsd;\n }\n return compareTokensByPriority(left, right, stableSymbols);\n });\n}\n\nconst EVM_SEARCH_GROUP = \"evm\";\nconst EVM_SEARCH_GROUP_NAME = \"EVM-based\";\n\nexport type SearchResultGroup<T> = {\n blockchain: string;\n chainName: string;\n chainKind: string;\n tokens: T[];\n};\n\nexport function groupSearchResults<T extends {\n blockchain: string;\n symbol: string;\n providerSymbol: string;\n contractAddress?: string | null;\n chain: { chainName: string; chainKind: string };\n}>(\n tokens: readonly T[],\n query: string,\n options: {\n role: \"payer\" | \"receiver\";\n usdOf: (token: T) => number;\n loadingOf: (token: T) => boolean;\n hasOwner: (chainKind: string) => boolean;\n stableSymbols?: readonly string[];\n },\n): SearchResultGroup<T>[] {\n const matched = tokens.filter((token) => tokenMatchesSearch(token, query));\n const groups = new Map<string, T[]>();\n for (const token of matched) {\n const key = token.chain.chainKind === EVM_SEARCH_GROUP ? EVM_SEARCH_GROUP : token.blockchain;\n const list = groups.get(key) ?? [];\n list.push(token);\n groups.set(key, list);\n }\n const stableSymbols = options.stableSymbols ?? DEFAULT_STABLE_SYMBOLS;\n const built = Array.from(groups.entries()).map(([key, groupTokens]) => {\n const chain = groupTokens[0].chain;\n const folded = key === EVM_SEARCH_GROUP;\n const sorted = options.role === \"payer\"\n ? sortTokensForChain(groupTokens, {\n withBalances: options.hasOwner(chain.chainKind),\n usdOf: options.usdOf,\n loadingOf: options.loadingOf,\n stableSymbols,\n })\n : groupTokens.slice().sort((left, right) => compareTokensByPriority(left, right, stableSymbols));\n return {\n blockchain: folded ? EVM_SEARCH_GROUP : key,\n chainName: folded ? EVM_SEARCH_GROUP_NAME : chain.chainName,\n chainKind: chain.chainKind,\n tokens: sorted,\n usd: sorted.reduce((total, token) => {\n const usd = options.usdOf(token);\n return usd > 0 ? total + usd : total;\n }, 0),\n };\n });\n built.sort((left, right) => {\n if (options.role === \"payer\" && right.usd !== left.usd) return right.usd - left.usd;\n return left.chainName.localeCompare(right.chainName);\n });\n return built.map(({ blockchain, chainName, chainKind, tokens: groupTokens }) => ({\n blockchain,\n chainName,\n chainKind,\n tokens: groupTokens,\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 { usePayWidgets } from \"./context\";\nimport { chainKindLabel, cx, fontSans, thinScrollbar } from \"./format\";\nimport type { ChainKind } from \"./types\";\nimport { isBlockchainDisabled, isChainKindLocked, type SidebarChain } from \"./utils\";\n\nexport type RailSelection =\n | { kind: \"wallet\" }\n | { kind: \"all\" }\n | { kind: \"networks\" }\n | { kind: \"chain\"; blockchain: string };\n\nexport type NetworkRailProps = {\n role: \"payer\" | \"receiver\";\n walletConnected: boolean;\n selection: RailSelection;\n chains: SidebarChain[];\n fundedBlockchains: ReadonlySet<string>;\n lockChainKind?: ChainKind | null;\n disabledBlockchains?: string[] | null;\n disabledReason?: string;\n onSelectWallet: () => void;\n onSelectAll: () => void;\n onSelectNetworks: () => void;\n onSelectChain: (blockchain: string) => void;\n className?: string;\n};\n\nfunction chipClass(selected: boolean, disabled: boolean) {\n return cx(\n \"relative flex size-[50px] shrink-0 items-center justify-center rounded-[12px] border border-solid\",\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 role,\n walletConnected,\n selection,\n chains,\n fundedBlockchains,\n lockChainKind = null,\n disabledBlockchains = null,\n disabledReason,\n onSelectWallet,\n onSelectAll,\n onSelectNetworks,\n onSelectChain,\n className,\n } = props;\n const { chainKindLabels } = usePayWidgets();\n const payer = role === \"payer\";\n const networksSelected = selection.kind === \"networks\";\n const allSelected = selection.kind === \"all\";\n const walletSelected = selection.kind === \"wallet\";\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 function chainButton(chain: SidebarChain) {\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!, chainKindLabels)}; edit the recipient to change chain`\n : undefined;\n const selected = selection.kind === \"chain\" && selection.blockchain === 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 onSelectChain(chain.blockchain);\n }}\n className={chipClass(selected, disabled)}\n >\n <img src={chain.logo} alt=\"\" className=\"size-8 object-cover\" />\n {fundedBlockchains.has(chain.blockchain) ? (\n <span className=\"absolute top-1 right-1 size-2.5 rounded-full border border-white bg-[#06f]\" />\n ) : null}\n </button>,\n )}\n </span>\n );\n }\n\n return (\n <div className={cx(\"box-border flex h-full w-[76px] shrink-0 flex-col items-center border-r border-[#e3e3e3] pt-3\", className)}>\n {payer && walletConnected ? (\n <button type=\"button\" aria-label=\"Wallet\" onClick={onSelectWallet} className={chipClass(walletSelected, false)}>\n <IconWallet className={walletSelected ? \"size-5 text-[#06f]\" : \"size-5 text-black\"} />\n </button>\n ) : null}\n {payer && !walletConnected ? (\n <button type=\"button\" aria-label=\"All networks\" onClick={onSelectNetworks} className={chipClass(networksSelected, false)}>\n <IconAllNetworks className=\"size-5 text-black\" />\n </button>\n ) : null}\n {!payer ? (\n <button type=\"button\" aria-label=\"All\" onClick={onSelectAll} className={chipClass(allSelected, false)}>\n <span className={cx(\"text-sm font-medium text-black\", fontSans)}>All</span>\n </button>\n ) : null}\n {payer && walletConnected ? (\n <div className={cx(\"mt-3.5 flex min-h-0 w-full flex-1 flex-col items-center gap-3.5 overflow-y-auto\", thinScrollbar)}>\n {chains.map((chain) => chainButton(chain))}\n <div className=\"h-px w-8 shrink-0 bg-[#e3e3e3]\" />\n <button type=\"button\" aria-label=\"All networks\" onClick={onSelectNetworks} className={chipClass(networksSelected, false)}>\n <IconAllNetworks className=\"size-5 text-black\" />\n </button>\n <div className=\"pb-3\" />\n </div>\n ) : null}\n {!payer ? (\n <div className={cx(\"mt-3.5 flex min-h-0 w-full flex-1 flex-col items-center gap-3.5 overflow-y-auto\", thinScrollbar)}>\n {chains.map((chain) => chainButton(chain))}\n <div className=\"pb-3\" />\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\n\nconst EASE: [number, number, number, number] = [0.32, 0.72, 0, 1];\n\nconst variants = {\n enter: (direction: number) => ({ x: direction > 0 ? 24 : -24, opacity: 0 }),\n center: { x: 0, opacity: 1 },\n exit: (direction: number) => ({ x: direction > 0 ? -24 : 24, opacity: 0 }),\n};\n\nexport function PaneTransition(props: { paneKey: string; direction: number; children: ReactNode }) {\n const reduce = useReducedMotion();\n if (reduce) {\n return <div className=\"relative min-h-0 flex-1 overflow-hidden\">{props.children}</div>;\n }\n return (\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n <AnimatePresence initial={false} custom={props.direction}>\n <motion.div\n key={props.paneKey}\n custom={props.direction}\n variants={variants}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{ duration: 0.22, ease: EASE }}\n className=\"absolute inset-0 flex min-h-0 flex-col\"\n >\n {props.children}\n </motion.div>\n </AnimatePresence>\n </div>\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 { IconChevron } from \"@stableflow/pay-ui/icons/chevron\";\nimport { Skeleton } from \"@stableflow/pay-ui/skeleton\";\nimport { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { cx, fontSans, formatDisplayAmount, thinScrollbar } from \"./format\";\nimport { LazyImage } from \"./lazy-image\";\nimport { DEFAULT_TOKEN_LOGO } from \"./logos\";\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 TokenPaneHeader =\n | { kind: \"back\"; title: string; onBack: () => void; walletKind?: ChainKind | null }\n | { kind: \"chain\"; title: string; walletKind?: ChainKind | null };\n\nexport type TokenPaneProps = {\n sections: TokenListSection[];\n selectedAssetId?: string | null;\n loading: boolean;\n showBalances?: boolean;\n showWalletStatus?: boolean;\n header?: TokenPaneHeader | null;\n getBalance: (token: PayToken) => string | null | undefined;\n isBalanceLoading: (token: PayToken) => boolean;\n onSelectToken: (token: PayToken) => void;\n isTokenDisabled?: (token: PayToken) => boolean;\n rowClassName?: string;\n};\n\nexport function TokenPane(props: TokenPaneProps) {\n const {\n sections,\n selectedAssetId,\n loading,\n showBalances = false,\n showWalletStatus = true,\n header = null,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\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 h-full min-h-0 flex-1 flex-col\">\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-2.5 pt-[17px] pb-3\">\n {header ? (\n <ChainListHeader header={header} showWalletStatus={showWalletStatus} />\n ) : null}\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-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-3.5 py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChainListHeader(props: { header: TokenPaneHeader; showWalletStatus: boolean }) {\n const { header, showWalletStatus } = props;\n const walletKind = header.walletKind;\n return (\n <div className=\"mb-1 flex items-center justify-between gap-3 px-3.5\">\n {header.kind === \"back\" ? (\n <button\n type=\"button\"\n onClick={header.onBack}\n className={cx(\"flex min-w-0 cursor-pointer items-center gap-3 border-0 bg-transparent p-0 text-sm font-medium text-[#aaa]\", fontSans)}\n >\n <IconChevron className=\"rotate-180 text-[#aaa]\" />\n <span className=\"truncate\">{header.title}</span>\n </button>\n ) : (\n <p className={cx(\"min-w-0 truncate text-sm font-medium text-[#aaa]\", fontSans)}>{header.title}</p>\n )}\n {showWalletStatus && walletKind ? <ChainWalletStatus kind={walletKind} /> : null}\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 h-[66px] items-center gap-2.5 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\nexport function 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 h-[66px] w-full cursor-pointer items-center justify-between gap-2 rounded-[12px] border-0 bg-transparent px-3.5 text-left hover:bg-[#f6f6f6]\",\n selected && \"bg-[#f6f6f6]\",\n disabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n className,\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <span className=\"relative size-8 shrink-0\">\n <LazyImage\n src={token.logo}\n fallbackSrc={DEFAULT_TOKEN_LOGO}\n className=\"size-8 rounded-[12px] object-cover\"\n />\n <img\n src={token.chain.logo}\n alt=\"\"\n className=\"absolute -right-0.5 -bottom-0.5 size-3.5 rounded-[4px] border border-white object-cover\"\n />\n </span>\n <span className=\"min-w-0\">\n <span className=\"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 font-medium text-black\", fontSans)}>-</span>\n )}\n </span>\n ) : null}\n </button>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useInView } from \"motion/react\";\n\nexport function LazyImage(props: {\n src: string;\n fallbackSrc: string;\n alt?: string;\n className?: string;\n}) {\n const { src, fallbackSrc, alt = \"\", className } = props;\n const ref = useRef<HTMLSpanElement>(null);\n const inView = useInView(ref, { once: true });\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n\n useEffect(() => {\n setFailedSrc(null);\n }, [src]);\n\n const requested = src.trim();\n const useFallback = requested.length === 0 || failedSrc === requested;\n const shown = useFallback ? fallbackSrc : requested;\n\n return (\n <span ref={ref} className=\"block size-full\">\n {inView ? (\n <img\n src={shown}\n alt={alt}\n className={className}\n onError={() => {\n if (!useFallback) setFailedSrc(requested);\n }}\n />\n ) : null}\n </span>\n );\n}\n","const LOGO_HOST = \"https://assets.dapdap.net\";\n\nconst CHAIN_LOGO_ALIAS: Record<string, string> = {\n eth: \"ethereum\",\n ethereum: \"ethereum\",\n base: \"base\",\n arb: \"arbitrum\",\n arbitrum: \"arbitrum\",\n op: \"optimism\",\n optimism: \"optimism\",\n pol: \"polygon\",\n polygon: \"polygon\",\n bsc: \"bsc\",\n avax: \"avalanche\",\n avalanche: \"avalanche\",\n gnosis: \"gnosis\",\n scroll: \"scroll\",\n xlayer: \"xlayer\",\n bera: \"berachain\",\n berachain: \"berachain\",\n near: \"near\",\n sol: \"solana\",\n solana: \"solana\",\n tron: \"tron\",\n zec: \"zcash\",\n zcash: \"zcash\",\n};\n\nexport const DEFAULT_TOKEN_LOGO = `${LOGO_HOST}/tokens/default_icon.png`;\n\nfunction logoPath(path: string): string {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return `${LOGO_HOST}${normalized}`;\n}\n\nexport function chainLogoUrl(blockchainOrNetwork: string): string {\n const key = String(blockchainOrNetwork || \"\").toLowerCase();\n const file = CHAIN_LOGO_ALIAS[key] || key.replace(/\\s+/g, \"\");\n return logoPath(`/stableflow/networks/${file}.png`);\n}\n\nexport function tokenLogoUrl(symbol: string): string {\n const upper = String(symbol || \"\").toUpperCase();\n const file = upper === \"USDT0\" ? \"usdt\" : upper.toLowerCase();\n return logoPath(`/stableflow/tokens/${file}.png`);\n}\n","import { ChainWalletStatus } from \"./chain-wallet-status\";\nimport { cx, fontSans, thinScrollbar } from \"./format\";\nimport { TokenRow } from \"./token-pane\";\nimport type { PayToken } from \"./types\";\nimport type { SearchResultGroup } from \"./utils\";\n\nexport type SearchResultsProps = {\n groups: SearchResultGroup<PayToken>[];\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 rowClassName?: string;\n};\n\nexport function SearchResults(props: SearchResultsProps) {\n const {\n groups,\n selectedAssetId,\n loading,\n showBalances = false,\n showWalletStatus = true,\n getBalance,\n isBalanceLoading,\n onSelectToken,\n isTokenDisabled,\n rowClassName,\n } = props;\n const hasTokens = groups.some((group) => group.tokens.length > 0);\n\n return (\n <div className=\"flex h-full min-h-0 flex-1 flex-col\">\n <div className={cx(\"min-h-0 flex-1 overflow-y-auto\", thinScrollbar)}>\n <div className=\"px-2.5 pt-[17px] pb-3\">\n {groups.map((group) => (\n <section key={group.blockchain} className=\"mb-2\">\n <div className=\"mb-1 flex items-center justify-between gap-2 px-3.5\">\n <p className={cx(\"min-w-0 truncate text-sm font-medium text-[#aaa]\", fontSans)}>{group.chainName}</p>\n {showWalletStatus ? <ChainWalletStatus kind={group.chainKind} /> : null}\n </div>\n {group.tokens.map((token) => (\n <TokenRow\n key={token.assetId}\n token={token}\n selected={token.assetId === selectedAssetId}\n recent={false}\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 ? (\n <p className={cx(\"px-3.5 py-4 text-[13px] text-[#606060]\", fontSans)}>No tokens found</p>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","export type ChainKind = string;\n\nexport const KNOWN_CHAIN_KINDS = [\"evm\", \"near\", \"solana\", \"tron\", \"zec\"] as const;\n\nexport type PayChain = {\n blockchain: string;\n chainName: string;\n chainKind: ChainKind;\n chainId?: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayToken = {\n assetId: string;\n symbol: string;\n providerSymbol: string;\n blockchain: string;\n decimals: number;\n contractAddress: string | null;\n price: number;\n logo: string;\n supportPayment: boolean;\n supportReceive: boolean;\n chain: PayChain;\n};\n\n/** API-shaped payload. Callers can pass this into their own chain registry. */\nexport type PayConfigSource = {\n chains: PayConfigSourceChain[];\n tokens: PayConfigSourceToken[];\n};\n\nexport type PayConfigSourceChain = {\n network: string;\n chainId: string;\n chainName: string;\n logo: string;\n explorer: string;\n};\n\nexport type PayConfigSourceToken = {\n symbol: string;\n network: string;\n decimals: number;\n contractAddress: string;\n price: string;\n supportPayment: boolean;\n supportReceive: boolean;\n};\n\nexport type PopularTokenRef = {\n blockchain: string;\n symbol: string;\n};\n\nexport type WalletAccountInput = {\n address?: string | null;\n icon?: string | null;\n connecting?: boolean;\n /** False inside a Safe App, where the host owns the connection. */\n canDisconnect?: boolean;\n};\n\nexport type PayWallet = {\n accounts: Partial<Record<ChainKind, WalletAccountInput>>;\n connect: (kind: ChainKind) => void | Promise<void>;\n disconnect: (kind: ChainKind) => void | Promise<void>;\n};\n\nexport type BalanceReadSuccess = {\n assetId: string;\n formatted: string;\n /** Integer token units, as a decimal string. */\n raw?: string;\n};\n\nexport type BalanceReadFailure = {\n assetId: string;\n error: string;\n};\n\nexport type BalanceReadResult = BalanceReadSuccess | BalanceReadFailure;\n\nexport type ReadBalances = (batch: {\n owner: string;\n chainKind: ChainKind;\n blockchain: string;\n tokens: PayToken[];\n}) => Promise<BalanceReadResult[]>;\n\nexport type TokenSelectRole = \"payer\" | \"receiver\";\n\nexport type ChainOwners = Partial<Record<string, string>>;\n\n/** Stable identity for the connected owners. Keys are sorted so order does not matter. */\nexport function ownerKey(owners: ChainOwners): string {\n return Object.keys(owners)\n .sort()\n .map((kind) => `${kind}:${owners[kind] ?? \"\"}`)\n .join(\"|\");\n}\n\nexport type TokenBalanceStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n","import { DEFAULT_CHAIN_KINDS } from \"./config\";\nimport { chainLogoUrl, tokenLogoUrl } from \"./logos\";\nimport type { ChainKind, PayChain, PayConfigSource, PayConfigSourceChain, PayConfigSourceToken, PayToken } from \"./types\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst WRAP_NEAR_CONTRACT = \"wrap.near\";\n\ntype ChainKindMap = Partial<Record<string, ChainKind>>;\n\nexport type NormalizePayConfigOptions = {\n chainKinds?: ChainKindMap;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction apiText(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nfunction apiNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction asBoolean(value: unknown, fallback = true): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.trim().toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n return fallback;\n}\n\nfunction mapSourceChain(raw: unknown): PayConfigSourceChain {\n const row = asRecord(raw) ?? {};\n return {\n network: apiText(row.network),\n chainId: apiText(row.chain_id ?? row.chainId),\n chainName: apiText(row.chain_name ?? row.chainName),\n logo: apiText(row.logo),\n explorer: apiText(row.explorer),\n };\n}\n\nfunction mapSourceToken(raw: unknown): PayConfigSourceToken {\n const row = asRecord(raw) ?? {};\n return {\n symbol: apiText(row.symbol),\n network: apiText(row.network),\n decimals: apiNumber(row.decimals) ?? 0,\n contractAddress: apiText(row.contract_address ?? row.contractAddress),\n price: apiText(row.price),\n supportPayment: asBoolean(row.support_payment ?? row.supportPayment),\n supportReceive: asBoolean(row.support_receive ?? row.supportReceive),\n };\n}\n\nfunction configBody(raw: unknown): Record<string, unknown> {\n const row = asRecord(raw) ?? {};\n const data = asRecord(row.data);\n if (typeof row.code === \"number\" && data) return data;\n return row;\n}\n\nexport function mapPayConfigSource(raw: unknown): PayConfigSource {\n const row = configBody(raw);\n const chains = Array.isArray(row.chains) ? row.chains.map(mapSourceChain) : [];\n const tokens = Array.isArray(row.tokens) ? row.tokens.map(mapSourceToken) : [];\n return { chains, tokens };\n}\n\nexport function chainKindFor(network: string, overrides: ChainKindMap = {}): ChainKind | null {\n const key = network.trim().toLowerCase();\n if (!key) return null;\n return overrides[key] ?? DEFAULT_CHAIN_KINDS[key as keyof typeof DEFAULT_CHAIN_KINDS] ?? null;\n}\n\nfunction normalizeSymbol(symbol: string): string | null {\n const upper = symbol.trim().toUpperCase();\n if (!upper) return null;\n if (upper === \"USDT0\") return \"USDT\";\n if (upper === \"WNEAR\") return \"NEAR\";\n return upper;\n}\n\nexport function tokenAssetId(network: string, symbol: string, contractAddress: string | null | undefined): string {\n const addr = String(contractAddress || \"\").trim();\n return `${network}:${symbol}:${addr || \"native\"}`;\n}\n\nfunction isNativeAddress(contractAddress: string | null): boolean {\n const addr = String(contractAddress || \"\").trim();\n if (!addr) return true;\n const lower = addr.toLowerCase();\n return lower === \"native\" || lower === ZERO_ADDRESS;\n}\n\nexport function normalizePayConfig(source: PayConfigSource, options?: NormalizePayConfigOptions): PayToken[] {\n const overrides = options?.chainKinds ?? {};\n const chains: PayChain[] = [];\n for (const chain of source.chains) {\n const chainKind = chainKindFor(chain.network, overrides);\n if (!chainKind || !chain.network) continue;\n chains.push({\n blockchain: chain.network,\n chainName: chain.chainName || chain.network,\n chainKind,\n chainId: chain.chainId || undefined,\n logo: chain.logo || chainLogoUrl(chain.network),\n explorer: chain.explorer,\n });\n }\n const chainByCode = new Map(chains.map((chain) => [chain.blockchain, chain]));\n const tokens: PayToken[] = [];\n for (const token of source.tokens) {\n const chain = chainByCode.get(token.network);\n if (!chain) continue;\n const symbol = normalizeSymbol(token.symbol);\n if (!symbol) continue;\n if (!Number.isInteger(token.decimals) || token.decimals < 0) continue;\n const contractAddress = token.contractAddress.trim() || null;\n tokens.push({\n assetId: tokenAssetId(token.network, symbol, contractAddress),\n symbol,\n providerSymbol: token.symbol,\n blockchain: token.network,\n decimals: token.decimals,\n contractAddress,\n price: Number(token.price || 1),\n logo: tokenLogoUrl(symbol),\n supportPayment: token.supportPayment,\n supportReceive: token.supportReceive,\n chain,\n });\n }\n const hasNearWrap = tokens.some((token) => (\n token.symbol === \"NEAR\" && token.blockchain === \"near\" && token.contractAddress?.toLowerCase() === WRAP_NEAR_CONTRACT\n ));\n if (!hasNearWrap) return tokens;\n return tokens.filter((token) => !(token.symbol === \"NEAR\" && token.blockchain === \"near\" && isNativeAddress(token.contractAddress)));\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","useSyncExternalStore","jsx","jsx","jsxs","Tooltip","jsx","jsxs","Tooltip","jsx","useSyncExternalStore","listeners","emit","subscribe","useSyncExternalStore","IconChevron","useEffect","jsx","jsx","jsxs","IconChevron","jsx","jsxs","ownerKey","jsx","jsxs","prefs","useSyncExternalStore","owners","useState","useRef","useEffect","ownerKey","ZERO_ADDRESS","chainByCode"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stableflow/pay-widgets",
|
|
3
|
-
"version": "0.2.0-beta-
|
|
3
|
+
"version": "0.2.0-beta-90dffc3d2f-20261012",
|
|
4
4
|
"description": "Business widgets for StableFlow Pay. Data comes in through props and callbacks.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"stableflow",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"clsx": "^2.1.1",
|
|
33
33
|
"motion": "^13.0.0",
|
|
34
34
|
"tailwind-merge": "^3.7.0",
|
|
35
|
-
"@stableflow/pay-ui": "0.2.0-beta-
|
|
35
|
+
"@stableflow/pay-ui": "0.2.0-beta-90dffc3d2f-20261012"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/react": "^19.1.9",
|