@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.cjs +853 -545
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +52 -6
- package/dist/index.d.ts +52 -6
- package/dist/index.js +853 -546
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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 ??
|
|
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
|
-
|
|
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
|
|
10653
|
-
|
|
10654
|
-
{
|
|
10655
|
-
|
|
10656
|
-
|
|
10657
|
-
|
|
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
|
-
|
|
10663
|
-
|
|
10664
|
-
|
|
10665
|
-
|
|
10666
|
-
|
|
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
|
-
|
|
10671
|
-
|
|
10672
|
-
|
|
10673
|
-
|
|
10674
|
-
|
|
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
|
-
|
|
10680
|
-
|
|
10681
|
-
|
|
10682
|
-
|
|
10683
|
-
{
|
|
10684
|
-
|
|
10685
|
-
|
|
10686
|
-
|
|
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__ */
|
|
10692
|
-
|
|
10693
|
-
|
|
10694
|
-
|
|
10695
|
-
|
|
10696
|
-
|
|
10697
|
-
|
|
10698
|
-
|
|
10699
|
-
|
|
10700
|
-
|
|
10701
|
-
|
|
10702
|
-
|
|
10703
|
-
|
|
10704
|
-
|
|
10705
|
-
|
|
10706
|
-
|
|
10707
|
-
|
|
10708
|
-
|
|
10709
|
-
|
|
10710
|
-
|
|
10711
|
-
|
|
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
|
|
10770
|
-
return /* @__PURE__ */
|
|
10771
|
-
"
|
|
10882
|
+
function QrIcon({ color }) {
|
|
10883
|
+
return /* @__PURE__ */ jsxs(
|
|
10884
|
+
"svg",
|
|
10772
10885
|
{
|
|
10773
|
-
|
|
10774
|
-
|
|
10886
|
+
width: "24",
|
|
10887
|
+
height: "24",
|
|
10888
|
+
viewBox: "0 0 24 24",
|
|
10889
|
+
fill: "none",
|
|
10775
10890
|
"aria-hidden": "true",
|
|
10776
|
-
style:
|
|
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
|
-
|
|
10781
|
-
|
|
10782
|
-
|
|
10783
|
-
|
|
10784
|
-
|
|
10785
|
-
|
|
10786
|
-
|
|
10787
|
-
|
|
10788
|
-
|
|
10789
|
-
|
|
10790
|
-
|
|
10791
|
-
|
|
10792
|
-
|
|
10793
|
-
|
|
10794
|
-
|
|
10795
|
-
|
|
10796
|
-
|
|
10797
|
-
|
|
10798
|
-
|
|
10799
|
-
|
|
10800
|
-
|
|
10801
|
-
|
|
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
|
|
10940
|
+
var stackStyle = {
|
|
10863
10941
|
display: "flex",
|
|
10864
10942
|
flexDirection: "column",
|
|
10865
|
-
gap:
|
|
10866
|
-
|
|
10943
|
+
gap: 16,
|
|
10944
|
+
width: "100%"
|
|
10867
10945
|
};
|
|
10868
|
-
var
|
|
10946
|
+
var depositPillWrapperStyle = {
|
|
10947
|
+
position: "relative",
|
|
10948
|
+
width: "100%",
|
|
10949
|
+
height: 71
|
|
10950
|
+
};
|
|
10951
|
+
var depositPillStyle = (bg) => ({
|
|
10869
10952
|
display: "flex",
|
|
10870
|
-
|
|
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
|
-
|
|
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
|
|
10876
|
-
display: "
|
|
11014
|
+
var dividerRowStyle = {
|
|
11015
|
+
display: "flex",
|
|
10877
11016
|
alignItems: "center",
|
|
10878
11017
|
justifyContent: "center",
|
|
10879
|
-
|
|
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:
|
|
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
|
|
11034
|
+
var manualRowStyle = (bg) => ({
|
|
10890
11035
|
display: "flex",
|
|
10891
|
-
alignItems: "center"
|
|
10892
|
-
|
|
10893
|
-
|
|
10894
|
-
|
|
10895
|
-
|
|
10896
|
-
|
|
10897
|
-
|
|
10898
|
-
|
|
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
|
|
10901
|
-
|
|
10902
|
-
|
|
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:
|
|
10906
|
-
color
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
12629
|
-
|
|
12630
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
14949
|
+
const token = tokenSymbol ?? "token";
|
|
14950
|
+
const steps = buildSteps(step, tokenSymbol, chainName);
|
|
14951
|
+
return /* @__PURE__ */ jsxs(
|
|
14774
14952
|
ScreenLayout,
|
|
14775
14953
|
{
|
|
14776
|
-
|
|
14777
|
-
|
|
14778
|
-
/* @__PURE__ */
|
|
14779
|
-
|
|
14780
|
-
|
|
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__ */
|
|
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
|
-
|
|
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
|
|
14828
|
-
|
|
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
|
-
|
|
15121
|
+
justifyContent: "center",
|
|
14831
15122
|
flexShrink: 0
|
|
14832
|
-
};
|
|
14833
|
-
var
|
|
15123
|
+
});
|
|
15124
|
+
var pendingBadgeStyle = (color) => ({
|
|
14834
15125
|
width: 24,
|
|
14835
15126
|
height: 24,
|
|
14836
|
-
|
|
14837
|
-
|
|
14838
|
-
|
|
14839
|
-
|
|
14840
|
-
|
|
14841
|
-
|
|
14842
|
-
|
|
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
|
|
14846
|
-
flex: 1,
|
|
14847
|
-
minHeight: 0,
|
|
15137
|
+
var footerStackStyle4 = {
|
|
14848
15138
|
display: "flex",
|
|
14849
15139
|
flexDirection: "column",
|
|
14850
|
-
|
|
14851
|
-
justifyContent: "center",
|
|
15140
|
+
gap: 16,
|
|
14852
15141
|
width: "100%"
|
|
14853
15142
|
};
|
|
14854
|
-
var
|
|
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:
|
|
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
|
|
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:
|
|
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, !!
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
// "
|
|
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
|
-
|
|
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
|
|
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,
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|