@swype-org/react-sdk 0.2.297 → 0.2.309

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
@@ -41,6 +41,7 @@ var darkTheme = {
41
41
  accent: "#B2FF93",
42
42
  accentHover: "#8FD974",
43
43
  accentText: "#1B4332",
44
+ highlight: "#B2FF93",
44
45
  success: "#0f9d73",
45
46
  successBg: "#0f2f2a",
46
47
  error: "#d46a72",
@@ -72,6 +73,7 @@ var lightTheme = {
72
73
  accent: "#B2FF93",
73
74
  accentHover: "#8FD974",
74
75
  accentText: "#1B4332",
76
+ highlight: "#B2FF93",
75
77
  success: "#0f9d73",
76
78
  successBg: "#e6f7f1",
77
79
  error: "#ce6670",
@@ -113,6 +115,8 @@ var lightThemeNew = {
113
115
  accent: "#000000",
114
116
  accentHover: "#1a1a1a",
115
117
  accentText: "#fafafa",
118
+ // Figma `accent` token (#eaff03) — the lime "0% FEES" chip.
119
+ highlight: "#eaff03",
116
120
  success: "#0f9d73",
117
121
  successBg: "#e6f7f1",
118
122
  error: "#ce6670",
@@ -517,12 +521,16 @@ function buildSelectSourceChoices(options, minTransferAmountUsd = DEFAULT_MIN_SE
517
521
  } else if (!existing.walletName && option.walletName) {
518
522
  existing.walletName = option.walletName;
519
523
  }
524
+ if (!existing.logoURI && option.logoURI) {
525
+ existing.logoURI = option.logoURI;
526
+ }
520
527
  } else {
521
528
  chainChoice.tokens.push({
522
529
  tokenSymbol,
523
530
  balance,
524
531
  ...option.walletName ? { walletName: option.walletName } : {},
525
- ...option.walletLogoUrl ? { walletLogoUrl: option.walletLogoUrl } : {}
532
+ ...option.walletLogoUrl ? { walletLogoUrl: option.walletLogoUrl } : {},
533
+ ...option.logoURI ? { logoURI: option.logoURI } : {}
526
534
  });
527
535
  }
528
536
  }
@@ -1383,6 +1391,263 @@ async function revokeAndDisconnectActiveWagmiConnector(wagmiConfig) {
1383
1391
  });
1384
1392
  }
1385
1393
 
1394
+ // src/solanaWalletRuntime.ts
1395
+ function asSigner(adapter) {
1396
+ return adapter;
1397
+ }
1398
+ var PHANTOM_SOLANA_CONNECT_TIMEOUT_MESSAGE = "PHANTOM_SOLANA_CONNECT_TIMEOUT";
1399
+ var APPROVE_SPL_CONFIRMATION_TIMEOUT_MESSAGE = "APPROVE_SPL_CONFIRMATION_TIMEOUT";
1400
+ var APPROVE_SPL_ONCHAIN_FAILURE_PREFIX = "Solana transaction failed:";
1401
+ var DEFAULT_CONFIRM_TIMEOUT_MS = 45e3;
1402
+ var DEFAULT_POLL_INTERVAL_MS = 1e3;
1403
+ var DEFAULT_COMMITMENT = "confirmed";
1404
+ var cachedAdapter = null;
1405
+ var cachedProviderKey = null;
1406
+ function providerKey(selection) {
1407
+ const providerName = selection.providerName?.trim();
1408
+ if (!providerName) {
1409
+ throw new Error("Solana wallet metadata is missing providerName.");
1410
+ }
1411
+ return `${selection.providerId ?? ""}:${providerName.toLowerCase()}`;
1412
+ }
1413
+ function assertSupportedProvider(selection) {
1414
+ const name = selection.providerName?.trim().toLowerCase();
1415
+ if (name !== "phantom") {
1416
+ throw new Error(`Unsupported Solana wallet provider: ${selection.providerName ?? "unknown"}.`);
1417
+ }
1418
+ }
1419
+ async function createAdapter(selection) {
1420
+ assertSupportedProvider(selection);
1421
+ const { PhantomWalletAdapter } = await import('@solana/wallet-adapter-phantom');
1422
+ return new PhantomWalletAdapter();
1423
+ }
1424
+ function readPublicKey(adapter) {
1425
+ const publicKey = adapter.publicKey?.toBase58();
1426
+ if (!publicKey) {
1427
+ throw new Error("Solana wallet did not return a public key.");
1428
+ }
1429
+ return publicKey;
1430
+ }
1431
+ async function connectSolanaWallet(selection, options) {
1432
+ const key = providerKey(selection);
1433
+ if (!cachedAdapter || cachedProviderKey !== key) {
1434
+ cachedAdapter = await createAdapter(selection);
1435
+ cachedProviderKey = key;
1436
+ }
1437
+ if (!cachedAdapter.connected) {
1438
+ const adapter = cachedAdapter;
1439
+ const connectPromise = adapter.connect();
1440
+ const timeoutMs = options?.timeoutMs;
1441
+ if (typeof timeoutMs === "number" && timeoutMs > 0) {
1442
+ let timeoutHandle = null;
1443
+ const timeoutPromise = new Promise((_, reject) => {
1444
+ timeoutHandle = setTimeout(() => {
1445
+ reject(new Error(PHANTOM_SOLANA_CONNECT_TIMEOUT_MESSAGE));
1446
+ }, timeoutMs);
1447
+ });
1448
+ try {
1449
+ await Promise.race([connectPromise, timeoutPromise]);
1450
+ } finally {
1451
+ if (timeoutHandle) clearTimeout(timeoutHandle);
1452
+ }
1453
+ } else {
1454
+ await connectPromise;
1455
+ }
1456
+ }
1457
+ return {
1458
+ adapter: cachedAdapter,
1459
+ publicKey: readPublicKey(cachedAdapter)
1460
+ };
1461
+ }
1462
+ async function signSolanaTransaction(selection, unsignedTxBase64, expectedOwnerPubkey) {
1463
+ const { adapter, publicKey } = await connectSolanaWallet(selection);
1464
+ if (publicKey !== expectedOwnerPubkey) {
1465
+ throw new Error(
1466
+ `Connected Solana wallet ${publicKey} does not match the required source wallet ${expectedOwnerPubkey}. Please switch accounts in Phantom and retry.`
1467
+ );
1468
+ }
1469
+ const signer = asSigner(adapter);
1470
+ if (typeof signer.signTransaction !== "function") {
1471
+ throw new Error("Selected Solana wallet does not support transaction signing.");
1472
+ }
1473
+ const transaction = await deserializeTransaction(unsignedTxBase64);
1474
+ const signedTransaction = await signer.signTransaction(transaction);
1475
+ return {
1476
+ ownerPubkey: publicKey,
1477
+ signedTxBase64: bytesToBase64(serializeTransaction(signedTransaction))
1478
+ };
1479
+ }
1480
+ async function deserializeTransaction(unsignedTxBase64) {
1481
+ const { Transaction, VersionedTransaction } = await import('@solana/web3.js');
1482
+ const bytes = base64ToBytes(unsignedTxBase64);
1483
+ try {
1484
+ return Transaction.from(bytes);
1485
+ } catch {
1486
+ return VersionedTransaction.deserialize(bytes);
1487
+ }
1488
+ }
1489
+ function serializeTransaction(transaction) {
1490
+ if ("version" in transaction) {
1491
+ return transaction.serialize();
1492
+ }
1493
+ return transaction.serialize({
1494
+ requireAllSignatures: false,
1495
+ verifySignatures: false
1496
+ });
1497
+ }
1498
+ function base64ToBytes(value) {
1499
+ if (typeof globalThis.atob === "function") {
1500
+ const binary = globalThis.atob(value);
1501
+ const bytes = new Uint8Array(binary.length);
1502
+ for (let i = 0; i < binary.length; i++) {
1503
+ bytes[i] = binary.charCodeAt(i);
1504
+ }
1505
+ return bytes;
1506
+ }
1507
+ const bufferCtor = globalThis.Buffer;
1508
+ if (bufferCtor) {
1509
+ return bufferCtor.from(value, "base64");
1510
+ }
1511
+ throw new Error("Base64 decoding is not available in this environment.");
1512
+ }
1513
+ function bytesToBase64(bytes) {
1514
+ if (typeof globalThis.btoa === "function") {
1515
+ let binary = "";
1516
+ for (const byte of bytes) {
1517
+ binary += String.fromCharCode(byte);
1518
+ }
1519
+ return globalThis.btoa(binary);
1520
+ }
1521
+ const bufferCtor = globalThis.Buffer;
1522
+ if (bufferCtor) {
1523
+ return bufferCtor.from(bytes).toString("base64");
1524
+ }
1525
+ throw new Error("Base64 encoding is not available in this environment.");
1526
+ }
1527
+ async function signAndSendApproveSplViaWallet(params) {
1528
+ const rpcUrl = params.rpcUrl?.trim();
1529
+ if (!rpcUrl) {
1530
+ throw new Error("signAndSendApproveSplViaWallet requires an rpcUrl.");
1531
+ }
1532
+ const unsignedTxBase64 = params.unsignedTxBase64?.trim();
1533
+ if (!unsignedTxBase64) {
1534
+ throw new Error("signAndSendApproveSplViaWallet requires unsignedTxBase64.");
1535
+ }
1536
+ const commitment = params.commitment ?? DEFAULT_COMMITMENT;
1537
+ const { adapter, publicKey } = await connectSolanaWallet(params.selection);
1538
+ if (publicKey !== params.expectedOwnerPubkey) {
1539
+ throw new Error(
1540
+ `Connected Solana wallet ${publicKey} does not match the required source wallet ${params.expectedOwnerPubkey}. Please switch accounts in Phantom and retry.`
1541
+ );
1542
+ }
1543
+ if (!adapter.sendTransaction) {
1544
+ throw new Error("Selected Solana wallet does not support sendTransaction.");
1545
+ }
1546
+ const transaction = await deserializeTransaction(unsignedTxBase64);
1547
+ const connection = await defaultConnectionFactory(rpcUrl, commitment);
1548
+ const signature = await adapter.sendTransaction(
1549
+ transaction,
1550
+ connection,
1551
+ {
1552
+ preflightCommitment: commitment,
1553
+ maxRetries: 3
1554
+ }
1555
+ );
1556
+ return { ownerPubkey: publicKey, signature };
1557
+ }
1558
+ async function confirmApproveSplViaPolling(params) {
1559
+ const rpcUrl = params.rpcUrl?.trim();
1560
+ if (!rpcUrl) {
1561
+ throw new Error("confirmApproveSplViaPolling requires an rpcUrl.");
1562
+ }
1563
+ const signature = params.signature?.trim();
1564
+ if (!signature) {
1565
+ throw new Error("confirmApproveSplViaPolling requires a signature.");
1566
+ }
1567
+ const confirmTimeoutMs = params.confirmTimeoutMs ?? DEFAULT_CONFIRM_TIMEOUT_MS;
1568
+ const pollIntervalMs = params.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
1569
+ const commitment = params.commitment ?? DEFAULT_COMMITMENT;
1570
+ const connection = await defaultConnectionFactory(rpcUrl, commitment);
1571
+ const slot = await pollForConfirmation({
1572
+ connection,
1573
+ signature,
1574
+ confirmTimeoutMs,
1575
+ pollIntervalMs
1576
+ });
1577
+ return { signature, slot };
1578
+ }
1579
+ async function defaultConnectionFactory(rpcUrl, commitment) {
1580
+ const { Connection } = await import('@solana/web3.js');
1581
+ return new Connection(rpcUrl, commitment);
1582
+ }
1583
+ async function pollForConfirmation(args) {
1584
+ const { connection, signature, confirmTimeoutMs, pollIntervalMs } = args;
1585
+ const expiresAt = Date.now() + confirmTimeoutMs;
1586
+ while (Date.now() <= expiresAt) {
1587
+ const result = await connection.getSignatureStatuses(
1588
+ [signature],
1589
+ { searchTransactionHistory: true }
1590
+ );
1591
+ const status = result.value[0];
1592
+ if (status?.err) {
1593
+ throw new Error(`${APPROVE_SPL_ONCHAIN_FAILURE_PREFIX} ${JSON.stringify(status.err)}`);
1594
+ }
1595
+ const confirmationStatus = status?.confirmationStatus;
1596
+ if (confirmationStatus === "confirmed" || confirmationStatus === "finalized") {
1597
+ return status?.slot;
1598
+ }
1599
+ await sleep(pollIntervalMs);
1600
+ }
1601
+ throw new Error(APPROVE_SPL_CONFIRMATION_TIMEOUT_MESSAGE);
1602
+ }
1603
+ function sleep(ms) {
1604
+ return new Promise((resolve) => setTimeout(resolve, ms));
1605
+ }
1606
+ function getInjectedSolanaProvider(windowImpl) {
1607
+ const win = (typeof window === "undefined" ? void 0 : window);
1608
+ if (!win) return null;
1609
+ return win.phantom?.solana ?? win.solana ?? null;
1610
+ }
1611
+ async function disconnectSolanaWallet(windowImpl) {
1612
+ const adapter = cachedAdapter;
1613
+ cachedAdapter = null;
1614
+ cachedProviderKey = null;
1615
+ if (adapter?.connected) {
1616
+ try {
1617
+ console.info("[blink-sdk][solana-disconnect] disconnecting cached adapter");
1618
+ await adapter.disconnect();
1619
+ console.info("[blink-sdk][solana-disconnect] ok (cached adapter)");
1620
+ return;
1621
+ } catch (err) {
1622
+ console.warn("[blink-sdk][solana-disconnect] cached adapter disconnect failed", {
1623
+ message: err instanceof Error ? err.message : String(err)
1624
+ });
1625
+ }
1626
+ }
1627
+ const provider = getInjectedSolanaProvider();
1628
+ if (!provider) {
1629
+ console.info("[blink-sdk][solana-disconnect] no cached adapter and no injected provider \u2014 nothing to disconnect");
1630
+ return;
1631
+ }
1632
+ if (provider.isConnected === false) {
1633
+ console.info("[blink-sdk][solana-disconnect] injected provider already disconnected");
1634
+ return;
1635
+ }
1636
+ if (typeof provider.disconnect !== "function") {
1637
+ console.warn("[blink-sdk][solana-disconnect] injected provider has no disconnect() method");
1638
+ return;
1639
+ }
1640
+ try {
1641
+ console.info("[blink-sdk][solana-disconnect] disconnecting injected provider");
1642
+ await provider.disconnect();
1643
+ console.info("[blink-sdk][solana-disconnect] ok (injected provider)");
1644
+ } catch (err) {
1645
+ console.warn("[blink-sdk][solana-disconnect] injected provider disconnect failed", {
1646
+ message: err instanceof Error ? err.message : String(err)
1647
+ });
1648
+ }
1649
+ }
1650
+
1386
1651
  // src/otherWalletConnect.ts
1387
1652
  function findWalletConnectConnector(connectors) {
1388
1653
  return connectors.find((connector) => {
@@ -1812,6 +2077,7 @@ __export(api_exports, {
1812
2077
  setAuthorizationSessionPaymentIntentAmount: () => setAuthorizationSessionPaymentIntentAmount,
1813
2078
  setAuthorizationSessionProvider: () => setAuthorizationSessionProvider,
1814
2079
  signTransfer: () => signTransfer,
2080
+ updateManualTransferDepositTargetChain: () => updateManualTransferDepositTargetChain,
1815
2081
  updateUserConfig: () => updateUserConfig,
1816
2082
  updateUserConfigBySession: () => updateUserConfigBySession,
1817
2083
  waitForActionTransactionReceipt: () => waitForActionTransactionReceipt
@@ -2210,6 +2476,15 @@ async function fetchManualTransferSession(apiBaseUrl, sessionId) {
2210
2476
  if (!res.ok) await throwApiError(res);
2211
2477
  return await res.json();
2212
2478
  }
2479
+ async function updateManualTransferDepositTargetChain(apiBaseUrl, sessionId, selectedChainId) {
2480
+ const res = await fetch(`${apiBaseUrl}/v1/manual-transfers/${sessionId}`, {
2481
+ method: "PATCH",
2482
+ headers: { "Content-Type": "application/json" },
2483
+ body: JSON.stringify({ selectedChainId })
2484
+ });
2485
+ if (!res.ok) await throwApiError(res);
2486
+ return await res.json();
2487
+ }
2213
2488
  async function refreshManualTransferQuote(apiBaseUrl, sessionId) {
2214
2489
  const res = await fetch(
2215
2490
  `${apiBaseUrl}/v1/manual-transfers/${sessionId}/refresh-quote`,
@@ -2962,7 +3237,7 @@ async function waitForWalletNonceAgreement(params) {
2962
3237
  }
2963
3238
 
2964
3239
  // src/walletCallsStatus.ts
2965
- var DEFAULT_POLL_INTERVAL_MS = 2e3;
3240
+ var DEFAULT_POLL_INTERVAL_MS2 = 2e3;
2966
3241
  var DEFAULT_MAX_ATTEMPTS = 60;
2967
3242
  var DEFAULT_REQUEST_TIMEOUT_MS = 8e3;
2968
3243
  var DEFAULT_MAX_CONSECUTIVE_ERRORS = 5;
@@ -2984,7 +3259,7 @@ function classifyCallsStatus(status) {
2984
3259
  return "pending";
2985
3260
  }
2986
3261
  async function pollWalletCallsStatus(walletClient, callsId, options = {}) {
2987
- const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
3262
+ const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS2;
2988
3263
  const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
2989
3264
  const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
2990
3265
  const maxConsecutiveErrors = options.maxConsecutiveErrors ?? DEFAULT_MAX_CONSECUTIVE_ERRORS;
@@ -3102,219 +3377,6 @@ async function withWatchdog(promise, label, options = {}) {
3102
3377
  }
3103
3378
  }
3104
3379
 
3105
- // src/solanaWalletRuntime.ts
3106
- function asSigner(adapter) {
3107
- return adapter;
3108
- }
3109
- var PHANTOM_SOLANA_CONNECT_TIMEOUT_MESSAGE = "PHANTOM_SOLANA_CONNECT_TIMEOUT";
3110
- var APPROVE_SPL_CONFIRMATION_TIMEOUT_MESSAGE = "APPROVE_SPL_CONFIRMATION_TIMEOUT";
3111
- var APPROVE_SPL_ONCHAIN_FAILURE_PREFIX = "Solana transaction failed:";
3112
- var DEFAULT_CONFIRM_TIMEOUT_MS = 45e3;
3113
- var DEFAULT_POLL_INTERVAL_MS2 = 1e3;
3114
- var DEFAULT_COMMITMENT = "confirmed";
3115
- var cachedAdapter = null;
3116
- var cachedProviderKey = null;
3117
- function providerKey(selection) {
3118
- const providerName = selection.providerName?.trim();
3119
- if (!providerName) {
3120
- throw new Error("Solana wallet metadata is missing providerName.");
3121
- }
3122
- return `${selection.providerId ?? ""}:${providerName.toLowerCase()}`;
3123
- }
3124
- function assertSupportedProvider(selection) {
3125
- const name = selection.providerName?.trim().toLowerCase();
3126
- if (name !== "phantom") {
3127
- throw new Error(`Unsupported Solana wallet provider: ${selection.providerName ?? "unknown"}.`);
3128
- }
3129
- }
3130
- async function createAdapter(selection) {
3131
- assertSupportedProvider(selection);
3132
- const { PhantomWalletAdapter } = await import('@solana/wallet-adapter-phantom');
3133
- return new PhantomWalletAdapter();
3134
- }
3135
- function readPublicKey(adapter) {
3136
- const publicKey = adapter.publicKey?.toBase58();
3137
- if (!publicKey) {
3138
- throw new Error("Solana wallet did not return a public key.");
3139
- }
3140
- return publicKey;
3141
- }
3142
- async function connectSolanaWallet(selection, options) {
3143
- const key = providerKey(selection);
3144
- if (!cachedAdapter || cachedProviderKey !== key) {
3145
- cachedAdapter = await createAdapter(selection);
3146
- cachedProviderKey = key;
3147
- }
3148
- if (!cachedAdapter.connected) {
3149
- const adapter = cachedAdapter;
3150
- const connectPromise = adapter.connect();
3151
- const timeoutMs = options?.timeoutMs;
3152
- if (typeof timeoutMs === "number" && timeoutMs > 0) {
3153
- let timeoutHandle = null;
3154
- const timeoutPromise = new Promise((_, reject) => {
3155
- timeoutHandle = setTimeout(() => {
3156
- reject(new Error(PHANTOM_SOLANA_CONNECT_TIMEOUT_MESSAGE));
3157
- }, timeoutMs);
3158
- });
3159
- try {
3160
- await Promise.race([connectPromise, timeoutPromise]);
3161
- } finally {
3162
- if (timeoutHandle) clearTimeout(timeoutHandle);
3163
- }
3164
- } else {
3165
- await connectPromise;
3166
- }
3167
- }
3168
- return {
3169
- adapter: cachedAdapter,
3170
- publicKey: readPublicKey(cachedAdapter)
3171
- };
3172
- }
3173
- async function signSolanaTransaction(selection, unsignedTxBase64, expectedOwnerPubkey) {
3174
- const { adapter, publicKey } = await connectSolanaWallet(selection);
3175
- if (publicKey !== expectedOwnerPubkey) {
3176
- throw new Error(
3177
- `Connected Solana wallet ${publicKey} does not match the required source wallet ${expectedOwnerPubkey}. Please switch accounts in Phantom and retry.`
3178
- );
3179
- }
3180
- const signer = asSigner(adapter);
3181
- if (typeof signer.signTransaction !== "function") {
3182
- throw new Error("Selected Solana wallet does not support transaction signing.");
3183
- }
3184
- const transaction = await deserializeTransaction(unsignedTxBase64);
3185
- const signedTransaction = await signer.signTransaction(transaction);
3186
- return {
3187
- ownerPubkey: publicKey,
3188
- signedTxBase64: bytesToBase64(serializeTransaction(signedTransaction))
3189
- };
3190
- }
3191
- async function deserializeTransaction(unsignedTxBase64) {
3192
- const { Transaction, VersionedTransaction } = await import('@solana/web3.js');
3193
- const bytes = base64ToBytes(unsignedTxBase64);
3194
- try {
3195
- return Transaction.from(bytes);
3196
- } catch {
3197
- return VersionedTransaction.deserialize(bytes);
3198
- }
3199
- }
3200
- function serializeTransaction(transaction) {
3201
- if ("version" in transaction) {
3202
- return transaction.serialize();
3203
- }
3204
- return transaction.serialize({
3205
- requireAllSignatures: false,
3206
- verifySignatures: false
3207
- });
3208
- }
3209
- function base64ToBytes(value) {
3210
- if (typeof globalThis.atob === "function") {
3211
- const binary = globalThis.atob(value);
3212
- const bytes = new Uint8Array(binary.length);
3213
- for (let i = 0; i < binary.length; i++) {
3214
- bytes[i] = binary.charCodeAt(i);
3215
- }
3216
- return bytes;
3217
- }
3218
- const bufferCtor = globalThis.Buffer;
3219
- if (bufferCtor) {
3220
- return bufferCtor.from(value, "base64");
3221
- }
3222
- throw new Error("Base64 decoding is not available in this environment.");
3223
- }
3224
- function bytesToBase64(bytes) {
3225
- if (typeof globalThis.btoa === "function") {
3226
- let binary = "";
3227
- for (const byte of bytes) {
3228
- binary += String.fromCharCode(byte);
3229
- }
3230
- return globalThis.btoa(binary);
3231
- }
3232
- const bufferCtor = globalThis.Buffer;
3233
- if (bufferCtor) {
3234
- return bufferCtor.from(bytes).toString("base64");
3235
- }
3236
- throw new Error("Base64 encoding is not available in this environment.");
3237
- }
3238
- async function signAndSendApproveSplViaWallet(params) {
3239
- const rpcUrl = params.rpcUrl?.trim();
3240
- if (!rpcUrl) {
3241
- throw new Error("signAndSendApproveSplViaWallet requires an rpcUrl.");
3242
- }
3243
- const unsignedTxBase64 = params.unsignedTxBase64?.trim();
3244
- if (!unsignedTxBase64) {
3245
- throw new Error("signAndSendApproveSplViaWallet requires unsignedTxBase64.");
3246
- }
3247
- const commitment = params.commitment ?? DEFAULT_COMMITMENT;
3248
- const { adapter, publicKey } = await connectSolanaWallet(params.selection);
3249
- if (publicKey !== params.expectedOwnerPubkey) {
3250
- throw new Error(
3251
- `Connected Solana wallet ${publicKey} does not match the required source wallet ${params.expectedOwnerPubkey}. Please switch accounts in Phantom and retry.`
3252
- );
3253
- }
3254
- if (!adapter.sendTransaction) {
3255
- throw new Error("Selected Solana wallet does not support sendTransaction.");
3256
- }
3257
- const transaction = await deserializeTransaction(unsignedTxBase64);
3258
- const connection = await defaultConnectionFactory(rpcUrl, commitment);
3259
- const signature = await adapter.sendTransaction(
3260
- transaction,
3261
- connection,
3262
- {
3263
- preflightCommitment: commitment,
3264
- maxRetries: 3
3265
- }
3266
- );
3267
- return { ownerPubkey: publicKey, signature };
3268
- }
3269
- async function confirmApproveSplViaPolling(params) {
3270
- const rpcUrl = params.rpcUrl?.trim();
3271
- if (!rpcUrl) {
3272
- throw new Error("confirmApproveSplViaPolling requires an rpcUrl.");
3273
- }
3274
- const signature = params.signature?.trim();
3275
- if (!signature) {
3276
- throw new Error("confirmApproveSplViaPolling requires a signature.");
3277
- }
3278
- const confirmTimeoutMs = params.confirmTimeoutMs ?? DEFAULT_CONFIRM_TIMEOUT_MS;
3279
- const pollIntervalMs = params.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS2;
3280
- const commitment = params.commitment ?? DEFAULT_COMMITMENT;
3281
- const connection = await defaultConnectionFactory(rpcUrl, commitment);
3282
- const slot = await pollForConfirmation({
3283
- connection,
3284
- signature,
3285
- confirmTimeoutMs,
3286
- pollIntervalMs
3287
- });
3288
- return { signature, slot };
3289
- }
3290
- async function defaultConnectionFactory(rpcUrl, commitment) {
3291
- const { Connection } = await import('@solana/web3.js');
3292
- return new Connection(rpcUrl, commitment);
3293
- }
3294
- async function pollForConfirmation(args) {
3295
- const { connection, signature, confirmTimeoutMs, pollIntervalMs } = args;
3296
- const expiresAt = Date.now() + confirmTimeoutMs;
3297
- while (Date.now() <= expiresAt) {
3298
- const result = await connection.getSignatureStatuses(
3299
- [signature],
3300
- { searchTransactionHistory: true }
3301
- );
3302
- const status = result.value[0];
3303
- if (status?.err) {
3304
- throw new Error(`${APPROVE_SPL_ONCHAIN_FAILURE_PREFIX} ${JSON.stringify(status.err)}`);
3305
- }
3306
- const confirmationStatus = status?.confirmationStatus;
3307
- if (confirmationStatus === "confirmed" || confirmationStatus === "finalized") {
3308
- return status?.slot;
3309
- }
3310
- await sleep(pollIntervalMs);
3311
- }
3312
- throw new Error(APPROVE_SPL_CONFIRMATION_TIMEOUT_MESSAGE);
3313
- }
3314
- function sleep(ms) {
3315
- return new Promise((resolve) => setTimeout(resolve, ms));
3316
- }
3317
-
3318
3380
  // src/walletConnectRuntime.ts
3319
3381
  var PRIMARY_CHAIN_ID = 8453;
3320
3382
  var OPTIONAL_CHAIN_IDS = [1, 42161, 137, 56, 6342, 10143, 999, 84532];
@@ -6966,6 +7028,7 @@ function useManualTransferSession({
6966
7028
  const completedRef = useRef(/* @__PURE__ */ new Set());
6967
7029
  const premintedFamiliesRef = useRef(/* @__PURE__ */ new Set());
6968
7030
  const inFlightPerTokenRef = useRef(/* @__PURE__ */ new Set());
7031
+ const reportedTargetChainRef = useRef(/* @__PURE__ */ new Map());
6969
7032
  useEffect(() => {
6970
7033
  if (!merchantAuthorization) return;
6971
7034
  let cancelled = false;
@@ -7118,6 +7181,51 @@ function useManualTransferSession({
7118
7181
  }, 2e3);
7119
7182
  return () => window.clearInterval(timer);
7120
7183
  }, [apiBaseUrl, activeSessionId, activeSessionStatus, pollEnabled]);
7184
+ const selectedSourceChainId = selectedOption?.chainId;
7185
+ const sessionRegistrationChainId = session?.source.chainId;
7186
+ useEffect(() => {
7187
+ if (!activeSessionId) return;
7188
+ if (selectedSourceChainId === void 0) return;
7189
+ if (sessionRegistrationChainId === void 0) return;
7190
+ if (!selectedOption) return;
7191
+ if (selectedOption.chainFamily !== "evm") return;
7192
+ if (isSameChainSameTokenSelection(selectedOption, destination)) return;
7193
+ const lastReported = reportedTargetChainRef.current.get(activeSessionId) ?? sessionRegistrationChainId;
7194
+ if (selectedSourceChainId === lastReported) return;
7195
+ reportedTargetChainRef.current.set(activeSessionId, selectedSourceChainId);
7196
+ let cancelled = false;
7197
+ updateManualTransferDepositTargetChain(apiBaseUrl, activeSessionId, selectedSourceChainId).then((updated) => {
7198
+ if (cancelled) return;
7199
+ setSessionsByFamily((prev) => {
7200
+ for (const family of Object.keys(prev)) {
7201
+ if (prev[family]?.sessionId === updated.sessionId) {
7202
+ return { ...prev, [family]: updated };
7203
+ }
7204
+ }
7205
+ return prev;
7206
+ });
7207
+ setPerTokenSessions((prev) => {
7208
+ for (const k of Object.keys(prev)) {
7209
+ if (prev[k]?.sessionId === updated.sessionId) {
7210
+ return { ...prev, [k]: updated };
7211
+ }
7212
+ }
7213
+ return prev;
7214
+ });
7215
+ }).catch(() => {
7216
+ reportedTargetChainRef.current.set(activeSessionId, lastReported);
7217
+ });
7218
+ return () => {
7219
+ cancelled = true;
7220
+ };
7221
+ }, [
7222
+ apiBaseUrl,
7223
+ activeSessionId,
7224
+ selectedSourceChainId,
7225
+ sessionRegistrationChainId,
7226
+ selectedOption,
7227
+ destination
7228
+ ]);
7121
7229
  const completionSignature = useMemo(() => {
7122
7230
  const entries2 = [];
7123
7231
  for (const family of Object.keys(sessionsByFamily)) {
@@ -8393,12 +8501,32 @@ function PrimaryButton({
8393
8501
  icon,
8394
8502
  progress,
8395
8503
  progressText,
8396
- progressPaused
8504
+ progressPaused,
8505
+ spinnerOnly
8397
8506
  }) {
8398
8507
  const { tokens } = useBlinkConfig();
8399
8508
  const inProgress = progress != null;
8400
8509
  const isDisabled = disabled || loading || inProgress;
8401
8510
  const done = inProgress && progress >= 1;
8511
+ if (spinnerOnly) {
8512
+ return /* @__PURE__ */ jsxs(
8513
+ "button",
8514
+ {
8515
+ type: "button",
8516
+ disabled: true,
8517
+ "aria-label": "Please wait",
8518
+ style: buttonStyle2(tokens, { disabled: false, loading: true }),
8519
+ children: [
8520
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, style: inlineSpinnerStyle(tokens.accentText) }),
8521
+ /* @__PURE__ */ jsx("style", { children: `
8522
+ @keyframes blink-spin {
8523
+ to { transform: rotate(360deg); }
8524
+ }
8525
+ ` })
8526
+ ]
8527
+ }
8528
+ );
8529
+ }
8402
8530
  if (inProgress) {
8403
8531
  return /* @__PURE__ */ jsxs(
8404
8532
  "button",
@@ -8525,6 +8653,15 @@ var buttonStyle2 = (tokens, state) => {
8525
8653
  gap: 8
8526
8654
  };
8527
8655
  };
8656
+ var inlineSpinnerStyle = (color) => ({
8657
+ width: 20,
8658
+ height: 20,
8659
+ border: `2px solid ${color}44`,
8660
+ borderTopColor: color,
8661
+ borderRadius: "50%",
8662
+ animation: "blink-spin 0.9s linear infinite",
8663
+ flexShrink: 0
8664
+ });
8528
8665
  var iconWrapStyle = {
8529
8666
  display: "flex",
8530
8667
  alignItems: "center"
@@ -10641,269 +10778,288 @@ var avatarStyle = (tokens) => ({
10641
10778
  color: tokens.textMuted,
10642
10779
  background: "transparent"
10643
10780
  });
10644
- var LINK_ICON_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAXCAYAAACS5bYWAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAK6ADAAQAAAABAAAAFwAAAAAKDRJ/AAADIUlEQVRIDaWXMWsVQRSFX9SABgQjRFAhRV4hPAsFLQKmVDsLhaTU0p/gb7CztfAPaJnSlBYWpgiooJIIEZMiRQoLhVh4vnXP8+6+ebsz8cB5M7t37p07996ZnTcz6MZQ4pG4JJ4XT4tt/NKLPXFHfCceijl4rEHYtT42PorbYhIzybeDAU7eFjFWik0pvBa7nMYuzqbAotdFnG/gZOPp78M9NffF+YQs59UlDboh/hZ3pygQzWvimYSceZdFAonjY7QjuyYJExkYJbUosdJUtCgNMnFVjLp6HGyIRLkL6LPAm2Jbnyy9FCvEyJL2lfo9DQ6+ELfEAxHHUyCCyD+IGMdpR8w1OS3CGlplgCBYn72xgEBgEXPiJx7sLKsi/QYRYUXTHPS4dst4HL4inq2Fi2pZcI4txjAWkC2A/lfx0M4+1IOjwWTr4nFBpJnQNTmrPhHCbi7I6mXREZ5Xf/OEfkgVD4B09NVYNbDn56fk41pTnzkcqR7VsThmttLHWUrAYEWpTWR5SYst6tBgwhKwYDa3McJZUmSUpMo6Xe2bIGTjlSIudoizF4OF76Gf2+UUeSreSSjsh3fnQj+329DH2YicHRvH07eTON0GqTS8gf2c0zb0cTY6mPr29xnt0/eG5TgsRWOBOBs3FMdFKfr0cfKJaKdL7McS3cfZeMsZlViqx74POqlSCOLibjyp9nA27ji+zaWlwBFlLKlTep5at91y9mPPqD4KTOYJqREuMyWI+uitiqULTs3Hxo0fq21/bqk7h/yC+hPXs5S18A6H0T8lsmDuBlsin97jgHJaCYqv1D+IzjLJYj2A8POx2BXjbq/FEw1jjkScBFxirouUWI6+hlUgko9EB46XbNC3dOws/c8i1zN/0Ygwq+Md+CF2RepbNepfzbJ49LGH3qyIjTZwcCguiw/EBdFoXKral28GkQIf9FaKLSXzTJwWsVuS3RX/t243ZKNx3MXISlaB+mNFRMQFXgnqHyL2RYzna5QTYeqVcc5SlPf1mZ8b18Q9JRXZaIzJOM5oIdHC2HMxByyWCwy0fluPDPGXCVLj2E/iD2Rfl2nM3a3EAAAAAElFTkSuQmCC";
10781
+
10782
+ // src/deviceBiometricUnlockText.ts
10783
+ var FALLBACK = "Biometric verification";
10784
+ function getDeviceBiometricUnlockText() {
10785
+ const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10786
+ if (/iPhone|iPad|iPod/i.test(ua)) {
10787
+ return "Face ID";
10788
+ }
10789
+ if (/Android/i.test(ua)) {
10790
+ return "Fingerprint or face unlock";
10791
+ }
10792
+ if (/Windows NT/i.test(ua)) {
10793
+ return "Windows Hello";
10794
+ }
10795
+ if (/Macintosh|Mac OS X/i.test(ua)) {
10796
+ return "Touch ID";
10797
+ }
10798
+ return FALLBACK;
10799
+ }
10800
+ var CLUSTER_LOGOS = [
10801
+ METAMASK_LOGO,
10802
+ PHANTOM_LOGO,
10803
+ RABBY_LOGO,
10804
+ OKX_WALLET_LOGO,
10805
+ TRUST_WALLET_LOGO,
10806
+ BASE_LOGO
10807
+ ];
10645
10808
  function DepositOptionsScreen({
10646
- onFromWallet,
10647
10809
  onToAddress,
10648
10810
  onSignInWithBlink,
10649
10811
  onClose
10650
10812
  }) {
10651
10813
  const { tokens } = useBlinkConfig();
10652
- const headerRight = onClose ? /* @__PURE__ */ jsx(
10653
- "button",
10654
- {
10655
- type: "button",
10656
- onClick: onClose,
10657
- "aria-label": "Close",
10658
- style: closeButtonStyle2(tokens),
10659
- children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
10660
- "path",
10814
+ const depositLabel = `Deposit with ${getDeviceBiometricUnlockText()}`;
10815
+ return /* @__PURE__ */ jsx(ScreenLayout, { children: /* @__PURE__ */ jsx("div", { style: sheetStyle, children: /* @__PURE__ */ jsxs("div", { style: contentStyle2, children: [
10816
+ /* @__PURE__ */ jsxs("div", { style: headerRowStyle, children: [
10817
+ /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle }),
10818
+ onClose ? /* @__PURE__ */ jsx(
10819
+ "button",
10661
10820
  {
10662
- d: "M6 6l12 12M18 6L6 18",
10663
- stroke: "currentColor",
10664
- strokeWidth: "2",
10665
- strokeLinecap: "round",
10666
- strokeLinejoin: "round"
10821
+ type: "button",
10822
+ onClick: onClose,
10823
+ "aria-label": "Close",
10824
+ style: closeButtonStyle2(tokens.bgRecessed, tokens.text),
10825
+ children: /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
10826
+ "path",
10827
+ {
10828
+ d: "M6 6l12 12M18 6L6 18",
10829
+ stroke: "currentColor",
10830
+ strokeWidth: "2",
10831
+ strokeLinecap: "round",
10832
+ strokeLinejoin: "round"
10833
+ }
10834
+ ) })
10667
10835
  }
10668
- ) })
10669
- }
10670
- ) : void 0;
10671
- return /* @__PURE__ */ jsxs(
10672
- ScreenLayout,
10673
- {
10674
- footer: /* @__PURE__ */ jsx(PrimaryButton, { onClick: onSignInWithBlink, icon: /* @__PURE__ */ jsx(FaceIdIcon2, {}), children: "Sign in with Blink" }),
10675
- children: [
10676
- /* @__PURE__ */ jsx(
10677
- ScreenHeader,
10836
+ ) : null
10837
+ ] }),
10838
+ /* @__PURE__ */ jsx("img", { src: BLINK_PASSKEY_ILLUSTRATION, alt: "", "aria-hidden": "true", style: heroStyle }),
10839
+ /* @__PURE__ */ jsxs("div", { style: stackStyle, children: [
10840
+ /* @__PURE__ */ jsxs("div", { style: depositPillWrapperStyle, children: [
10841
+ /* @__PURE__ */ jsxs(
10842
+ "button",
10678
10843
  {
10679
- title: "Deposit",
10680
- right: headerRight,
10681
- left: /* @__PURE__ */ jsx(
10682
- "img",
10683
- {
10684
- src: BLINK_WORDMARK,
10685
- alt: "Blink",
10686
- style: wordmarkStyle
10687
- }
10688
- )
10844
+ type: "button",
10845
+ onClick: onSignInWithBlink,
10846
+ style: depositPillStyle(tokens.accent),
10847
+ children: [
10848
+ /* @__PURE__ */ jsx("span", { style: depositPillLabelStyle(tokens.accentText), children: depositLabel }),
10849
+ /* @__PURE__ */ jsx("span", { style: clusterStyle, children: CLUSTER_LOGOS.map((logo, i) => /* @__PURE__ */ jsx(
10850
+ "span",
10851
+ {
10852
+ style: clusterChipStyle(tokens.bgInput, i === CLUSTER_LOGOS.length - 1),
10853
+ children: /* @__PURE__ */ jsx("img", { src: logo, alt: "", "aria-hidden": "true", style: clusterIconStyle })
10854
+ },
10855
+ logo
10856
+ )) })
10857
+ ]
10689
10858
  }
10690
10859
  ),
10691
- /* @__PURE__ */ jsxs("div", { style: contentStyle2, children: [
10692
- /* @__PURE__ */ jsx(DepositTypeToggle, { tokens }),
10693
- /* @__PURE__ */ jsxs("div", { style: cardStyle(tokens.bgCardTranslucent), children: [
10694
- /* @__PURE__ */ jsx(
10695
- SourceRow,
10696
- {
10697
- name: "Connect Wallet",
10698
- icon: /* @__PURE__ */ jsx(WalletIcon, { color: tokens.text }),
10699
- onClick: onFromWallet,
10700
- right: /* @__PURE__ */ jsx("span", { style: badgeWithArrowStyle, children: /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M9 6l6 6-6 6", stroke: tokens.textMuted, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
10701
- }
10702
- ),
10703
- /* @__PURE__ */ jsx(
10704
- SourceRow,
10705
- {
10706
- name: "Address",
10707
- icon: /* @__PURE__ */ jsx(AddressIcon, { color: tokens.text }),
10708
- onClick: onToAddress
10709
- }
10710
- ),
10711
- /* @__PURE__ */ jsx(
10712
- SourceRow,
10713
- {
10714
- name: "Exchange",
10715
- icon: /* @__PURE__ */ jsx(LinkIcon, { color: tokens.textTertiary }),
10716
- disabled: true,
10717
- disabledColor: tokens.textTertiary,
10718
- right: /* @__PURE__ */ jsx(ComingSoonBadge, { tokens })
10719
- }
10720
- )
10721
- ] })
10722
- ] })
10723
- ]
10724
- }
10725
- );
10726
- }
10727
- function DepositTypeToggle({ tokens }) {
10728
- return /* @__PURE__ */ jsx(Fragment, {});
10729
- }
10730
- function ComingSoonBadge({ tokens }) {
10731
- return /* @__PURE__ */ jsx("span", { style: comingSoonBadgeStyle(tokens.bgRecessed, tokens.textMuted), children: "Coming soon" });
10732
- }
10733
- function WalletIcon({ color }) {
10734
- return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
10735
- /* @__PURE__ */ jsx(
10736
- "path",
10737
- {
10738
- d: "M3 9.5a3 3 0 013-3h12a3 3 0 013 3v8a3 3 0 01-3 3H6a3 3 0 01-3-3v-8z",
10739
- stroke: color,
10740
- strokeWidth: "1.6"
10741
- }
10742
- ),
10743
- /* @__PURE__ */ jsx(
10744
- "path",
10745
- {
10746
- d: "M16 4.5l-9 2",
10747
- stroke: color,
10748
- strokeWidth: "1.6",
10749
- strokeLinecap: "round"
10750
- }
10751
- ),
10752
- /* @__PURE__ */ jsx("circle", { cx: "17.25", cy: "13.5", r: "1.1", fill: color })
10753
- ] });
10754
- }
10755
- function AddressIcon({ color }) {
10756
- return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
10757
- /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10758
- /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
10759
- /* @__PURE__ */ jsx("rect", { x: "13.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10760
- /* @__PURE__ */ jsx("rect", { x: "16", y: "6", width: "2", height: "2", fill: color }),
10761
- /* @__PURE__ */ jsx("rect", { x: "3.5", y: "13.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10762
- /* @__PURE__ */ jsx("rect", { x: "6", y: "16", width: "2", height: "2", fill: color }),
10763
- /* @__PURE__ */ jsx("rect", { x: "13.5", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10764
- /* @__PURE__ */ jsx("rect", { x: "18", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10765
- /* @__PURE__ */ jsx("rect", { x: "13.5", y: "18", width: "2.5", height: "2.5", fill: color }),
10766
- /* @__PURE__ */ jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
10767
- ] });
10860
+ /* @__PURE__ */ jsx("span", { style: feesBadgeStyle(tokens.highlight, tokens.text), children: "0% FEES" })
10861
+ ] }),
10862
+ /* @__PURE__ */ jsxs("div", { style: dividerRowStyle, children: [
10863
+ /* @__PURE__ */ jsx("span", { style: dividerRuleStyle(tokens.textTertiary) }),
10864
+ /* @__PURE__ */ jsx("span", { style: dividerLabelStyle(tokens.textTertiary), children: "OR" }),
10865
+ /* @__PURE__ */ jsx("span", { style: dividerRuleStyle(tokens.textTertiary) })
10866
+ ] }),
10867
+ /* @__PURE__ */ jsxs(
10868
+ "button",
10869
+ {
10870
+ type: "button",
10871
+ onClick: onToAddress,
10872
+ style: manualRowStyle(tokens.bgCardTranslucent),
10873
+ children: [
10874
+ /* @__PURE__ */ jsx("span", { style: manualLabelStyle(tokens.text), children: "Send Crypto Manually" }),
10875
+ /* @__PURE__ */ jsx(QrIcon, { color: tokens.text })
10876
+ ]
10877
+ }
10878
+ )
10879
+ ] })
10880
+ ] }) }) });
10768
10881
  }
10769
- function LinkIcon({ color }) {
10770
- return /* @__PURE__ */ jsx(
10771
- "img",
10882
+ function QrIcon({ color }) {
10883
+ return /* @__PURE__ */ jsxs(
10884
+ "svg",
10772
10885
  {
10773
- src: LINK_ICON_DATA_URI,
10774
- alt: "",
10886
+ width: "24",
10887
+ height: "24",
10888
+ viewBox: "0 0 24 24",
10889
+ fill: "none",
10775
10890
  "aria-hidden": "true",
10776
- style: linkIconImageStyle(color)
10891
+ style: { flexShrink: 0 },
10892
+ children: [
10893
+ /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10894
+ /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
10895
+ /* @__PURE__ */ jsx("rect", { x: "13.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10896
+ /* @__PURE__ */ jsx("rect", { x: "16", y: "6", width: "2", height: "2", fill: color }),
10897
+ /* @__PURE__ */ jsx("rect", { x: "3.5", y: "13.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10898
+ /* @__PURE__ */ jsx("rect", { x: "6", y: "16", width: "2", height: "2", fill: color }),
10899
+ /* @__PURE__ */ jsx("rect", { x: "13.5", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10900
+ /* @__PURE__ */ jsx("rect", { x: "18", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10901
+ /* @__PURE__ */ jsx("rect", { x: "13.5", y: "18", width: "2.5", height: "2.5", fill: color }),
10902
+ /* @__PURE__ */ jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
10903
+ ]
10777
10904
  }
10778
10905
  );
10779
10906
  }
10780
- function FaceIdIcon2() {
10781
- return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
10782
- /* @__PURE__ */ jsx(
10783
- "path",
10784
- {
10785
- d: "M3 8V6a3 3 0 013-3h2",
10786
- stroke: "currentColor",
10787
- strokeWidth: "1.6",
10788
- strokeLinecap: "round"
10789
- }
10790
- ),
10791
- /* @__PURE__ */ jsx(
10792
- "path",
10793
- {
10794
- d: "M16 3h2a3 3 0 013 3v2",
10795
- stroke: "currentColor",
10796
- strokeWidth: "1.6",
10797
- strokeLinecap: "round"
10798
- }
10799
- ),
10800
- /* @__PURE__ */ jsx(
10801
- "path",
10802
- {
10803
- d: "M21 16v2a3 3 0 01-3 3h-2",
10804
- stroke: "currentColor",
10805
- strokeWidth: "1.6",
10806
- strokeLinecap: "round"
10807
- }
10808
- ),
10809
- /* @__PURE__ */ jsx(
10810
- "path",
10811
- {
10812
- d: "M8 21H6a3 3 0 01-3-3v-2",
10813
- stroke: "currentColor",
10814
- strokeWidth: "1.6",
10815
- strokeLinecap: "round"
10816
- }
10817
- ),
10818
- /* @__PURE__ */ jsx(
10819
- "path",
10820
- {
10821
- d: "M9 10v1.5",
10822
- stroke: "currentColor",
10823
- strokeWidth: "1.6",
10824
- strokeLinecap: "round"
10825
- }
10826
- ),
10827
- /* @__PURE__ */ jsx(
10828
- "path",
10829
- {
10830
- d: "M15 10v1.5",
10831
- stroke: "currentColor",
10832
- strokeWidth: "1.6",
10833
- strokeLinecap: "round"
10834
- }
10835
- ),
10836
- /* @__PURE__ */ jsx(
10837
- "path",
10838
- {
10839
- d: "M12 10v3.5",
10840
- stroke: "currentColor",
10841
- strokeWidth: "1.6",
10842
- strokeLinecap: "round"
10843
- }
10844
- ),
10845
- /* @__PURE__ */ jsx(
10846
- "path",
10847
- {
10848
- d: "M9.5 16.25c.7.6 1.55.95 2.5.95s1.8-.35 2.5-.95",
10849
- stroke: "currentColor",
10850
- strokeWidth: "1.6",
10851
- strokeLinecap: "round"
10852
- }
10853
- )
10854
- ] });
10855
- }
10856
- var wordmarkStyle = {
10857
- height: 20,
10907
+ var sheetStyle = {
10908
+ position: "relative",
10909
+ minHeight: "100%",
10910
+ display: "flex",
10911
+ flexDirection: "column",
10912
+ boxSizing: "border-box"
10913
+ };
10914
+ var contentStyle2 = {
10915
+ display: "flex",
10916
+ flexDirection: "column",
10917
+ alignItems: "center",
10918
+ gap: 32,
10919
+ padding: "32px 8px"
10920
+ };
10921
+ var headerRowStyle = {
10922
+ display: "flex",
10923
+ alignItems: "center",
10924
+ justifyContent: "space-between",
10925
+ width: "100%",
10926
+ minHeight: 44
10927
+ };
10928
+ var wordmarkImgStyle = {
10929
+ height: 31,
10858
10930
  width: "auto",
10931
+ display: "block"
10932
+ };
10933
+ var heroStyle = {
10934
+ width: 253,
10935
+ height: 253,
10936
+ maxWidth: "100%",
10859
10937
  objectFit: "contain",
10860
10938
  display: "block"
10861
10939
  };
10862
- var contentStyle2 = {
10940
+ var stackStyle = {
10863
10941
  display: "flex",
10864
10942
  flexDirection: "column",
10865
- gap: 24,
10866
- paddingTop: 24
10943
+ gap: 16,
10944
+ width: "100%"
10867
10945
  };
10868
- var cardStyle = (bg) => ({
10946
+ var depositPillWrapperStyle = {
10947
+ position: "relative",
10948
+ width: "100%",
10949
+ height: 71
10950
+ };
10951
+ var depositPillStyle = (bg) => ({
10869
10952
  display: "flex",
10870
- flexDirection: "column",
10953
+ alignItems: "center",
10954
+ justifyContent: "space-between",
10955
+ width: "100%",
10956
+ height: 56,
10957
+ padding: "12px 12px 12px 24px",
10871
10958
  background: bg,
10959
+ border: "none",
10872
10960
  borderRadius: 28,
10873
- padding: "8px 8px 8px 20px"
10961
+ cursor: "pointer",
10962
+ boxSizing: "border-box",
10963
+ fontFamily: "inherit"
10964
+ });
10965
+ var depositPillLabelStyle = (color) => ({
10966
+ color,
10967
+ fontSize: 16,
10968
+ fontWeight: 500,
10969
+ whiteSpace: "nowrap"
10970
+ });
10971
+ var clusterStyle = {
10972
+ display: "inline-flex",
10973
+ alignItems: "center",
10974
+ isolation: "isolate"
10975
+ };
10976
+ var clusterChipStyle = (bg, last) => ({
10977
+ width: 32,
10978
+ height: 32,
10979
+ borderRadius: "50%",
10980
+ background: bg,
10981
+ display: "inline-flex",
10982
+ alignItems: "center",
10983
+ justifyContent: "center",
10984
+ marginRight: last ? 0 : -12,
10985
+ filter: "drop-shadow(0 0 2px rgba(0, 0, 0, 0.24))",
10986
+ flexShrink: 0
10987
+ });
10988
+ var clusterIconStyle = {
10989
+ width: 24,
10990
+ height: 24,
10991
+ borderRadius: "50%",
10992
+ objectFit: "cover",
10993
+ display: "block"
10994
+ };
10995
+ var feesBadgeStyle = (bg, color) => ({
10996
+ position: "absolute",
10997
+ left: 131,
10998
+ top: 45,
10999
+ display: "inline-flex",
11000
+ alignItems: "center",
11001
+ justifyContent: "center",
11002
+ background: bg,
11003
+ color,
11004
+ fontSize: 12,
11005
+ fontWeight: 500,
11006
+ lineHeight: 1,
11007
+ padding: "4px 8px",
11008
+ borderRadius: 6,
11009
+ whiteSpace: "nowrap",
11010
+ transform: "rotate(-6.75deg)",
11011
+ boxShadow: "0 2px 4px rgba(0, 0, 0, 0.16)",
11012
+ pointerEvents: "none"
10874
11013
  });
10875
- var comingSoonBadgeStyle = (bg, color) => ({
10876
- display: "inline-flex",
11014
+ var dividerRowStyle = {
11015
+ display: "flex",
10877
11016
  alignItems: "center",
10878
11017
  justifyContent: "center",
10879
- background: bg,
11018
+ gap: 10,
11019
+ padding: "0 16px",
11020
+ width: "100%",
11021
+ boxSizing: "border-box"
11022
+ };
11023
+ var dividerRuleStyle = (color) => ({
11024
+ flex: 1,
11025
+ height: 1,
11026
+ background: color
11027
+ });
11028
+ var dividerLabelStyle = (color) => ({
10880
11029
  color,
10881
- fontSize: 10,
11030
+ fontSize: 12,
10882
11031
  fontWeight: 500,
10883
- lineHeight: 1,
10884
- padding: "4px 8px",
10885
- borderRadius: 8,
10886
- marginRight: 8,
10887
11032
  whiteSpace: "nowrap"
10888
11033
  });
10889
- var badgeWithArrowStyle = {
11034
+ var manualRowStyle = (bg) => ({
10890
11035
  display: "flex",
10891
- alignItems: "center"
10892
- };
10893
- var linkIconImageStyle = (color) => ({
10894
- width: 24,
10895
- height: 24,
10896
- objectFit: "contain",
10897
- display: "block",
10898
- opacity: color.includes("rgba") ? 0.3 : 1
11036
+ alignItems: "center",
11037
+ gap: 8,
11038
+ width: "100%",
11039
+ height: 56,
11040
+ padding: "12px 24px",
11041
+ background: bg,
11042
+ border: "none",
11043
+ borderRadius: 28,
11044
+ cursor: "pointer",
11045
+ boxSizing: "border-box",
11046
+ fontFamily: "inherit"
10899
11047
  });
10900
- var closeButtonStyle2 = (tokens) => ({
10901
- width: 40,
10902
- height: 40,
11048
+ var manualLabelStyle = (color) => ({
11049
+ flex: 1,
11050
+ minWidth: 0,
11051
+ color,
11052
+ fontSize: 16,
11053
+ fontWeight: 400
11054
+ });
11055
+ var closeButtonStyle2 = (bg, color) => ({
11056
+ flexShrink: 0,
11057
+ width: 44,
11058
+ height: 44,
10903
11059
  borderRadius: "50%",
10904
11060
  border: "none",
10905
- background: tokens.bgRecessed,
10906
- color: tokens.text,
11061
+ background: bg,
11062
+ color,
10907
11063
  display: "flex",
10908
11064
  alignItems: "center",
10909
11065
  justifyContent: "center",
@@ -11259,7 +11415,7 @@ function PasskeyPopupWelcomeScreen({
11259
11415
  /* @__PURE__ */ jsxs("div", { style: contentStyle6, children: [
11260
11416
  /* @__PURE__ */ jsxs("div", { style: lockupStyle, children: [
11261
11417
  /* @__PURE__ */ jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle }),
11262
- /* @__PURE__ */ jsx("span", { style: wordmarkStyle2(tokens.text), children: "Blink" })
11418
+ /* @__PURE__ */ jsx("span", { style: wordmarkStyle(tokens.text), children: "Blink" })
11263
11419
  ] }),
11264
11420
  /* @__PURE__ */ jsx("div", { style: illustrationFrameStyle, children: /* @__PURE__ */ jsx(
11265
11421
  "img",
@@ -11316,7 +11472,7 @@ var lockupMarkStyle = {
11316
11472
  height: 24,
11317
11473
  display: "block"
11318
11474
  };
11319
- var wordmarkStyle2 = (color) => ({
11475
+ var wordmarkStyle = (color) => ({
11320
11476
  fontSize: "1.45rem",
11321
11477
  fontWeight: 500,
11322
11478
  letterSpacing: "-0.03em",
@@ -11765,7 +11921,7 @@ function WalletPickerScreen({
11765
11921
  ),
11766
11922
  /* @__PURE__ */ jsx("h1", { style: titleStyle3(tokens.text), children: "Link wallet" }),
11767
11923
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle5(tokens), children: error }),
11768
- /* @__PURE__ */ jsx("div", { style: sheetStackStyle, children: /* @__PURE__ */ jsx("div", { style: cardStyle2(tokens.bgCardTranslucent), children: showOtherWallets ? /* @__PURE__ */ jsx(
11924
+ /* @__PURE__ */ jsx("div", { style: sheetStackStyle, children: /* @__PURE__ */ jsx("div", { style: cardStyle(tokens.bgCardTranslucent), children: showOtherWallets ? /* @__PURE__ */ jsx(
11769
11925
  OtherWalletsPanel,
11770
11926
  {
11771
11927
  wallets: filteredReownWallets,
@@ -11988,7 +12144,7 @@ var sheetStackStyle = {
11988
12144
  flexDirection: "column",
11989
12145
  gap: 16
11990
12146
  };
11991
- var cardStyle2 = (bg) => ({
12147
+ var cardStyle = (bg) => ({
11992
12148
  display: "flex",
11993
12149
  flexDirection: "column",
11994
12150
  background: bg,
@@ -12141,7 +12297,7 @@ function LinkTokensScreen({
12141
12297
  {
12142
12298
  onBack,
12143
12299
  onLogout,
12144
- center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle })
12300
+ center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 })
12145
12301
  }
12146
12302
  ),
12147
12303
  /* @__PURE__ */ jsxs("div", { style: contentStyle9, children: [
@@ -12207,7 +12363,7 @@ var contentStyle9 = {
12207
12363
  minHeight: 0,
12208
12364
  width: "100%"
12209
12365
  };
12210
- var wordmarkImgStyle = {
12366
+ var wordmarkImgStyle2 = {
12211
12367
  height: 22,
12212
12368
  width: "auto",
12213
12369
  display: "block",
@@ -12503,6 +12659,7 @@ function SelectDepositSourceScreen({
12503
12659
  {
12504
12660
  symbol: opt.symbol,
12505
12661
  chainName: opt.chainName,
12662
+ tokenLogoUri: opt.logoURI,
12506
12663
  balance: opt.balance,
12507
12664
  selected: !hasPendingMobileSelection && isSelected(opt),
12508
12665
  onClick: () => handleAuthorizedPick(opt)
@@ -12514,6 +12671,7 @@ function SelectDepositSourceScreen({
12514
12671
  {
12515
12672
  symbol: opt.symbol,
12516
12673
  chainName: opt.chainName,
12674
+ tokenLogoUri: opt.logoURI,
12517
12675
  balance: opt.balance,
12518
12676
  requiresAuth: true,
12519
12677
  selected: hasPendingMobileSelection ? pendingMobileSelection?.key === tokenOptionKey(opt) : isSelected(opt),
@@ -12531,7 +12689,7 @@ function SelectDepositSourceScreen({
12531
12689
  label: "Send manually",
12532
12690
  color: tokens.text,
12533
12691
  onClick: onSendManually,
12534
- icon: /* @__PURE__ */ jsx(QrIcon, { color: tokens.text })
12692
+ icon: /* @__PURE__ */ jsx(QrIcon2, { color: tokens.text })
12535
12693
  }
12536
12694
  ),
12537
12695
  onAddProvider && /* @__PURE__ */ jsx(
@@ -12540,7 +12698,7 @@ function SelectDepositSourceScreen({
12540
12698
  label: "Link Wallet",
12541
12699
  color: tokens.text,
12542
12700
  onClick: onAddProvider,
12543
- icon: /* @__PURE__ */ jsx(WalletIcon2, {})
12701
+ icon: /* @__PURE__ */ jsx(WalletIcon, {})
12544
12702
  }
12545
12703
  )
12546
12704
  ] })
@@ -12625,12 +12783,23 @@ function ActionRow({
12625
12783
  onClick,
12626
12784
  icon
12627
12785
  }) {
12628
- return /* @__PURE__ */ jsxs("button", { type: "button", onClick, style: actionRowStyle(color), children: [
12629
- /* @__PURE__ */ jsx("span", { style: actionIconSlotStyle, children: icon }),
12630
- /* @__PURE__ */ jsx("span", { style: actionLabelStyle, children: label })
12631
- ] });
12786
+ const [hovered, setHovered] = useState(false);
12787
+ return /* @__PURE__ */ jsxs(
12788
+ "button",
12789
+ {
12790
+ type: "button",
12791
+ onClick,
12792
+ onMouseEnter: () => setHovered(true),
12793
+ onMouseLeave: () => setHovered(false),
12794
+ style: actionRowStyle(color, hovered),
12795
+ children: [
12796
+ /* @__PURE__ */ jsx("span", { style: actionIconSlotStyle, children: icon }),
12797
+ /* @__PURE__ */ jsx("span", { style: actionLabelStyle, children: label })
12798
+ ]
12799
+ }
12800
+ );
12632
12801
  }
12633
- function QrIcon({ color }) {
12802
+ function QrIcon2({ color }) {
12634
12803
  return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12635
12804
  /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
12636
12805
  /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
@@ -12644,7 +12813,7 @@ function QrIcon({ color }) {
12644
12813
  /* @__PURE__ */ jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
12645
12814
  ] });
12646
12815
  }
12647
- function WalletIcon2() {
12816
+ function WalletIcon() {
12648
12817
  return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12649
12818
  /* @__PURE__ */ jsx(
12650
12819
  "path",
@@ -12662,13 +12831,13 @@ function WalletIcon2() {
12662
12831
  )
12663
12832
  ] });
12664
12833
  }
12665
- var actionRowStyle = (color) => ({
12834
+ var actionRowStyle = (color, hovered) => ({
12666
12835
  display: "flex",
12667
12836
  alignItems: "center",
12668
12837
  gap: 8,
12669
12838
  width: "100%",
12670
12839
  padding: 4,
12671
- background: "transparent",
12840
+ background: hovered ? "rgba(255,255,255,0.24)" : "transparent",
12672
12841
  border: "none",
12673
12842
  borderRadius: 56,
12674
12843
  color,
@@ -12676,6 +12845,7 @@ var actionRowStyle = (color) => ({
12676
12845
  fontFamily: "inherit",
12677
12846
  textAlign: "left",
12678
12847
  outline: "none",
12848
+ transition: "background 0.15s ease",
12679
12849
  boxSizing: "border-box"
12680
12850
  });
12681
12851
  var actionIconSlotStyle = {
@@ -12850,7 +13020,7 @@ function DepositScreen({
12850
13020
  onClick: () => onDeposit(amount),
12851
13021
  disabled: !canDeposit,
12852
13022
  loading: processing,
12853
- icon: /* @__PURE__ */ jsx(FaceIdIcon3, {}),
13023
+ icon: /* @__PURE__ */ jsx(FaceIdIcon2, {}),
12854
13024
  children: "Deposit"
12855
13025
  }
12856
13026
  );
@@ -12998,7 +13168,7 @@ function DepositScreen({
12998
13168
  ) : /* @__PURE__ */ jsx("span", { style: redesignNoFeesStyle(tokens.text), children: "No fees" }) }),
12999
13169
  showHeroPresets && presetsRow
13000
13170
  ] }),
13001
- /* @__PURE__ */ jsx("div", { style: bannerSlotStyle2, children: showLowFunds ? /* @__PURE__ */ jsx(
13171
+ /* @__PURE__ */ jsx("div", { style: bannerSlotStyle2, children: mobileEntryWithKeypad ? null : showLowFunds ? /* @__PURE__ */ jsx(
13002
13172
  NotificationBanner,
13003
13173
  {
13004
13174
  variant: "negative",
@@ -13020,7 +13190,7 @@ function DepositScreen({
13020
13190
  ) : error ? /* @__PURE__ */ jsx(NotificationBanner, { title: "Something went wrong", description: error }) : null })
13021
13191
  ] });
13022
13192
  }
13023
- function FaceIdIcon3() {
13193
+ function FaceIdIcon2() {
13024
13194
  return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
13025
13195
  /* @__PURE__ */ jsx("path", { d: "M3 8V6a3 3 0 013-3h2", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }),
13026
13196
  /* @__PURE__ */ jsx("path", { d: "M16 3h2a3 3 0 013 3v2", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }),
@@ -13539,7 +13709,7 @@ function SelectSourceScreen({
13539
13709
  /* @__PURE__ */ jsx("label", { style: labelStyle5(tokens.textSecondary), children: "Token" }),
13540
13710
  /* @__PURE__ */ jsx("div", { style: optionListStyle, children: tokenChoices.map((token) => {
13541
13711
  const isSelected = token.tokenSymbol === selectedTokenSymbol;
13542
- const logo = token.walletLogoUrl ?? TOKEN_LOGOS[token.tokenSymbol];
13712
+ const logo = token.walletLogoUrl ?? token.logoURI ?? TOKEN_LOGOS[token.tokenSymbol];
13543
13713
  const logoAlt = token.walletLogoUrl ? token.walletName ?? token.tokenSymbol : token.tokenSymbol;
13544
13714
  return /* @__PURE__ */ jsxs(
13545
13715
  "button",
@@ -14760,30 +14930,102 @@ var closeButtonStyle5 = (bg, color) => ({
14760
14930
  padding: 0
14761
14931
  });
14762
14932
  var DELAYED_RETRY_VISIBLE_MS = 2e4;
14933
+ var SPIN_KEYFRAMES_CSS2 = `
14934
+ @keyframes blink-approving-spin {
14935
+ to { transform: rotate(360deg); }
14936
+ }`;
14763
14937
  function ApprovingInWalletScreen({
14764
14938
  tokenSymbol,
14765
14939
  chainName,
14766
14940
  step,
14767
14941
  error,
14768
- onRetry
14942
+ onRetry,
14943
+ onBack,
14944
+ onLogout
14769
14945
  }) {
14770
- const { tokens } = useBlinkConfig();
14946
+ const { tokens: t } = useBlinkConfig();
14771
14947
  const showDelayedRetry = useDelayedRetry(error == null && onRetry != null);
14772
14948
  const retryVisible = onRetry != null && (error != null || showDelayedRetry);
14773
- return /* @__PURE__ */ jsx(
14949
+ const token = tokenSymbol ?? "token";
14950
+ const steps = buildSteps(step, tokenSymbol, chainName);
14951
+ return /* @__PURE__ */ jsxs(
14774
14952
  ScreenLayout,
14775
14953
  {
14776
- footer: retryVisible ? /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
14777
- error && /* @__PURE__ */ jsx(InfoBanner, { children: error }),
14778
- /* @__PURE__ */ jsx(OutlineButton, { onClick: onRetry, children: "Retry" })
14779
- ] }) : void 0,
14780
- children: /* @__PURE__ */ jsxs("div", { style: contentStyle15, children: [
14781
- /* @__PURE__ */ jsxs("div", { style: lockupStyle2, children: [
14782
- /* @__PURE__ */ jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle2 }),
14783
- /* @__PURE__ */ jsx("span", { style: wordmarkStyle3(tokens.text), children: "Blink" })
14954
+ scrollableBody: false,
14955
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
14956
+ /* @__PURE__ */ jsxs("div", { style: lockBannerStyle2, children: [
14957
+ /* @__PURE__ */ jsx("span", { style: lockIconWrapStyle2(t.text), children: /* @__PURE__ */ jsx(LockIcon3, {}) }),
14958
+ /* @__PURE__ */ jsx("p", { style: lockBannerTextStyle2(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
14784
14959
  ] }),
14785
- /* @__PURE__ */ jsx("div", { style: stepsFrameStyle, children: /* @__PURE__ */ jsx(StepList, { steps: buildSteps(step, tokenSymbol, chainName), activeIndicator: "spinner", size: "lg" }) })
14786
- ] })
14960
+ retryVisible ? /* @__PURE__ */ jsxs("div", { style: retryStackStyle, children: [
14961
+ error && /* @__PURE__ */ jsx(InfoBanner, { children: error }),
14962
+ /* @__PURE__ */ jsx(OutlineButton, { onClick: onRetry, children: "Retry" })
14963
+ ] }) : /* @__PURE__ */ jsx(PrimaryButton, { spinnerOnly: true })
14964
+ ] }),
14965
+ children: [
14966
+ /* @__PURE__ */ jsx(
14967
+ ScreenHeader,
14968
+ {
14969
+ onBack,
14970
+ onLogout,
14971
+ center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
14972
+ }
14973
+ ),
14974
+ /* @__PURE__ */ jsxs("div", { style: contentStyle15, children: [
14975
+ /* @__PURE__ */ jsx("h2", { style: headingStyle13(t.text), children: `Authorizing ${token} for passkey deposits` }),
14976
+ /* @__PURE__ */ jsxs("div", { style: cardStyle2(t.bgRecessed, t.radiusLg), children: [
14977
+ /* @__PURE__ */ jsx("style", { children: SPIN_KEYFRAMES_CSS2 }),
14978
+ steps.map((s, i) => /* @__PURE__ */ jsx(ChecklistRow, { step: s }, i))
14979
+ ] })
14980
+ ] })
14981
+ ]
14982
+ }
14983
+ );
14984
+ }
14985
+ function ChecklistRow({ step }) {
14986
+ const { tokens: t } = useBlinkConfig();
14987
+ const isComplete = step.status === "complete";
14988
+ const isActive = step.status === "active";
14989
+ return /* @__PURE__ */ jsxs("div", { style: rowStyle6, children: [
14990
+ isComplete ? /* @__PURE__ */ jsx("span", { style: completeBadgeStyle(t.accent), children: /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx(
14991
+ "path",
14992
+ {
14993
+ d: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z",
14994
+ fill: t.accentText
14995
+ }
14996
+ ) }) }) : isActive ? /* @__PURE__ */ jsx(RowSpinner, { color: t.accent }) : /* @__PURE__ */ jsx("span", { style: pendingBadgeStyle(t.bgRecessed) }),
14997
+ /* @__PURE__ */ jsx("span", { style: labelStyle7(isComplete || isActive ? t.text : t.textMuted), children: step.label })
14998
+ ] });
14999
+ }
15000
+ function RowSpinner({ color }) {
15001
+ const size = 24;
15002
+ const stroke = 2;
15003
+ const r = (size - stroke) / 2;
15004
+ const c = size / 2;
15005
+ const circumference = 2 * Math.PI * r;
15006
+ return /* @__PURE__ */ jsx(
15007
+ "div",
15008
+ {
15009
+ role: "status",
15010
+ "aria-label": "Loading",
15011
+ style: {
15012
+ width: size,
15013
+ height: size,
15014
+ flexShrink: 0,
15015
+ animation: "blink-approving-spin 0.9s linear infinite"
15016
+ },
15017
+ children: /* @__PURE__ */ jsx("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, fill: "none", children: /* @__PURE__ */ jsx(
15018
+ "circle",
15019
+ {
15020
+ cx: c,
15021
+ cy: c,
15022
+ r,
15023
+ stroke: color,
15024
+ strokeWidth: stroke,
15025
+ strokeLinecap: "round",
15026
+ strokeDasharray: `${circumference * 0.25} ${circumference}`
15027
+ }
15028
+ ) })
14787
15029
  }
14788
15030
  );
14789
15031
  }
@@ -14812,50 +15054,124 @@ function useDelayedRetry(enabled) {
14812
15054
  }, [enabled]);
14813
15055
  return visible;
14814
15056
  }
15057
+ function LockIcon3() {
15058
+ return /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
15059
+ "path",
15060
+ {
15061
+ d: "M7 10V8a5 5 0 0 1 10 0v2m-12 0h14a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1z",
15062
+ stroke: "currentColor",
15063
+ strokeWidth: "2",
15064
+ strokeLinecap: "round",
15065
+ strokeLinejoin: "round"
15066
+ }
15067
+ ) });
15068
+ }
15069
+ var wordmarkImgStyle3 = {
15070
+ height: 22,
15071
+ width: "auto",
15072
+ display: "block",
15073
+ pointerEvents: "none",
15074
+ userSelect: "none"
15075
+ };
14815
15076
  var contentStyle15 = {
15077
+ display: "flex",
15078
+ flexDirection: "column",
15079
+ alignItems: "center",
15080
+ gap: 16,
15081
+ paddingTop: 8,
14816
15082
  flex: 1,
14817
15083
  minHeight: 0,
15084
+ width: "100%"
15085
+ };
15086
+ var headingStyle13 = (color) => ({
15087
+ fontSize: 24,
15088
+ fontWeight: 700,
15089
+ lineHeight: "normal",
15090
+ letterSpacing: 0,
15091
+ color,
15092
+ margin: 0,
15093
+ textAlign: "center"
15094
+ });
15095
+ var cardStyle2 = (bg, radius) => ({
15096
+ background: bg,
15097
+ borderRadius: radius,
15098
+ padding: 8,
15099
+ width: "100%",
15100
+ boxSizing: "border-box",
14818
15101
  display: "flex",
14819
15102
  flexDirection: "column",
15103
+ gap: 4
15104
+ });
15105
+ var rowStyle6 = {
15106
+ display: "flex",
14820
15107
  alignItems: "center",
15108
+ gap: 16,
15109
+ padding: "12px 16px 12px 12px",
15110
+ borderRadius: 16,
14821
15111
  width: "100%",
14822
- // ScreenLayout body already applies 24px side padding; +8px here reaches the
14823
- // 32px Figma gutter, with 32px above the logo and a 32px gap to the checklist.
14824
- padding: "32px 8px 0",
14825
- gap: 32
15112
+ boxSizing: "border-box"
14826
15113
  };
14827
- var lockupStyle2 = {
14828
- display: "flex",
15114
+ var completeBadgeStyle = (color) => ({
15115
+ width: 24,
15116
+ height: 24,
15117
+ borderRadius: "50%",
15118
+ background: color,
15119
+ display: "inline-flex",
14829
15120
  alignItems: "center",
14830
- gap: 6,
15121
+ justifyContent: "center",
14831
15122
  flexShrink: 0
14832
- };
14833
- var lockupMarkStyle2 = {
15123
+ });
15124
+ var pendingBadgeStyle = (color) => ({
14834
15125
  width: 24,
14835
15126
  height: 24,
14836
- display: "block"
14837
- };
14838
- var wordmarkStyle3 = (color) => ({
14839
- fontSize: "1.45rem",
14840
- fontWeight: 500,
14841
- letterSpacing: "-0.03em",
14842
- lineHeight: 1,
15127
+ borderRadius: "50%",
15128
+ background: color,
15129
+ flexShrink: 0
15130
+ });
15131
+ var labelStyle7 = (color) => ({
15132
+ fontSize: "1rem",
15133
+ fontWeight: 400,
15134
+ lineHeight: 1.25,
14843
15135
  color
14844
15136
  });
14845
- var stepsFrameStyle = {
14846
- flex: 1,
14847
- minHeight: 0,
15137
+ var footerStackStyle4 = {
14848
15138
  display: "flex",
14849
15139
  flexDirection: "column",
14850
- alignItems: "center",
14851
- justifyContent: "center",
15140
+ gap: 16,
14852
15141
  width: "100%"
14853
15142
  };
14854
- var footerStackStyle4 = {
15143
+ var retryStackStyle = {
14855
15144
  display: "flex",
14856
15145
  flexDirection: "column",
14857
- gap: 8
15146
+ gap: 8,
15147
+ width: "100%"
15148
+ };
15149
+ var lockBannerStyle2 = {
15150
+ display: "flex",
15151
+ alignItems: "flex-start",
15152
+ gap: 16,
15153
+ padding: "12px 16px 12px 12px",
15154
+ borderRadius: 16,
15155
+ width: "100%",
15156
+ boxSizing: "border-box"
14858
15157
  };
15158
+ var lockIconWrapStyle2 = (color) => ({
15159
+ flexShrink: 0,
15160
+ width: 24,
15161
+ height: 24,
15162
+ display: "inline-flex",
15163
+ alignItems: "center",
15164
+ justifyContent: "center",
15165
+ color
15166
+ });
15167
+ var lockBannerTextStyle2 = (color) => ({
15168
+ margin: 0,
15169
+ flex: 1,
15170
+ fontSize: 12,
15171
+ fontWeight: 500,
15172
+ lineHeight: "normal",
15173
+ color
15174
+ });
14859
15175
  function ConfirmSignScreen({
14860
15176
  walletName,
14861
15177
  chainFamily,
@@ -14884,7 +15200,7 @@ function ConfirmSignScreen({
14884
15200
  /* @__PURE__ */ jsx(ScreenHeader, { onLogout }),
14885
15201
  /* @__PURE__ */ jsxs("div", { style: contentStyle16, children: [
14886
15202
  logoSrc ? /* @__PURE__ */ jsx("img", { src: logoSrc, alt: displayName, style: logoStyle3 }) : /* @__PURE__ */ jsx(Spinner, { size: 48 }),
14887
- /* @__PURE__ */ jsx("h2", { style: headingStyle13(tokens.text), children: heading }),
15203
+ /* @__PURE__ */ jsx("h2", { style: headingStyle14(tokens.text), children: heading }),
14888
15204
  /* @__PURE__ */ jsx("p", { style: subtitleStyle10(tokens.textSecondary), children: subtitle }),
14889
15205
  /* @__PURE__ */ jsxs("div", { style: successBadgeStyle(tokens), children: [
14890
15206
  /* @__PURE__ */ jsx("span", { style: checkmarkStyle, children: "\u2713" }),
@@ -14910,7 +15226,7 @@ var logoStyle3 = {
14910
15226
  borderRadius: 14,
14911
15227
  objectFit: "contain"
14912
15228
  };
14913
- var headingStyle13 = (color) => ({
15229
+ var headingStyle14 = (color) => ({
14914
15230
  fontSize: "1.45rem",
14915
15231
  fontWeight: 700,
14916
15232
  letterSpacing: "-0.02em",
@@ -14990,10 +15306,12 @@ function TokenPickerScreen({
14990
15306
  tokenSymbol: source.token.symbol,
14991
15307
  tokenAddress: source.address,
14992
15308
  balance: visibleBalance,
14993
- status: source.token.status
15309
+ status: source.token.status,
15310
+ logoURI: source.token.logoURI
14994
15311
  });
14995
15312
  }
14996
15313
  }
15314
+ const selectedEntryLogo = selectedTokenSymbol ? entries2.find((e) => e.tokenSymbol === selectedTokenSymbol)?.logoURI ?? TOKEN_LOGOS[selectedTokenSymbol] : void 0;
14997
15315
  const handleSelect = (entry) => {
14998
15316
  if (entry.status === "AUTHORIZED") {
14999
15317
  onSelectAuthorized(entry.walletId, entry.tokenSymbol);
@@ -15020,7 +15338,7 @@ function TokenPickerScreen({
15020
15338
  onClick: onBack,
15021
15339
  style: tokenIconButtonStyle,
15022
15340
  children: [
15023
- /* @__PURE__ */ jsx("div", { style: tokenIconWrapStyle, children: selectedTokenSymbol && TOKEN_LOGOS[selectedTokenSymbol] ? /* @__PURE__ */ jsx("img", { src: TOKEN_LOGOS[selectedTokenSymbol], alt: selectedTokenSymbol, width: 36, height: 36, style: { borderRadius: "50%" } }) : /* @__PURE__ */ jsxs("svg", { width: "36", height: "36", viewBox: "0 0 36 36", fill: "none", children: [
15341
+ /* @__PURE__ */ jsx("div", { style: tokenIconWrapStyle, children: selectedEntryLogo ? /* @__PURE__ */ jsx("img", { src: selectedEntryLogo, alt: selectedTokenSymbol, width: 36, height: 36, style: { borderRadius: "50%" } }) : /* @__PURE__ */ jsxs("svg", { width: "36", height: "36", viewBox: "0 0 36 36", fill: "none", children: [
15024
15342
  /* @__PURE__ */ jsx("circle", { cx: "18", cy: "18", r: "18", fill: "#2DB84B" }),
15025
15343
  /* @__PURE__ */ jsx("text", { x: "18", y: "23", textAnchor: "middle", fontSize: "18", fill: "#fff", fontWeight: "700", children: "$" })
15026
15344
  ] }) }),
@@ -15034,6 +15352,7 @@ function TokenPickerScreen({
15034
15352
  /* @__PURE__ */ jsx("div", { style: tokenListStyle2, children: entries2.map((entry) => {
15035
15353
  const authorized = entry.status === "AUTHORIZED";
15036
15354
  const isSelected = entry.walletId === selectedWalletId && entry.tokenSymbol === selectedTokenSymbol;
15355
+ const entryLogo = entry.logoURI ?? TOKEN_LOGOS[entry.tokenSymbol];
15037
15356
  return /* @__PURE__ */ jsxs(
15038
15357
  "button",
15039
15358
  {
@@ -15041,7 +15360,7 @@ function TokenPickerScreen({
15041
15360
  onClick: () => handleSelect(entry),
15042
15361
  style: tokenRowStyle2(t),
15043
15362
  children: [
15044
- /* @__PURE__ */ jsx("div", { style: tokenIconCircleStyle2(t, !!TOKEN_LOGOS[entry.tokenSymbol]), children: TOKEN_LOGOS[entry.tokenSymbol] ? /* @__PURE__ */ jsx("img", { src: TOKEN_LOGOS[entry.tokenSymbol], alt: entry.tokenSymbol, style: tokenLogoImgStyle2 }) : /* @__PURE__ */ jsx("span", { style: tokenIconTextStyle2(t.textMuted), children: "$" }) }),
15363
+ /* @__PURE__ */ jsx("div", { style: tokenIconCircleStyle2(t, !!entryLogo), children: entryLogo ? /* @__PURE__ */ jsx("img", { src: entryLogo, alt: entry.tokenSymbol, style: tokenLogoImgStyle2 }) : /* @__PURE__ */ jsx("span", { style: tokenIconTextStyle2(t.textMuted), children: "$" }) }),
15045
15364
  /* @__PURE__ */ jsxs("div", { style: tokenInfoStyle2, children: [
15046
15365
  /* @__PURE__ */ jsxs("div", { style: tokenNameRowStyle, children: [
15047
15366
  /* @__PURE__ */ jsx("span", { style: tokenSymbolTextStyle(t.text), children: entry.tokenSymbol }),
@@ -15272,10 +15591,10 @@ function GuestTokenPickerScreen({
15272
15591
  children: [
15273
15592
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
15274
15593
  /* @__PURE__ */ jsxs("div", { style: contentStyle17, children: [
15275
- /* @__PURE__ */ jsx("h2", { style: headingStyle14(tokens.text), children: title }),
15594
+ /* @__PURE__ */ jsx("h2", { style: headingStyle15(tokens.text), children: title }),
15276
15595
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle8(tokens), children: error }),
15277
15596
  entries2.length === 0 ? /* @__PURE__ */ jsx("p", { style: subtitleStyle11(tokens.textMuted), children: emptyMessage ?? "No tokens available." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15278
- /* @__PURE__ */ jsx("label", { style: labelStyle7(tokens.textSecondary), children: "Token" }),
15597
+ /* @__PURE__ */ jsx("label", { style: labelStyle8(tokens.textSecondary), children: "Token" }),
15279
15598
  /* @__PURE__ */ jsx(
15280
15599
  "button",
15281
15600
  {
@@ -15355,7 +15674,7 @@ var contentStyle17 = {
15355
15674
  padding: "0 20px 16px",
15356
15675
  gap: 12
15357
15676
  };
15358
- var headingStyle14 = (color) => ({
15677
+ var headingStyle15 = (color) => ({
15359
15678
  fontSize: "1.25rem",
15360
15679
  fontWeight: 700,
15361
15680
  color,
@@ -15367,7 +15686,7 @@ var subtitleStyle11 = (color) => ({
15367
15686
  color,
15368
15687
  textAlign: "center"
15369
15688
  });
15370
- var labelStyle7 = (color) => ({
15689
+ var labelStyle8 = (color) => ({
15371
15690
  fontSize: "0.75rem",
15372
15691
  fontWeight: 600,
15373
15692
  color,
@@ -15500,7 +15819,7 @@ function ManualTransferFlow({
15500
15819
  screenContent = /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(PrimaryButton, { onClick: onBack, children: "Back" }), children: [
15501
15820
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
15502
15821
  /* @__PURE__ */ jsxs("div", { style: contentStyle18, children: [
15503
- /* @__PURE__ */ jsx("h2", { style: headingStyle15(tokens.text), children: "Manual transfer unavailable" }),
15822
+ /* @__PURE__ */ jsx("h2", { style: headingStyle16(tokens.text), children: "Manual transfer unavailable" }),
15504
15823
  /* @__PURE__ */ jsx("p", { style: bodyStyle5(tokens.textMuted), children: "merchantAuthorization is required." })
15505
15824
  ] })
15506
15825
  ] });
@@ -15579,7 +15898,7 @@ var contentStyle18 = {
15579
15898
  paddingBottom: 24,
15580
15899
  width: "100%"
15581
15900
  };
15582
- var headingStyle15 = (color) => ({
15901
+ var headingStyle16 = (color) => ({
15583
15902
  color,
15584
15903
  fontSize: "2rem",
15585
15904
  lineHeight: 1.05,
@@ -15604,7 +15923,7 @@ function GenericLoadingShimmer() {
15604
15923
  role: "status",
15605
15924
  "aria-label": "Loading payment flow",
15606
15925
  "aria-busy": "true",
15607
- style: sheetStyle(tokens),
15926
+ style: sheetStyle2(tokens),
15608
15927
  children: [
15609
15928
  /* @__PURE__ */ jsx("style", { children: `
15610
15929
  @keyframes blink-loading-shimmer {
@@ -15650,7 +15969,7 @@ function ShimmerBlock2({
15650
15969
  }
15651
15970
  );
15652
15971
  }
15653
- var sheetStyle = (tokens) => ({
15972
+ var sheetStyle2 = (tokens) => ({
15654
15973
  display: "flex",
15655
15974
  flexDirection: "column",
15656
15975
  height: "100%",
@@ -15697,12 +16016,12 @@ function buildLoginScreenProps({ flow, handlers }) {
15697
16016
  }
15698
16017
  function buildDepositOptionsScreenProps({ flow, handlers }) {
15699
16018
  return {
15700
- // "From Wallet" routes through REQUEST_LOGIN (handlers.onLogin) so the
15701
- // existing login path runs unchanged.
15702
- onFromWallet: handlers.onLogin,
15703
- // "To Address" navigates to the manual-transfer flow.
16019
+ // "Send Crypto Manually" navigates to the manual-transfer flow.
15704
16020
  onToAddress: () => handlers.onSetPhase({ step: "manual-transfer" }),
15705
- onSignInWithBlink: handlers.onLoginWithPasskey,
16021
+ // The primary CTA routes to the login screen (credential selection) rather
16022
+ // than prompting for a passkey directly, matching the connect-wallet entry
16023
+ // point. onLogin dispatches REQUEST_LOGIN → step 'login' → LoginScreen.
16024
+ onSignInWithBlink: handlers.onLogin,
15706
16025
  // Deposit-options is the root screen for the full-widget flow, so the
15707
16026
  // top-right (X) closes the widget through the same `onBack` the host
15708
16027
  // provides. Falling back to `undefined` hides the close button when the
@@ -15794,7 +16113,8 @@ function buildApprovingInWalletScreenProps({
15794
16113
  chainName: setupToken?.chainName ?? null,
15795
16114
  step,
15796
16115
  error: flow.state.error || remote.authExecutorError,
15797
- onRetry: handlers.onRetryAuthorization
16116
+ onRetry: handlers.onRetryAuthorization,
16117
+ onLogout: flow.isDesktop ? handlers.onLogout : void 0
15798
16118
  };
15799
16119
  }
15800
16120
  function buildLinkTokensScreenProps({
@@ -15927,7 +16247,8 @@ function buildDepositScreenProps({
15927
16247
  status: source.token.status,
15928
16248
  tokenAddress: source.address,
15929
16249
  chainId: chain?.commonId ?? void 0,
15930
- accountId: account.id
16250
+ accountId: account.id,
16251
+ logoURI: source.token.logoURI
15931
16252
  });
15932
16253
  }
15933
16254
  }
@@ -15980,6 +16301,7 @@ function buildDepositScreenProps({
15980
16301
  },
15981
16302
  selectedTokenSymbol: selectedSource?.token.symbol,
15982
16303
  selectedChainName: selectedWallet?.chain.name,
16304
+ selectedTokenLogoUri: selectedSource?.token.logoURI,
15983
16305
  selectedWalletId: selectedWallet?.id ?? null,
15984
16306
  selectedTokenStatus,
15985
16307
  onAuthorizeSelectedToken,
@@ -19377,12 +19699,20 @@ function BlinkPaymentInner({
19377
19699
  dispatch,
19378
19700
  orchestrator
19379
19701
  ]);
19702
+ const disconnectWallets = useCallback(async () => {
19703
+ await Promise.allSettled([
19704
+ revokeAndDisconnectActiveWagmiConnector(wagmiConfig),
19705
+ authExecutor.resetWalletConnect().catch(() => {
19706
+ }),
19707
+ disconnectSolanaWallet()
19708
+ ]);
19709
+ }, [authExecutor, wagmiConfig]);
19380
19710
  const handleBackFromSetupDeposit = useCallback(async () => {
19381
19711
  orchestrator.cancelPendingFlow();
19382
19712
  authExecutor.cancelPendingExecution();
19383
19713
  clearScreenErrors();
19384
19714
  if (isDesktop) {
19385
- await revokeAndDisconnectActiveWagmiConnector(wagmiConfig);
19715
+ await disconnectWallets();
19386
19716
  }
19387
19717
  dispatch({ type: "RESTORE_SELECTION" });
19388
19718
  dispatch({ type: "CLEAR_SETUP_DEPOSIT_TOKEN" });
@@ -19390,7 +19720,7 @@ function BlinkPaymentInner({
19390
19720
  dispatch({ type: "DESKTOP_WAIT_CLEARED" });
19391
19721
  dispatch({ type: "SET_STANDARD_DESKTOP_INLINE_OPEN_WALLET", value: false });
19392
19722
  dispatch({ type: "SET_USER_INTENT", intent: { step: "wallet-picker", reason: "switch" } });
19393
- }, [authExecutor, clearScreenErrors, orchestrator, dispatch, isDesktop, wagmiConfig]);
19723
+ }, [authExecutor, clearScreenErrors, orchestrator, dispatch, isDesktop, disconnectWallets]);
19394
19724
  const handleAuthorizationRetry = useCallback(() => {
19395
19725
  void (async () => {
19396
19726
  try {
@@ -19435,11 +19765,7 @@ function BlinkPaymentInner({
19435
19765
  dispatch({ type: "DESKTOP_WAIT_CLEARED" });
19436
19766
  dispatch({ type: "SET_STANDARD_DESKTOP_INLINE_OPEN_WALLET", value: false });
19437
19767
  dispatch({ type: "SET_USER_INTENT", intent: { step: "wallet-picker", reason: "switch" } });
19438
- void (async () => {
19439
- await revokeAndDisconnectActiveWagmiConnector(wagmiConfig);
19440
- await authExecutor.resetWalletConnect().catch(() => {
19441
- });
19442
- })();
19768
+ void disconnectWallets();
19443
19769
  },
19444
19770
  onSendManually: () => handleSetPhase({ step: "manual-transfer" }),
19445
19771
  onBackFromSetupDeposit: handleBackFromSetupDeposit,
@@ -19486,7 +19812,7 @@ function BlinkPaymentInner({
19486
19812
  handleConfirmSetupDeposit,
19487
19813
  handleBackFromSetupDeposit,
19488
19814
  handleAuthorizationRetry,
19489
- wagmiConfig
19815
+ disconnectWallets
19490
19816
  ]);
19491
19817
  return /* @__PURE__ */ jsx(EffectiveDepositAmountProvider, { value: effectiveDepositAmount, children: /* @__PURE__ */ jsx(
19492
19818
  ManualTransferSessionProvider,
@@ -19556,25 +19882,6 @@ function BlinkPaymentInner({
19556
19882
  ) });
19557
19883
  }
19558
19884
 
19559
- // src/deviceBiometricUnlockText.ts
19560
- var FALLBACK = "Biometric verification";
19561
- function getDeviceBiometricUnlockText() {
19562
- const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
19563
- if (/iPhone|iPad|iPod/i.test(ua)) {
19564
- return "Face ID";
19565
- }
19566
- if (/Android/i.test(ua)) {
19567
- return "Fingerprint or face unlock";
19568
- }
19569
- if (/Windows NT/i.test(ua)) {
19570
- return "Windows Hello";
19571
- }
19572
- if (/Macintosh|Mac OS X/i.test(ua)) {
19573
- return "Touch ID";
19574
- }
19575
- return FALLBACK;
19576
- }
19577
-
19578
- export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, 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, useTransferPolling, useTransferSigning };
19885
+ export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, 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, useTransferPolling, useTransferSigning };
19579
19886
  //# sourceMappingURL=index.js.map
19580
19887
  //# sourceMappingURL=index.js.map