@swype-org/react-sdk 0.2.364 → 0.2.375

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/index.js CHANGED
@@ -499,6 +499,14 @@ function isVisibleUsdAmountAtTwoDecimals(amount) {
499
499
  function isSelectableDepositSourceAmountUsd(amount, minTransferAmountUsd = DEFAULT_MIN_SEND_AMOUNT_USD) {
500
500
  return Number.isFinite(amount) && amount >= minTransferAmountUsd;
501
501
  }
502
+ function buildNativeUnsupportedEntries(options) {
503
+ return options.map((option) => ({
504
+ tokenSymbol: option.tokenSymbol,
505
+ chainName: option.chainName,
506
+ amount: parseRawBalance(option.rawBalance, option.decimals),
507
+ logoURI: option.logoURI ?? null
508
+ })).filter((entry) => entry.amount > 0);
509
+ }
502
510
  function buildSelectSourceChoices(options, minTransferAmountUsd = DEFAULT_MIN_SEND_AMOUNT_USD) {
503
511
  const chainChoices = [];
504
512
  const chainIndexByName = /* @__PURE__ */ new Map();
@@ -612,6 +620,21 @@ function resolveSelectSourceOption(choices, options, chainName, tokenSymbol, rec
612
620
  ));
613
621
  }
614
622
 
623
+ // src/walletFlow.ts
624
+ var MOBILE_USER_AGENT_PATTERN = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
625
+ function isMobileUserAgent(userAgent) {
626
+ if (!userAgent) {
627
+ return false;
628
+ }
629
+ return MOBILE_USER_AGENT_PATTERN.test(userAgent);
630
+ }
631
+ function shouldUseWalletConnector(options) {
632
+ return options.useWalletConnector ?? !isMobileUserAgent(options.userAgent);
633
+ }
634
+ function resolveCoinbasePreferenceOptions(userAgent) {
635
+ return isMobileUserAgent(userAgent) ? "all" : "eoaOnly";
636
+ }
637
+
615
638
  // src/walletBridge/protocol.ts
616
639
  var BRIDGE_PROTOCOL_VERSION = 1;
617
640
  function parseBridgeMessage(data) {
@@ -977,23 +1000,29 @@ var BLINK_PRIVY_APP_ID = "cmlil87uv004n0ck0blwumwek";
977
1000
  var BLINK_WC_PROJECT_ID = "f6c60234412f94ef9108dc8f67f4362c";
978
1001
  var BLINK_FINGERPRINT_API_KEY = "nr4FvTsZ6M5z2141FqrM";
979
1002
  var BLINK_FINGERPRINT_REGION = "us";
980
- function FingerprintVisitorPing() {
981
- useVisitorData({ immediate: true });
982
- return null;
983
- }
984
1003
  function buildStaticConnectors() {
1004
+ const userAgent = typeof navigator === "undefined" ? null : navigator.userAgent;
985
1005
  return [
986
1006
  // `unstable_shimAsyncInject` covers wallets whose content scripts wire
987
1007
  // up after page load (Phantom, Trust, MetaMask in the iframe).
988
1008
  injected({ unstable_shimAsyncInject: 2e3 }),
989
- // `preference: 'all'` (default) lets the Coinbase Wallet SDK prefer an
990
- // injected provider when one is present. This matters inside Base's
991
- // mobile in-app WebView: with `smartWalletOnly`, the SDK routes signing
992
- // through `keys.coinbase.com`, which in an iOS WKWebView navigates the
993
- // webview itself (full page reload after each signature). With `all`,
994
- // the SDK uses the Base WebView's injected `window.ethereum` directly,
995
- // keeping signing in-process. Desktop/extension users are unaffected.
996
- coinbaseWallet({ appName: "Swype", preference: { options: "all" } })
1009
+ // Coinbase Wallet SDK connection preference is platform-specific
1010
+ // (see `resolveCoinbasePreferenceOptions`):
1011
+ // Desktop → `eoaOnly`: in smart-wallet mode the Base extension hands
1012
+ // the dapp a separate, often-empty smart-wallet account instead of the
1013
+ // user's funded EOA "no assets". `eoaOnly` binds the funded EOA.
1014
+ // Mobile (Base in-app WebView) `all`: signing must use the injected
1015
+ // `window.ethereum`; the SDK path reloads the iOS WKWebView after each
1016
+ // signature.
1017
+ //
1018
+ // Exactly ONE Coinbase connector: two `@coinbase/wallet-sdk` instances in
1019
+ // one page collide on shared `window` listeners + the Communicator (Privy
1020
+ // connector-init timeout, listener leaks, duplicated `client-project-name`
1021
+ // that 400s the connect), so we never register a second one.
1022
+ coinbaseWallet({
1023
+ appName: "Blink",
1024
+ preference: { options: resolveCoinbasePreferenceOptions(userAgent) }
1025
+ })
997
1026
  ];
998
1027
  }
999
1028
  function buildWagmiConfig(bridgedWallets) {
@@ -1079,30 +1108,30 @@ function BlinkProvider({
1079
1108
  );
1080
1109
  return (
1081
1110
  // Outermost wrapper: loads the Fingerprint browser agent once per
1082
- // provider mount, independent of wagmi/privy/query state. Visitor data
1083
- // collection starts here; no hook is exposed yet (see SDK barrel).
1084
- /* @__PURE__ */ jsxs(FingerprintProvider, { apiKey: BLINK_FINGERPRINT_API_KEY, region: BLINK_FINGERPRINT_REGION, children: [
1085
- /* @__PURE__ */ jsx(FingerprintVisitorPing, {}),
1086
- /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsx(WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsx(
1087
- PrivyProvider,
1088
- {
1089
- appId: privyAppId ?? BLINK_PRIVY_APP_ID,
1090
- config: {
1091
- appearance: {
1092
- theme: getThemeBase(theme),
1093
- accentColor: getTheme(theme).accent
1094
- },
1095
- intl: {
1096
- defaultCountry: "US"
1097
- },
1098
- embeddedWallets: {
1099
- showWalletUIs: false
1100
- }
1111
+ // provider mount, independent of wagmi/privy/query state. The agent loads
1112
+ // here (including during the hidden preload warm-up), but identification is
1113
+ // deferred to explicit flow events fired from `BlinkPayment` see
1114
+ // `useFingerprintFlowEvents` so a preload that never opens is never
1115
+ // identified.
1116
+ /* @__PURE__ */ jsx(FingerprintProvider, { apiKey: BLINK_FINGERPRINT_API_KEY, region: BLINK_FINGERPRINT_REGION, children: /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsx(WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsx(
1117
+ PrivyProvider,
1118
+ {
1119
+ appId: privyAppId ?? BLINK_PRIVY_APP_ID,
1120
+ config: {
1121
+ appearance: {
1122
+ theme: getThemeBase(theme),
1123
+ accentColor: getTheme(theme).accent
1101
1124
  },
1102
- children: /* @__PURE__ */ jsx(BlinkContext.Provider, { value, children })
1103
- }
1104
- ) }) })
1105
- ] })
1125
+ intl: {
1126
+ defaultCountry: "US"
1127
+ },
1128
+ embeddedWallets: {
1129
+ showWalletUIs: false
1130
+ }
1131
+ },
1132
+ children: /* @__PURE__ */ jsx(BlinkContext.Provider, { value, children })
1133
+ }
1134
+ ) }) }) })
1106
1135
  );
1107
1136
  }
1108
1137
  function useBlinkConfig() {
@@ -1143,9 +1172,10 @@ function buildTargetMatchers(target) {
1143
1172
  aliases.add("io.metamask");
1144
1173
  }
1145
1174
  if (value === "base" || value === "base account" || value === "base app" || value.includes("coinbase")) {
1146
- aliases.add("base");
1147
1175
  aliases.add("coinbase");
1148
1176
  aliases.add("coinbasewalletsdk");
1177
+ aliases.add("com.coinbase.wallet");
1178
+ aliases.add("baseaccount");
1149
1179
  }
1150
1180
  if (value.includes("trust")) {
1151
1181
  aliases.add("trust");
@@ -1219,19 +1249,70 @@ async function withTimeout(promise, ms, label) {
1219
1249
  if (timer !== void 0) clearTimeout(timer);
1220
1250
  }
1221
1251
  }
1222
- function isReloadingCoinbaseConnector(connector) {
1252
+ function isCoinbaseSdkConnector(connector) {
1223
1253
  if (!connector) return false;
1224
1254
  return connectorMatchesWallet(
1225
1255
  { id: connector.id, name: connector.name ?? "" },
1226
1256
  { wagmiConnectorId: "coinbaseWalletSDK" }
1227
1257
  );
1228
1258
  }
1259
+ var COINBASE_SDK_STORAGE_PREFIXES = ["-CBWSDK", "-walletlink"];
1260
+ var COINBASE_SIGNER_TYPE_STORAGE_KEY = "-CBWSDK:SignerConfigurator:SignerType";
1261
+ function loadCoinbaseSignerType() {
1262
+ if (typeof window === "undefined" || !window.localStorage) return null;
1263
+ try {
1264
+ return window.localStorage.getItem(COINBASE_SIGNER_TYPE_STORAGE_KEY);
1265
+ } catch {
1266
+ return null;
1267
+ }
1268
+ }
1269
+ function clearCoinbaseWalletSdkSession() {
1270
+ if (typeof window === "undefined" || !window.localStorage) return;
1271
+ try {
1272
+ const store = window.localStorage;
1273
+ const keysToRemove = [];
1274
+ for (let i = 0; i < store.length; i += 1) {
1275
+ const key = store.key(i);
1276
+ if (key && COINBASE_SDK_STORAGE_PREFIXES.some((prefix) => key.startsWith(prefix))) {
1277
+ keysToRemove.push(key);
1278
+ }
1279
+ }
1280
+ keysToRemove.forEach((key) => store.removeItem(key));
1281
+ console.info("[blink-sdk][disconnect] cleared Coinbase Wallet SDK session", {
1282
+ clearedKeys: keysToRemove.length
1283
+ });
1284
+ } catch (err) {
1285
+ console.info("[blink-sdk][disconnect] failed to clear Coinbase Wallet SDK session", err);
1286
+ }
1287
+ }
1288
+ function resetWagmiConnectionInMemory(wagmiConfig, connector) {
1289
+ if (!connector) return;
1290
+ try {
1291
+ const target = connector;
1292
+ const connections = [...wagmiConfig.state.connections.values()];
1293
+ const match = connections.find((conn) => {
1294
+ const live2 = conn.connector;
1295
+ if (target.uid && live2.uid) return live2.uid === target.uid;
1296
+ return live2.id === target.id;
1297
+ });
1298
+ const live = match?.connector;
1299
+ if (!live?.emitter) return;
1300
+ live.emitter.emit("disconnect");
1301
+ console.info("[blink-sdk][disconnect] reset wagmi in-memory connection via emitter", {
1302
+ connectorId: live.id
1303
+ });
1304
+ } catch (err) {
1305
+ console.info("[blink-sdk][disconnect] failed to reset wagmi in-memory connection", err);
1306
+ }
1307
+ }
1229
1308
  async function safeDisconnect(wagmiConfig, connector) {
1230
- if (isReloadingCoinbaseConnector(connector)) {
1309
+ if (isCoinbaseSdkConnector(connector)) {
1231
1310
  console.info(
1232
- "[blink-sdk][disconnect] skipping wagmi disconnect for Coinbase WalletLink connector",
1311
+ "[blink-sdk][disconnect] clearing Coinbase Wallet SDK session instead of wagmi disconnect",
1233
1312
  { connectorId: connector?.id }
1234
1313
  );
1314
+ clearCoinbaseWalletSdkSession();
1315
+ resetWagmiConnectionInMemory(wagmiConfig, connector);
1235
1316
  return;
1236
1317
  }
1237
1318
  await disconnect(wagmiConfig, { connector }).catch(() => {
@@ -3885,6 +3966,23 @@ function isUserRejection(msg) {
3885
3966
  const lower = msg.toLowerCase();
3886
3967
  return lower.includes("rejected") || lower.includes("denied");
3887
3968
  }
3969
+ var EmptyConnectionAccountError = class extends Error {
3970
+ constructor(message = "Wallet connected but returned no account address.") {
3971
+ super(message);
3972
+ this.name = "EmptyConnectionAccountError";
3973
+ }
3974
+ };
3975
+ var EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
3976
+ function assertNonEmptyConnectedAddress(address, ctx) {
3977
+ if (typeof address === "string" && EVM_ADDRESS_RE.test(address)) {
3978
+ return;
3979
+ }
3980
+ appendDebug("error", "OPEN_PROVIDER: empty-or-invalid-connected-address", {
3981
+ ...ctx,
3982
+ address: address ?? null
3983
+ });
3984
+ throw new EmptyConnectionAccountError();
3985
+ }
3888
3986
  function requiresExplicitEvmNonce(account) {
3889
3987
  return connectorMatchesWallet(account?.connector, { providerName: "trust" }) || connectorMatchesWallet(account?.connector, { providerName: "phantom" });
3890
3988
  }
@@ -4118,7 +4216,8 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
4118
4216
  accountConnectorId: account.connector?.id ?? null,
4119
4217
  accountConnectorName: account.connector?.name ?? null,
4120
4218
  targetId: targetId ?? null,
4121
- resolvedConnectorId: connector?.id ?? null
4219
+ resolvedConnectorId: connector?.id ?? null,
4220
+ availableConnectorIds: connectors.map((c) => c.id)
4122
4221
  };
4123
4222
  let disconnectedMismatchedConnector = false;
4124
4223
  if (account.isConnected && account.address) {
@@ -4126,6 +4225,7 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
4126
4225
  if (connectorMatchesTarget) {
4127
4226
  const hexChainId2 = account.chainId ? `0x${account.chainId.toString(16)}` : void 0;
4128
4227
  const branch = !targetId ? "early-return-no-target" : "early-return-connector-match";
4228
+ assertNonEmptyConnectedAddress(account.address, { ...logContext, branch });
4129
4229
  console.info("[blink-sdk][open-provider] Skipping connectAsync; wagmi already connected.", {
4130
4230
  ...logContext,
4131
4231
  branch
@@ -4149,6 +4249,20 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
4149
4249
  disconnectedMismatchedConnector = true;
4150
4250
  }
4151
4251
  if (!disconnectedMismatchedConnector) {
4252
+ const targetIsCoinbase = connectorMatchesWallet(connector, {
4253
+ wagmiConnectorId: "coinbaseWalletSDK"
4254
+ });
4255
+ const isDesktopUa = !isMobileUserAgent(
4256
+ typeof navigator === "undefined" ? null : navigator.userAgent
4257
+ );
4258
+ if (targetIsCoinbase && isDesktopUa && loadCoinbaseSignerType() === "scw") {
4259
+ console.info(
4260
+ "[blink-sdk][open-provider] Clearing stale Coinbase Smart Wallet (scw) session before reconnect so eoaOnly binds the EOA.",
4261
+ logContext
4262
+ );
4263
+ appendDebug("info", "OPEN_PROVIDER: clearing stale scw session before reconnect", logContext);
4264
+ clearCoinbaseWalletSdkSession();
4265
+ }
4152
4266
  console.info("[blink-sdk][open-provider] Attempting silent reconnect.", logContext);
4153
4267
  appendDebug("info", "OPEN_PROVIDER: attempting silent reconnect", logContext);
4154
4268
  const reconnections = await reconnect(wagmiConfig).catch(() => []);
@@ -4163,6 +4277,7 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
4163
4277
  reconnectedConnectorId: reconnectedAccount.connector?.id ?? null,
4164
4278
  reconnectionCount: reconnections.length
4165
4279
  };
4280
+ assertNonEmptyConnectedAddress(reconnectedAccount.address, reconnectLogContext);
4166
4281
  console.info(
4167
4282
  "[blink-sdk][open-provider] Silent reconnect succeeded; skipping connectAsync.",
4168
4283
  reconnectLogContext
@@ -4230,6 +4345,10 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
4230
4345
  });
4231
4346
  const result = await connectAsync({ connector });
4232
4347
  const hexChainId = `0x${result.chainId.toString(16)}`;
4348
+ assertNonEmptyConnectedAddress(result.accounts[0], {
4349
+ ...logContext,
4350
+ branch: "connectAsync-result"
4351
+ });
4233
4352
  return actionSuccess(
4234
4353
  action,
4235
4354
  `Connected to ${connector.name}. Account: ${result.accounts[0]}, Chain: ${hexChainId}`,
@@ -4237,15 +4356,23 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
4237
4356
  );
4238
4357
  } catch (err) {
4239
4358
  const msg = err instanceof Error ? err.message : "Failed to connect wallet";
4240
- if (options?.externalAuthorizationAvailable && isUserRejection(msg) && action.metadata?.chainFamily !== "svm") {
4241
- appendDebug("info", "OPEN_PROVIDER: user-rejection-soft-halt", {
4359
+ const emptyAccount = err instanceof EmptyConnectionAccountError;
4360
+ if (options?.externalAuthorizationAvailable && (isUserRejection(msg) || emptyAccount) && action.metadata?.chainFamily !== "svm") {
4361
+ appendDebug("info", "OPEN_PROVIDER: soft-halt", {
4242
4362
  actionId: action.id,
4243
- externalAuthorizationAvailable: true
4363
+ externalAuthorizationAvailable: true,
4364
+ reason: emptyAccount ? "empty-account" : "user-rejection"
4244
4365
  });
4245
4366
  return actionPending(
4246
4367
  action,
4247
4368
  "awaiting-external-authorization",
4248
- "Wallet connection prompt dismissed \u2014 awaiting completion via cross-device authorization."
4369
+ emptyAccount ? "Wallet returned no account \u2014 awaiting completion via cross-device authorization." : "Wallet connection prompt dismissed \u2014 awaiting completion via cross-device authorization."
4370
+ );
4371
+ }
4372
+ if (emptyAccount) {
4373
+ return actionError(
4374
+ action,
4375
+ "We couldn't read an address from that wallet. Please reconnect and make sure an account is selected."
4249
4376
  );
4250
4377
  }
4251
4378
  if (action.metadata?.chainFamily === "svm") {
@@ -6951,18 +7078,6 @@ function updateTrackedSession(sessions, ownerSessionId, reportedSession, actionS
6951
7078
  }
6952
7079
  }
6953
7080
 
6954
- // src/walletFlow.ts
6955
- var MOBILE_USER_AGENT_PATTERN = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
6956
- function isMobileUserAgent(userAgent) {
6957
- if (!userAgent) {
6958
- return false;
6959
- }
6960
- return MOBILE_USER_AGENT_PATTERN.test(userAgent);
6961
- }
6962
- function shouldUseWalletConnector(options) {
6963
- return options.useWalletConnector ?? !isMobileUserAgent(options.userAgent);
6964
- }
6965
-
6966
7081
  // src/enterAmountInput.ts
6967
7082
  var MAX_FRACTION_DIGITS = 2;
6968
7083
  function isDigit(value) {
@@ -8562,6 +8677,52 @@ var buttonStyle = (color, hovered) => ({
8562
8677
  flexShrink: 0,
8563
8678
  transition: "background 0.15s ease"
8564
8679
  });
8680
+ var INTERCOM_HELP_URL = "https://intercom.help/blinkcash/en/";
8681
+ var TERMS_URL = "https://blink.cash/terms";
8682
+ function SupportFooter() {
8683
+ const { tokens } = useBlinkConfig();
8684
+ return /* @__PURE__ */ jsxs("div", { style: containerStyle2(tokens.textMuted), children: [
8685
+ /* @__PURE__ */ jsx(
8686
+ "a",
8687
+ {
8688
+ href: INTERCOM_HELP_URL,
8689
+ target: "_blank",
8690
+ rel: "noopener noreferrer",
8691
+ style: linkStyle(tokens.textMuted),
8692
+ children: "Help"
8693
+ }
8694
+ ),
8695
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: dotStyle(tokens.textTertiary), children: "\u2022" }),
8696
+ /* @__PURE__ */ jsx(
8697
+ "a",
8698
+ {
8699
+ href: TERMS_URL,
8700
+ target: "_blank",
8701
+ rel: "noopener noreferrer",
8702
+ style: linkStyle(tokens.textMuted),
8703
+ children: "Terms"
8704
+ }
8705
+ )
8706
+ ] });
8707
+ }
8708
+ var containerStyle2 = (color) => ({
8709
+ display: "flex",
8710
+ alignItems: "center",
8711
+ justifyContent: "center",
8712
+ gap: 10,
8713
+ fontSize: "0.8rem",
8714
+ color,
8715
+ padding: "4px 0"
8716
+ });
8717
+ var linkStyle = (color) => ({
8718
+ color,
8719
+ fontWeight: 500,
8720
+ textDecoration: "none"
8721
+ });
8722
+ var dotStyle = (color) => ({
8723
+ color,
8724
+ fontSize: "0.8rem"
8725
+ });
8565
8726
  function SettingsMenu({ onLogout }) {
8566
8727
  const { tokens } = useBlinkConfig();
8567
8728
  const [open, setOpen] = useState(false);
@@ -8577,7 +8738,7 @@ function SettingsMenu({ onLogout }) {
8577
8738
  document.addEventListener("mousedown", handleClickOutside);
8578
8739
  return () => document.removeEventListener("mousedown", handleClickOutside);
8579
8740
  }, [open]);
8580
- return /* @__PURE__ */ jsxs("div", { ref: menuRef, style: containerStyle2, children: [
8741
+ return /* @__PURE__ */ jsxs("div", { ref: menuRef, style: containerStyle3, children: [
8581
8742
  /* @__PURE__ */ jsx(IconButton, { onClick: toggle, "aria-label": "Settings", children: /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", children: [
8582
8743
  /* @__PURE__ */ jsx("circle", { cx: "12", cy: "5", r: "2", fill: "currentColor" }),
8583
8744
  /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "2", fill: "currentColor" }),
@@ -8587,7 +8748,7 @@ function SettingsMenu({ onLogout }) {
8587
8748
  /* @__PURE__ */ jsxs(
8588
8749
  "a",
8589
8750
  {
8590
- href: "https://intercom.help/blinkcash/en/",
8751
+ href: INTERCOM_HELP_URL,
8591
8752
  target: "_blank",
8592
8753
  rel: "noopener noreferrer",
8593
8754
  onClick: () => setOpen(false),
@@ -8624,7 +8785,7 @@ function SettingsMenu({ onLogout }) {
8624
8785
  ] })
8625
8786
  ] });
8626
8787
  }
8627
- var containerStyle2 = {
8788
+ var containerStyle3 = {
8628
8789
  position: "relative"
8629
8790
  };
8630
8791
  var dropdownStyle = (tokens) => ({
@@ -8714,7 +8875,7 @@ var badgeStyle = (color) => ({
8714
8875
  });
8715
8876
  function PoweredByFooter() {
8716
8877
  const { tokens } = useBlinkConfig();
8717
- return /* @__PURE__ */ jsx("div", { style: containerStyle3(tokens.textMuted), children: /* @__PURE__ */ jsxs("div", { style: rowStyle, children: [
8878
+ return /* @__PURE__ */ jsx("div", { style: containerStyle4(tokens.textMuted), children: /* @__PURE__ */ jsxs("div", { style: rowStyle, children: [
8718
8879
  /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx(
8719
8880
  "path",
8720
8881
  {
@@ -8725,7 +8886,7 @@ function PoweredByFooter() {
8725
8886
  /* @__PURE__ */ jsx("span", { children: "Powered by Blink" })
8726
8887
  ] }) });
8727
8888
  }
8728
- var containerStyle3 = (color) => ({
8889
+ var containerStyle4 = (color) => ({
8729
8890
  display: "flex",
8730
8891
  flexDirection: "column",
8731
8892
  alignItems: "center",
@@ -9145,6 +9306,7 @@ var TETHER_LOGO = svgToDataUri(TETHER_SVG);
9145
9306
  var USDH_LOGO = svgToDataUri(USDH_SVG);
9146
9307
  var ETH_LOGO = "https://assets.relay.link/icons/currencies/eth.png";
9147
9308
  var SOL_LOGO = "https://assets.relay.link/icons/currencies/sol.png";
9309
+ var MON_LOGO = "https://assets.relay.link/icons/currencies/mon.png";
9148
9310
  var KNOWN_LOGOS = {
9149
9311
  metamask: METAMASK_LOGO,
9150
9312
  base: BASE_LOGO,
@@ -9162,7 +9324,8 @@ var TOKEN_LOGOS = {
9162
9324
  USDM: USDM_LOGO,
9163
9325
  USDH: USDH_LOGO,
9164
9326
  ETH: ETH_LOGO,
9165
- SOL: SOL_LOGO
9327
+ SOL: SOL_LOGO,
9328
+ MON: MON_LOGO
9166
9329
  };
9167
9330
  var CHAIN_LOGOS = {
9168
9331
  base: BASE_CHAIN_LOGO,
@@ -9435,12 +9598,12 @@ var defaultIcon = /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBo
9435
9598
  ) });
9436
9599
  function InfoBanner({ children, icon }) {
9437
9600
  const { tokens } = useBlinkConfig();
9438
- return /* @__PURE__ */ jsxs("div", { style: containerStyle4(tokens.accent), children: [
9601
+ return /* @__PURE__ */ jsxs("div", { style: containerStyle5(tokens.accent), children: [
9439
9602
  /* @__PURE__ */ jsx("span", { style: iconStyle, children: icon ?? defaultIcon }),
9440
9603
  /* @__PURE__ */ jsx("span", { style: textStyle, children })
9441
9604
  ] });
9442
9605
  }
9443
- var containerStyle4 = (accent) => ({
9606
+ var containerStyle5 = (accent) => ({
9444
9607
  display: "flex",
9445
9608
  alignItems: "flex-start",
9446
9609
  gap: 10,
@@ -9458,7 +9621,7 @@ var iconStyle = {
9458
9621
  };
9459
9622
  var textStyle = { flex: 1 };
9460
9623
  function WarningBanner({ title, children }) {
9461
- return /* @__PURE__ */ jsxs("div", { style: containerStyle5, children: [
9624
+ return /* @__PURE__ */ jsxs("div", { style: containerStyle6, children: [
9462
9625
  /* @__PURE__ */ jsxs("div", { style: headerStyle2, children: [
9463
9626
  /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", style: iconStyle2, children: /* @__PURE__ */ jsx("path", { d: "M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z", fill: "#F57C00" }) }),
9464
9627
  /* @__PURE__ */ jsx("strong", { children: title })
@@ -9466,7 +9629,7 @@ function WarningBanner({ title, children }) {
9466
9629
  /* @__PURE__ */ jsx("div", { style: bodyStyle2, children })
9467
9630
  ] });
9468
9631
  }
9469
- var containerStyle5 = {
9632
+ var containerStyle6 = {
9470
9633
  padding: "14px 16px",
9471
9634
  background: "#FFF8E1",
9472
9635
  border: "1px solid #FFE082",
@@ -9516,7 +9679,7 @@ function NotificationBanner({
9516
9679
  }) {
9517
9680
  const { tokens } = useBlinkConfig();
9518
9681
  const color = variant === "negative" ? NEGATIVE_FG : tokens.text;
9519
- return /* @__PURE__ */ jsxs("div", { style: containerStyle6(tokens.bgRecessed), children: [
9682
+ return /* @__PURE__ */ jsxs("div", { style: containerStyle7(tokens.bgRecessed), children: [
9520
9683
  /* @__PURE__ */ jsx("span", { style: { ...iconWrapStyle2, color }, children: icon ?? defaultIcon2 }),
9521
9684
  /* @__PURE__ */ jsxs("div", { style: { ...textColStyle, color }, children: [
9522
9685
  /* @__PURE__ */ jsx("p", { style: titleStyle3, children: title }),
@@ -9524,7 +9687,7 @@ function NotificationBanner({
9524
9687
  ] })
9525
9688
  ] });
9526
9689
  }
9527
- var containerStyle6 = (bg) => ({
9690
+ var containerStyle7 = (bg) => ({
9528
9691
  display: "flex",
9529
9692
  alignItems: "flex-start",
9530
9693
  gap: 16,
@@ -9619,7 +9782,7 @@ function OtpInput({ value, onChange, length = 6, disabled }) {
9619
9782
  onChange(pasted);
9620
9783
  focusInput(Math.min(pasted.length, length - 1));
9621
9784
  }, [onChange, length, focusInput]);
9622
- return /* @__PURE__ */ jsx("div", { style: containerStyle7, children: digits.map((digit, i) => /* @__PURE__ */ jsx(
9785
+ return /* @__PURE__ */ jsx("div", { style: containerStyle8, children: digits.map((digit, i) => /* @__PURE__ */ jsx(
9623
9786
  "input",
9624
9787
  {
9625
9788
  ref: (el) => {
@@ -9640,7 +9803,7 @@ function OtpInput({ value, onChange, length = 6, disabled }) {
9640
9803
  i
9641
9804
  )) });
9642
9805
  }
9643
- var containerStyle7 = {
9806
+ var containerStyle8 = {
9644
9807
  display: "flex",
9645
9808
  gap: 8,
9646
9809
  justifyContent: "center",
@@ -10187,6 +10350,7 @@ function TokenSourceRow({
10187
10350
  chainName,
10188
10351
  tokenLogoUri,
10189
10352
  balance,
10353
+ balanceLabel,
10190
10354
  selected,
10191
10355
  requiresAuth,
10192
10356
  notSupported,
@@ -10195,9 +10359,10 @@ function TokenSourceRow({
10195
10359
  const { tokens } = useBlinkConfig();
10196
10360
  const [hovered, setHovered] = useState(false);
10197
10361
  const tokenLogo = tokenLogoUri ?? TOKEN_LOGOS[symbol];
10362
+ const balanceText = balanceLabel ?? (balance != null ? `$${formatUsdTwoDecimals2(balance)}` : null);
10198
10363
  const ariaLabel = [
10199
10364
  `${symbol} on ${chainName}`,
10200
- balance != null ? `$${formatUsdTwoDecimals2(balance)} balance` : null,
10365
+ balanceText != null ? `${balanceText} balance` : null,
10201
10366
  requiresAuth ? "authorisation required" : null,
10202
10367
  notSupported ? NOT_SUPPORTED_LABEL.toLowerCase() : null
10203
10368
  ].filter(Boolean).join(", ");
@@ -10231,15 +10396,12 @@ function TokenSourceRow({
10231
10396
  selected && /* @__PURE__ */ jsx(SelectedBadge, { accent: tokens.accent, fill: tokens.textInverse })
10232
10397
  ] }),
10233
10398
  /* @__PURE__ */ jsxs("span", { style: textColStyle2, children: [
10234
- notSupported ? /* @__PURE__ */ jsxs("span", { style: symbolLineStyle, children: [
10235
- /* @__PURE__ */ jsx("span", { style: symbolStyle(tokens.textMuted), children: symbol }),
10236
- /* @__PURE__ */ jsx("span", { style: notSupportedTagStyle(tokens.bgInput, tokens.border, tokens.textMuted), children: NOT_SUPPORTED_BADGE_TEXT })
10237
- ] }) : /* @__PURE__ */ jsx("span", { style: symbolStyle(tokens.text), children: symbol }),
10399
+ /* @__PURE__ */ jsx("span", { style: symbolStyle(notSupported ? tokens.textMuted : tokens.text), children: symbol }),
10238
10400
  /* @__PURE__ */ jsx("span", { style: chainStyle(tokens.textMuted), children: chainName })
10239
10401
  ] }),
10240
- balance != null && /* @__PURE__ */ jsxs("span", { style: balanceStyle2(tokens.textMuted), children: [
10241
- "$",
10242
- formatUsdTwoDecimals2(balance)
10402
+ (balanceText != null || notSupported) && /* @__PURE__ */ jsxs("span", { style: balanceColStyle, children: [
10403
+ balanceText != null && /* @__PURE__ */ jsx("span", { style: balanceStyle2(tokens.textMuted), children: balanceText }),
10404
+ notSupported && /* @__PURE__ */ jsx("span", { style: notSupportedTagStyle(tokens.bgInput, tokens.border, tokens.textMuted), children: NOT_SUPPORTED_BADGE_TEXT })
10243
10405
  ] })
10244
10406
  ]
10245
10407
  }
@@ -10348,11 +10510,12 @@ var balanceStyle2 = (color) => ({
10348
10510
  whiteSpace: "nowrap",
10349
10511
  flexShrink: 0
10350
10512
  });
10351
- var symbolLineStyle = {
10513
+ var balanceColStyle = {
10352
10514
  display: "flex",
10353
- alignItems: "center",
10354
- gap: 6,
10355
- minWidth: 0
10515
+ flexDirection: "column",
10516
+ alignItems: "flex-end",
10517
+ gap: 4,
10518
+ flexShrink: 0
10356
10519
  };
10357
10520
  var notSupportedTagStyle = (bg, borderColor, color) => ({
10358
10521
  fontSize: 11,
@@ -11106,7 +11269,8 @@ function LoginScreen({
11106
11269
  style: secondaryTextStyle(tokens, loading),
11107
11270
  children: secondaryLabel
11108
11271
  }
11109
- )
11272
+ ),
11273
+ /* @__PURE__ */ jsx(SupportFooter, {})
11110
11274
  ] }),
11111
11275
  children: [
11112
11276
  /* @__PURE__ */ jsx(ScreenHeader, { onBack, right: headerRight }),
@@ -11278,7 +11442,7 @@ function DepositOptionsScreen({
11278
11442
  const { tokens, promoTagText } = useBlinkConfig();
11279
11443
  const [manualHovered, setManualHovered] = useState(false);
11280
11444
  const [manualPressed, setManualPressed] = useState(false);
11281
- return /* @__PURE__ */ jsxs(ScreenLayout, { hideScrollbar: true, children: [
11445
+ return /* @__PURE__ */ jsxs(ScreenLayout, { hideScrollbar: true, footer: /* @__PURE__ */ jsx(SupportFooter, {}), children: [
11282
11446
  /* @__PURE__ */ jsx(
11283
11447
  ScreenHeader,
11284
11448
  {
@@ -11433,7 +11597,7 @@ function WelcomeBackScreen({
11433
11597
  const [depositPressed, setDepositPressed] = useState(false);
11434
11598
  const [manualHovered, setManualHovered] = useState(false);
11435
11599
  const [manualPressed, setManualPressed] = useState(false);
11436
- return /* @__PURE__ */ jsxs(ScreenLayout, { children: [
11600
+ return /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(SupportFooter, {}), children: [
11437
11601
  /* @__PURE__ */ jsx(
11438
11602
  ScreenHeader,
11439
11603
  {
@@ -13193,7 +13357,7 @@ function LinkTokensScreen({
13193
13357
  }
13194
13358
  ),
13195
13359
  /* @__PURE__ */ jsxs("div", { style: contentStyle10, children: [
13196
- /* @__PURE__ */ jsx("h2", { style: headingStyle7(t.text), children: "Pick your asset for passkey deposits" }),
13360
+ /* @__PURE__ */ jsx("h2", { style: headingStyle7(t.text), children: "Pick your stablecoin for passkey deposits" }),
13197
13361
  /* @__PURE__ */ jsxs("div", { className: "blink-link-tokens-list", style: listCardStyle(t.bgRecessed), children: [
13198
13362
  showShimmer ? Array.from({ length: SHIMMER_ROWS }).map((_, i) => /* @__PURE__ */ jsxs(
13199
13363
  "div",
@@ -13216,7 +13380,9 @@ function LinkTokensScreen({
13216
13380
  {
13217
13381
  symbol: entry.tokenSymbol,
13218
13382
  chainName: entry.chainName,
13219
- balance: entry.balanceUsd,
13383
+ tokenLogoUri: entry.tokenLogoUri,
13384
+ balance: entry.balanceLabel == null ? entry.balanceUsd : void 0,
13385
+ balanceLabel: entry.balanceLabel,
13220
13386
  selected: i === selectedIndex,
13221
13387
  notSupported: entry.notSupported,
13222
13388
  onClick: () => onSelect(i)
@@ -15146,7 +15312,7 @@ function DepositAddressScreen({
15146
15312
  const waitingForQr = !!depositAddress && !qrReady;
15147
15313
  const awaitingSession = !!selectedOption && !session && !loading;
15148
15314
  const showShimmer = loadingSources || showLoading || waitingForQr || awaitingSession;
15149
- return /* @__PURE__ */ jsxs(ScreenLayout, { children: [
15315
+ return /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(SupportFooter, {}), children: [
15150
15316
  /* @__PURE__ */ jsx(
15151
15317
  ScreenHeader,
15152
15318
  {
@@ -16828,6 +16994,14 @@ var genericStackStyle = {
16828
16994
  gap: 14
16829
16995
  };
16830
16996
 
16997
+ // src/feeFormat.ts
16998
+ function formatNativeAmount(value, maxDecimals = 4) {
16999
+ if (!Number.isFinite(value) || value <= 0) return "0";
17000
+ const rounded = Number(value.toFixed(maxDecimals));
17001
+ if (rounded === 0) return `< ${(10 ** -maxDecimals).toFixed(maxDecimals)}`;
17002
+ return rounded.toLocaleString("en-US", { maximumFractionDigits: maxDecimals }).replace(/,/g, "");
17003
+ }
17004
+
16831
17005
  // src/screenViewModels.ts
16832
17006
  function findSelectedWallet(selectedAccount, selectedWalletId) {
16833
17007
  return selectedAccount?.wallets.find((w) => w.id === selectedWalletId);
@@ -16994,7 +17168,11 @@ function buildLinkTokensScreenProps({
16994
17168
  walletId: rawOption?.walletId,
16995
17169
  tokenAddress: rawOption?.tokenAddress,
16996
17170
  chainId: rawOption?.chainId != null ? Number(rawOption.chainId) : void 0,
16997
- notSupported: false
17171
+ notSupported: false,
17172
+ // Server-provided token logo (token_addresses.logo_uri). The component
17173
+ // falls back to the bundled TOKEN_LOGOS map by symbol, so tokens without
17174
+ // a bundled asset (e.g. CASH) rely on this DB-driven URI.
17175
+ tokenLogoUri: t.logoURI ?? void 0
16998
17176
  };
16999
17177
  })
17000
17178
  );
@@ -17004,19 +17182,32 @@ function buildLinkTokensScreenProps({
17004
17182
  symbol: t.tokenSymbol,
17005
17183
  chainName: chain.chainName,
17006
17184
  balanceUsd: t.balance ?? 0,
17007
- walletId: void 0,
17008
- tokenAddress: void 0,
17009
- chainId: void 0,
17010
- notSupported: true
17185
+ notSupported: true,
17186
+ tokenLogoUri: t.logoURI ?? void 0
17011
17187
  }))
17012
17188
  )
17013
17189
  );
17014
- const entries2 = rowContexts.map(({ symbol, chainName, balanceUsd, notSupported }) => ({
17015
- tokenSymbol: symbol,
17016
- chainName,
17017
- balanceUsd,
17018
- notSupported
17019
- }));
17190
+ rowContexts.push(
17191
+ ...derived.selectSourceNativeChoices.map((native) => ({
17192
+ symbol: native.tokenSymbol,
17193
+ chainName: native.chainName,
17194
+ balanceUsd: 0,
17195
+ notSupported: true,
17196
+ tokenLogoUri: native.logoURI ?? void 0,
17197
+ balanceLabel: `${formatNativeAmount(native.amount)} ${native.tokenSymbol}`
17198
+ }))
17199
+ );
17200
+ const entries2 = rowContexts.map(
17201
+ ({ symbol, chainName, balanceUsd, notSupported, tokenLogoUri, balanceLabel }) => ({
17202
+ tokenSymbol: symbol,
17203
+ chainName,
17204
+ balanceUsd,
17205
+ notSupported,
17206
+ // Only present on native rows — keeps stablecoin / WC entries unchanged.
17207
+ ...tokenLogoUri != null ? { tokenLogoUri } : {},
17208
+ ...balanceLabel != null ? { balanceLabel } : {}
17209
+ })
17210
+ );
17020
17211
  const firstSupportedIndex = rowContexts.findIndex((row) => !row.notSupported);
17021
17212
  const selectedTokenSymbol = flow.state.setupDepositToken?.symbol ?? derived.selectSourceRecommended?.tokenSymbol;
17022
17213
  const selectedChainName = flow.state.setupDepositToken?.chainName ?? derived.selectSourceRecommended?.chainName;
@@ -18019,6 +18210,11 @@ function useSourceSelectionHandlers(_dispatch, orchestrator, options) {
18019
18210
  const unsupportedOptions = pendingSelectSourceAction.metadata?.unsupportedOptions ?? [];
18020
18211
  return buildSelectSourceChoices(unsupportedOptions, minTransferAmountUsd);
18021
18212
  }, [pendingSelectSourceAction, minTransferAmountUsd]);
18213
+ const selectSourceNativeChoices = useMemo(() => {
18214
+ if (!pendingSelectSourceAction) return [];
18215
+ const nativeOptions = pendingSelectSourceAction.metadata?.nativeUnsupportedOptions ?? [];
18216
+ return buildNativeUnsupportedEntries(nativeOptions);
18217
+ }, [pendingSelectSourceAction]);
18022
18218
  const selectSourceRecommended = useMemo(() => {
18023
18219
  if (!pendingSelectSourceAction) return null;
18024
18220
  return pendingSelectSourceAction.metadata?.recommended ?? null;
@@ -18070,6 +18266,7 @@ function useSourceSelectionHandlers(_dispatch, orchestrator, options) {
18070
18266
  setSelectSourceTokenSymbol,
18071
18267
  selectSourceChoices,
18072
18268
  selectSourceUnsupportedChoices,
18269
+ selectSourceNativeChoices,
18073
18270
  selectSourceRecommended,
18074
18271
  selectSourceAvailableBalance,
18075
18272
  handleSelectSourceChainChange,
@@ -20601,6 +20798,33 @@ function usePersistAmountToActiveSession({
20601
20798
  });
20602
20799
  }, [apiBaseUrl, sessionId, effectiveDepositAmount]);
20603
20800
  }
20801
+ function useFingerprintFlowEvents(deps) {
20802
+ const { ready, authenticated, merchantId } = deps;
20803
+ const { getData } = useVisitorData({ immediate: false });
20804
+ const openedSentRef = useRef(false);
20805
+ const authenticatedSentRef = useRef(false);
20806
+ useEffect(() => {
20807
+ if (openedSentRef.current) return;
20808
+ openedSentRef.current = true;
20809
+ void getData({
20810
+ tag: { event: "blink_opened", ...merchantId ? { merchantId } : {} },
20811
+ ...merchantId ? { linkedId: merchantId } : {}
20812
+ }).catch((error) => {
20813
+ console.error("Fingerprint blink_opened event failed", error);
20814
+ });
20815
+ }, [getData, merchantId]);
20816
+ useEffect(() => {
20817
+ if (authenticatedSentRef.current) return;
20818
+ if (!ready || !authenticated) return;
20819
+ authenticatedSentRef.current = true;
20820
+ void getData({
20821
+ tag: { event: "blink_authenticated", ...merchantId ? { merchantId } : {} },
20822
+ ...merchantId ? { linkedId: merchantId } : {}
20823
+ }).catch((error) => {
20824
+ console.error("Fingerprint blink_authenticated event failed", error);
20825
+ });
20826
+ }, [getData, ready, authenticated, merchantId]);
20827
+ }
20604
20828
  var NoMatchingExtensionError = class extends Error {
20605
20829
  constructor() {
20606
20830
  super("No installed EIP-6963 extension matches the selected wallet");
@@ -20639,6 +20863,11 @@ function BlinkPaymentInner({
20639
20863
  return true;
20640
20864
  })();
20641
20865
  const effectiveAuthenticated = authenticated || popupAuthValid;
20866
+ useFingerprintFlowEvents({
20867
+ ready,
20868
+ authenticated: effectiveAuthenticated,
20869
+ merchantId: merchantAuthorization?.merchantId
20870
+ });
20642
20871
  const effectiveGetAccessToken = useCallback(async () => {
20643
20872
  if (popupAuthRef.current) {
20644
20873
  if (isPopupAuthExpired(popupAuthRef.current.accessToken)) {
@@ -21247,6 +21476,7 @@ function BlinkPaymentInner({
21247
21476
  selectedSource: derived.selectedSource,
21248
21477
  selectSourceChoices: sourceSelection.selectSourceChoices,
21249
21478
  selectSourceUnsupportedChoices: sourceSelection.selectSourceUnsupportedChoices,
21479
+ selectSourceNativeChoices: sourceSelection.selectSourceNativeChoices,
21250
21480
  selectSourceRecommended: sourceSelection.selectSourceRecommended,
21251
21481
  selectSourceAvailableBalance: sourceSelection.selectSourceAvailableBalance,
21252
21482
  walletConnectChainIdsByAccount
@@ -21266,6 +21496,6 @@ function BlinkPaymentInner({
21266
21496
  ) });
21267
21497
  }
21268
21498
 
21269
- export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
21499
+ export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, buildNativeUnsupportedEntries, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, formatNativeAmount, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
21270
21500
  //# sourceMappingURL=index.js.map
21271
21501
  //# sourceMappingURL=index.js.map