@swype-org/react-sdk 0.2.377 → 0.2.399

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.d.ts CHANGED
@@ -48,8 +48,15 @@ interface Wallet {
48
48
  id: string;
49
49
  name: string;
50
50
  status: string;
51
- sources: WalletSource[];
52
- balance: TokenBalance;
51
+ /**
52
+ * Token-level balances. Absent on the response from `GET /v1/accounts` and
53
+ * `GET /v1/accounts/:id` — those are DB-only/fast and never issue balance
54
+ * RPC. Populated by `GET /v1/accounts/:id/balances` (fetched separately and
55
+ * merged in). Treat `undefined` as "balances still loading" → shimmer.
56
+ */
57
+ sources?: WalletSource[];
58
+ /** Wallet-level aggregate balance. Absent until balances are merged in (see `sources`). */
59
+ balance?: TokenBalance;
53
60
  chain: {
54
61
  id: string;
55
62
  name: string;
@@ -60,6 +67,16 @@ interface Wallet {
60
67
  updateDate: string;
61
68
  authorizationSessions?: AuthorizationSession[];
62
69
  }
70
+ /** Balance-bearing slice of a wallet from `GET /v1/accounts/:id/balances`. */
71
+ interface WalletBalances {
72
+ id: string;
73
+ balance: TokenBalance;
74
+ sources: WalletSource[];
75
+ }
76
+ /** Response of `GET /v1/accounts/:id/balances`. */
77
+ interface AccountBalances {
78
+ wallets: WalletBalances[];
79
+ }
63
80
  /** Connected account containing wallets */
64
81
  interface Account {
65
82
  /**
@@ -140,6 +157,13 @@ interface AuthorizationSessionDetail {
140
157
  defaultAllowance?: number;
141
158
  selectedTokenAddress?: string;
142
159
  selectedChainId?: number;
160
+ /**
161
+ * Deployed Blink smart-account (SCA) address for the user on the session's
162
+ * EVM chain. Surfaced by the backend at the session level so the approval
163
+ * screen can show the "Your Blink Passkey" destination before signing
164
+ * begins. Absent for Solana sessions and until a smart account exists.
165
+ */
166
+ smartAccountAddress?: string;
143
167
  paymentIntent?: {
144
168
  idempotencyKey: string;
145
169
  amount: number;
@@ -399,6 +423,10 @@ interface ThemeTokens {
399
423
  radius: string;
400
424
  radiusLg: string;
401
425
  fontFamily: string;
426
+ fontWeightRegular: number;
427
+ fontWeightMedium: number;
428
+ fontWeightSemibold: number;
429
+ fontWeightBold: number;
402
430
  }
403
431
  declare const darkTheme: ThemeTokens;
404
432
  declare const lightTheme: ThemeTokens;
@@ -527,6 +555,14 @@ declare function fetchProviders(apiBaseUrl: string, token?: string | null): Prom
527
555
  declare function fetchChains(apiBaseUrl: string, token: string): Promise<Chain[]>;
528
556
  declare function fetchAccounts(apiBaseUrl: string, token: string, credentialId: string): Promise<Account[]>;
529
557
  declare function fetchAccount(apiBaseUrl: string, token: string, accountId: string, credentialId: string): Promise<Account>;
558
+ /**
559
+ * Fetches live on-chain balances (with DB-cache fallback) and per-source
560
+ * One-Tap allowances for a single account. This is the slow, RPC-bearing path
561
+ * split out of the accounts endpoints — the client fetches it separately from
562
+ * `fetchAccounts` and merges the result into the account so the deposit token
563
+ * picker can shimmer until it lands.
564
+ */
565
+ declare function fetchAccountBalances(apiBaseUrl: string, token: string, accountId: string, credentialId: string): Promise<AccountBalances>;
530
566
  interface CreateAccountParams {
531
567
  /** Caller-supplied UUID v4 for idempotency. If omitted, a random UUID is generated. */
532
568
  id?: string;
@@ -644,9 +680,16 @@ declare function fetchUserConfig(apiBaseUrl: string, token: string): Promise<{
644
680
  id: string;
645
681
  config: UserConfig;
646
682
  }>;
647
- declare function updateUserConfig(apiBaseUrl: string, token: string, config: {
648
- defaultAllowance: number;
649
- }): Promise<void>;
683
+ /**
684
+ * Spending-limit config patch. `unlimitedAllowance: true` requests the per-chain
685
+ * on-chain maximum (resolved server-side); a numeric `defaultAllowance` (USD)
686
+ * requests that cap. At least one field must be present.
687
+ */
688
+ type SpendingLimitConfig = {
689
+ defaultAllowance?: number;
690
+ unlimitedAllowance?: boolean;
691
+ };
692
+ declare function updateUserConfig(apiBaseUrl: string, token: string, config: SpendingLimitConfig): Promise<void>;
650
693
  /**
651
694
  * Binds a wallet provider to a previously provider-less authorization
652
695
  * session. Used by the mobile wallet picker once the user taps a specific
@@ -680,9 +723,7 @@ declare function setAuthorizationSessionPaymentIntentAmount(apiBaseUrl: string,
680
723
  * linked user yet (e.g. guest account setup), config is stored on the session
681
724
  * and used as the account allowance until the user is claimed.
682
725
  */
683
- declare function updateUserConfigBySession(apiBaseUrl: string, sessionId: string, config: {
684
- defaultAllowance: number;
685
- }): Promise<void>;
726
+ declare function updateUserConfigBySession(apiBaseUrl: string, sessionId: string, config: SpendingLimitConfig): Promise<void>;
686
727
  interface FetchManualTransferSourcesParams {
687
728
  merchantAuthorization: MerchantAuthorization;
688
729
  destination: Destination;
@@ -763,12 +804,14 @@ type api_CreateTransferParams = CreateTransferParams;
763
804
  type api_FetchManualTransferSourcesParams = FetchManualTransferSourcesParams;
764
805
  type api_ProbeActionCompletionResult = ProbeActionCompletionResult;
765
806
  type api_RefreshManualTransferQuoteResult = RefreshManualTransferQuoteResult;
807
+ type api_SpendingLimitConfig = SpendingLimitConfig;
766
808
  type api_TransferQuote = TransferQuote;
767
809
  declare const api_createAccount: typeof createAccount;
768
810
  declare const api_createAccountAuthorizationSession: typeof createAccountAuthorizationSession;
769
811
  declare const api_createManualTransfer: typeof createManualTransfer;
770
812
  declare const api_createTransfer: typeof createTransfer;
771
813
  declare const api_fetchAccount: typeof fetchAccount;
814
+ declare const api_fetchAccountBalances: typeof fetchAccountBalances;
772
815
  declare const api_fetchAccounts: typeof fetchAccounts;
773
816
  declare const api_fetchAuthorizationSession: typeof fetchAuthorizationSession;
774
817
  declare const api_fetchAuthorizationSessionByToken: typeof fetchAuthorizationSessionByToken;
@@ -794,7 +837,7 @@ declare const api_updateUserConfig: typeof updateUserConfig;
794
837
  declare const api_updateUserConfigBySession: typeof updateUserConfigBySession;
795
838
  declare const api_waitForActionTransactionReceipt: typeof waitForActionTransactionReceipt;
796
839
  declare namespace api {
797
- export { type api_ActionTransactionReceiptWaitResult as ActionTransactionReceiptWaitResult, type api_BridgeCall as BridgeCall, type api_CreateAccountAuthorizationSessionOptions as CreateAccountAuthorizationSessionOptions, type api_CreateAccountParams as CreateAccountParams, type api_CreateManualTransferParams as CreateManualTransferParams, type api_CreateTransferParams as CreateTransferParams, type api_FetchManualTransferSourcesParams as FetchManualTransferSourcesParams, type api_ProbeActionCompletionResult as ProbeActionCompletionResult, type api_RefreshManualTransferQuoteResult as RefreshManualTransferQuoteResult, type api_TransferQuote as TransferQuote, api_createAccount as createAccount, api_createAccountAuthorizationSession as createAccountAuthorizationSession, api_createManualTransfer as createManualTransfer, api_createTransfer as createTransfer, api_fetchAccount as fetchAccount, api_fetchAccounts as fetchAccounts, api_fetchAuthorizationSession as fetchAuthorizationSession, api_fetchAuthorizationSessionByToken as fetchAuthorizationSessionByToken, api_fetchChains as fetchChains, api_fetchManualTransferSession as fetchManualTransferSession, api_fetchManualTransferSources as fetchManualTransferSources, api_fetchMerchantPublicKey as fetchMerchantPublicKey, api_fetchProviders as fetchProviders, api_fetchTransfer as fetchTransfer, api_fetchUserConfig as fetchUserConfig, api_postTransferQuote as postTransferQuote, api_probeActionCompletion as probeActionCompletion, api_refreshManualTransferQuote as refreshManualTransferQuote, api_regenerateTransferSignPayload as regenerateTransferSignPayload, api_registerPasskey as registerPasskey, api_reportActionCompletion as reportActionCompletion, api_reportPasskeyActivity as reportPasskeyActivity, api_setAuthorizationSessionPaymentIntentAmount as setAuthorizationSessionPaymentIntentAmount, api_setAuthorizationSessionProvider as setAuthorizationSessionProvider, api_signTransfer as signTransfer, api_updateManualTransferDepositTargetChain as updateManualTransferDepositTargetChain, api_updateUserConfig as updateUserConfig, api_updateUserConfigBySession as updateUserConfigBySession, api_waitForActionTransactionReceipt as waitForActionTransactionReceipt };
840
+ export { type api_ActionTransactionReceiptWaitResult as ActionTransactionReceiptWaitResult, type api_BridgeCall as BridgeCall, type api_CreateAccountAuthorizationSessionOptions as CreateAccountAuthorizationSessionOptions, type api_CreateAccountParams as CreateAccountParams, type api_CreateManualTransferParams as CreateManualTransferParams, type api_CreateTransferParams as CreateTransferParams, type api_FetchManualTransferSourcesParams as FetchManualTransferSourcesParams, type api_ProbeActionCompletionResult as ProbeActionCompletionResult, type api_RefreshManualTransferQuoteResult as RefreshManualTransferQuoteResult, type api_SpendingLimitConfig as SpendingLimitConfig, type api_TransferQuote as TransferQuote, api_createAccount as createAccount, api_createAccountAuthorizationSession as createAccountAuthorizationSession, api_createManualTransfer as createManualTransfer, api_createTransfer as createTransfer, api_fetchAccount as fetchAccount, api_fetchAccountBalances as fetchAccountBalances, api_fetchAccounts as fetchAccounts, api_fetchAuthorizationSession as fetchAuthorizationSession, api_fetchAuthorizationSessionByToken as fetchAuthorizationSessionByToken, api_fetchChains as fetchChains, api_fetchManualTransferSession as fetchManualTransferSession, api_fetchManualTransferSources as fetchManualTransferSources, api_fetchMerchantPublicKey as fetchMerchantPublicKey, api_fetchProviders as fetchProviders, api_fetchTransfer as fetchTransfer, api_fetchUserConfig as fetchUserConfig, api_postTransferQuote as postTransferQuote, api_probeActionCompletion as probeActionCompletion, api_refreshManualTransferQuote as refreshManualTransferQuote, api_regenerateTransferSignPayload as regenerateTransferSignPayload, api_registerPasskey as registerPasskey, api_reportActionCompletion as reportActionCompletion, api_reportPasskeyActivity as reportPasskeyActivity, api_setAuthorizationSessionPaymentIntentAmount as setAuthorizationSessionPaymentIntentAmount, api_setAuthorizationSessionProvider as setAuthorizationSessionProvider, api_signTransfer as signTransfer, api_updateManualTransferDepositTargetChain as updateManualTransferDepositTargetChain, api_updateUserConfig as updateUserConfig, api_updateUserConfigBySession as updateUserConfigBySession, api_waitForActionTransactionReceipt as waitForActionTransactionReceipt };
798
841
  }
799
842
 
800
843
  interface BlinkPaymentProps {
@@ -845,6 +888,62 @@ interface SelectSourceChainChoice {
845
888
  }[];
846
889
  }
847
890
 
891
+ interface LinkTokenEntry {
892
+ tokenSymbol: string;
893
+ chainName: string;
894
+ balanceUsd: number;
895
+ /**
896
+ * WalletConnect-only: the connected wallet cannot sign on this token's
897
+ * chain (missing from both the session's approved chains and the Reown
898
+ * registry). Renders the "Not supported, deposit manually" pill and makes
899
+ * the row unselectable.
900
+ *
901
+ * Also set for native gas assets (ETH, MON, SOL, …) that Permit2 / SPL
902
+ * delegate cannot authorize — see `balanceLabel` / `tokenLogoUri` below.
903
+ */
904
+ notSupported?: boolean;
905
+ /**
906
+ * Server-provided token logo URI (Relay CDN). Used for native gas-asset
907
+ * rows; supported stablecoins fall back to the bundled `TOKEN_LOGOS` map.
908
+ */
909
+ tokenLogoUri?: string | null;
910
+ /**
911
+ * Preformatted native-unit balance (e.g. "0.7 SOL"). When set, it renders
912
+ * verbatim on the right instead of the `$X.XX` USD figure.
913
+ */
914
+ balanceLabel?: string;
915
+ }
916
+ /**
917
+ * The spending limit the user confirmed on the summary view. `unlimited`
918
+ * requests the per-chain on-chain maximum (resolved server-side); `usd` is a
919
+ * concrete USD cap.
920
+ */
921
+ type SpendingLimitSelection = {
922
+ unlimited: true;
923
+ } | {
924
+ usd: number;
925
+ };
926
+ interface LinkTokensScreenProps {
927
+ entries: LinkTokenEntry[];
928
+ selectedIndex: number;
929
+ onSelect: (index: number) => void;
930
+ onApprove: (limit: SpendingLimitSelection) => void;
931
+ /** Desktop-only escape hatch back to wallet selection. */
932
+ onBack?: () => void;
933
+ /** Desktop-only settings/logout action. */
934
+ onLogout?: () => void;
935
+ /** Inline error from authorization or wallet. */
936
+ error?: string | null;
937
+ /**
938
+ * True while the orchestrator is still resolving the available token list.
939
+ * Shows shimmer rows in place of real entries.
940
+ */
941
+ loading?: boolean;
942
+ /** Disables the Approve CTA while wallet calls / patches are in flight. */
943
+ approving?: boolean;
944
+ }
945
+ declare function LinkTokensScreen({ entries, selectedIndex, onSelect, onApprove, onBack, onLogout, error, loading, approving, }: LinkTokensScreenProps): react_jsx_runtime.JSX.Element;
946
+
848
947
  type ScreenName = 'loading' | 'manual-transfer' | 'login' | 'welcome-back' | 'success' | 'processing' | 'confirm-sign' | 'select-source' | 'open-wallet' | 'link-tokens' | 'wallet-picker' | 'token-picker' | 'guest-source-picker' | 'amount-too-low' | 'deposit' | 'deposit-options';
849
948
  interface MobileFlowState {
850
949
  deeplinkUri: string;
@@ -1109,6 +1208,18 @@ interface UseAuthorizationExecutorResult {
1109
1208
  approveSplConfirming: AuthorizationAction | null;
1110
1209
  /** The SELECT_SOURCE action when paused for user selection, null otherwise. */
1111
1210
  pendingSelectSource: AuthorizationAction | null;
1211
+ /** True while a signing action is paused waiting for the user to tap "Approve". */
1212
+ awaitingApproval: boolean;
1213
+ /** Destination address (deployed smart account / swig pubkey) resolved for the
1214
+ * paused signing action, for display on the approval screen. Null until known. */
1215
+ approvalDestinationAddress: string | null;
1216
+ /** Pause a signing action until the user approves. Resolves immediately once
1217
+ * the user has already approved earlier in the same run. */
1218
+ waitForApproval: (action: AuthorizationAction, destinationAddress: string | null) => Promise<void>;
1219
+ /** Release the paused signing action (user tapped "Approve"). */
1220
+ approveAuthorization: () => void;
1221
+ /** Reset the approval latch for a fresh authorization run (not a retry). */
1222
+ resetApprovalGate: () => void;
1112
1223
  /** Call this from the UI to provide the user's chain+token choice. */
1113
1224
  resolveSelectSource: (selection: SourceSelection) => void;
1114
1225
  /** Reject paused SELECT_SOURCE and reset executor flags (e.g. user backed to deposit). */
@@ -1316,6 +1427,13 @@ interface OrchestratorRunOptions {
1316
1427
  accounts: readonly string[];
1317
1428
  chainId: number;
1318
1429
  }>;
1430
+ /**
1431
+ * When true, the run keeps the existing manual-approval latch instead of
1432
+ * resetting it. Set by `restart()` so a post-error Retry re-prompts the
1433
+ * wallet without forcing the user to tap "Approve" again; a fresh `run()`
1434
+ * always resets so the user must approve before the first wallet prompt.
1435
+ */
1436
+ keepApprovalGate?: boolean;
1319
1437
  }
1320
1438
  interface UseAuthorizationOrchestratorResult {
1321
1439
  /**
@@ -1359,6 +1477,17 @@ interface UseAuthorizationOrchestratorResult {
1359
1477
  sourceSelectionResolved: boolean;
1360
1478
  /** True after the most recent run drained all authorization actions. */
1361
1479
  orchestratorCompleted: boolean;
1480
+ /**
1481
+ * Live session-level smart-account ("Your Blink Passkey") address for the
1482
+ * action currently being processed, mirrored reactively from the tracked
1483
+ * session so the approval screen can render it the instant the backend
1484
+ * surfaces it — rather than only at the `waitForApproval` gate. Always the
1485
+ * currently-selected chain's address (reset to null at the start of each run),
1486
+ * so it can never show a stale value from a prior selection. Null until the
1487
+ * backend reports it (and for Solana, whose owner pubkey is carried on the
1488
+ * action metadata instead). EVM only.
1489
+ */
1490
+ approvalSmartAccountAddress: string | null;
1362
1491
  /** Cancel any paused setup flow and reject the current orchestrator run. */
1363
1492
  cancelPendingFlow: () => void;
1364
1493
  }
@@ -1376,6 +1505,133 @@ interface WalletAccountChange {
1376
1505
  accounts: readonly string[];
1377
1506
  }
1378
1507
 
1508
+ /**
1509
+ * Cross-origin iframe passkey helpers.
1510
+ *
1511
+ * When the webview-app runs inside a cross-origin iframe, WebAuthn
1512
+ * ceremonies cannot execute from within the iframe on Safari. For passkey
1513
+ * verification (signing) and signup (credential creation), we open a
1514
+ * same-origin pop-up window on the Blink domain to perform the ceremony.
1515
+ */
1516
+ /**
1517
+ * Thrown when `navigator.credentials.create()` fails inside a
1518
+ * cross-origin iframe (Safari). The UI layer should catch this and
1519
+ * offer the user a button that opens the Blink passkey pop-up.
1520
+ */
1521
+ declare class PasskeyIframeBlockedError extends Error {
1522
+ constructor(message?: string);
1523
+ }
1524
+ interface PasskeyVerifyPopupOptions {
1525
+ credentialIds: string[];
1526
+ rpId: string;
1527
+ /** Populated by `findDevicePasskeyViaPopup`; not set by callers. */
1528
+ verificationToken?: string;
1529
+ /** Privy JWT so the popup can report verification server-side. */
1530
+ authToken?: string;
1531
+ /** Core API base URL for server-side passkey activity reporting. */
1532
+ apiBaseUrl?: string;
1533
+ }
1534
+ /**
1535
+ * Opens a same-origin pop-up window on the Blink domain to check whether
1536
+ * any of the given passkey credential IDs exist on this device.
1537
+ *
1538
+ * Used as a fallback when Safari blocks `navigator.credentials.get()`
1539
+ * inside a cross-origin iframe. The popup runs on the Blink domain where
1540
+ * the rpId matches, so WebAuthn works.
1541
+ *
1542
+ * Must be called from a user-gesture handler (e.g. button click) to
1543
+ * avoid the browser's pop-up blocker.
1544
+ *
1545
+ * @returns The matching credential ID, or `null` if none matched or the
1546
+ * popup was closed before completing.
1547
+ */
1548
+ declare function findDevicePasskeyViaPopup(options: PasskeyVerifyPopupOptions): Promise<string | null>;
1549
+
1550
+ /**
1551
+ * Decodes a WebAuthn credential id from the same base64 (or base64url) encoding
1552
+ * used when registering passkeys and returned by the API as `passkeyCredentialId`.
1553
+ */
1554
+ declare function credentialIdBase64ToBytes(value: string): Uint8Array<ArrayBuffer>;
1555
+
1556
+ declare function resolvePasskeyRpId(): string;
1557
+ /**
1558
+ * @deprecated Use {@link findDevicePasskey} instead, which checks all
1559
+ * credentials in a single WebAuthn call.
1560
+ */
1561
+ declare function deviceHasPasskey(credentialId: string): Promise<boolean>;
1562
+ /**
1563
+ * Determines which (if any) of the given server-registered passkeys exists on
1564
+ * the current device. All credential IDs are passed in a single
1565
+ * `navigator.credentials.get()` call so the browser shows at most one prompt
1566
+ * and the platform authenticator automatically selects the matching key.
1567
+ *
1568
+ * @param credentialIds - Base64-encoded WebAuthn credential IDs from the server.
1569
+ * @returns The matching credential ID, or `null` if none are on this device.
1570
+ */
1571
+ declare function findDevicePasskey(credentialIds: string[]): Promise<string | null>;
1572
+
1573
+ interface UseTransferPollingResult {
1574
+ transfer: Transfer | null;
1575
+ error: string | null;
1576
+ isPolling: boolean;
1577
+ startPolling: (transferId: string) => void;
1578
+ stopPolling: () => void;
1579
+ }
1580
+ /**
1581
+ * Polls GET /v1/transfers/{id} until status is COMPLETED or FAILED. Uses an
1582
+ * adaptive interval (see FAST_POLL_COUNT/FAST_POLL_INTERVAL_MS) so the early
1583
+ * polls — when the bridge is most likely to settle — fire quickly while
1584
+ * later polls back off to `intervalMs` to limit API load.
1585
+ */
1586
+ declare function useTransferPolling(intervalMs?: number, overrideGetAccessToken?: () => Promise<string | null>): UseTransferPollingResult;
1587
+
1588
+ type AccessTokenGetter = () => Promise<string | null | undefined>;
1589
+ interface SignTransferOptions {
1590
+ /**
1591
+ * Win 2 hint: when the caller already has a fresh `signPayload` (e.g. from
1592
+ * the POST /v1/transfers response), pass it here to skip the GET poll loop
1593
+ * and proceed directly to the WebAuthn ceremony.
1594
+ */
1595
+ knownSignPayload?: TransferSignPayload | null;
1596
+ }
1597
+ interface UseTransferSigningResult {
1598
+ signing: boolean;
1599
+ signPayload: TransferSignPayload | null;
1600
+ error: string | null;
1601
+ passkeyDismissed: boolean;
1602
+ /**
1603
+ * Starts the signing flow:
1604
+ * 1. Polls GET /v1/transfers/{id} until signPayload is present
1605
+ * (skipped when `opts.knownSignPayload` is provided).
1606
+ * 2. Triggers WebAuthn passkey prompt
1607
+ * 3. Submits signed UserOp via PATCH /v1/transfers/{id}
1608
+ */
1609
+ signTransfer: (transferId: string, opts?: SignTransferOptions) => Promise<Transfer>;
1610
+ /**
1611
+ * Regenerates a fresh SVM sign payload for a transfer whose signing window
1612
+ * expired (POST /v1/transfers/{id}/sign-payload), reusing the same transfer
1613
+ * id. Returns the refreshed Transfer carrying the new signPayload.
1614
+ */
1615
+ regenerateSignPayload: (transferId: string) => Promise<Transfer>;
1616
+ }
1617
+ interface UseTransferSigningOptions {
1618
+ /** Optional API base URL override when used outside BlinkProvider. */
1619
+ apiBaseUrl?: string;
1620
+ /** Optional access-token getter override (e.g. deeplink query token). */
1621
+ getAccessToken?: AccessTokenGetter;
1622
+ /** Optional authorization-session token for session-authenticated transfer signing. */
1623
+ authorizationSessionToken?: string;
1624
+ }
1625
+ /**
1626
+ * Post-authorization transfer signing hook.
1627
+ *
1628
+ * After the auth session completes and the transfer reaches AUTHORIZED,
1629
+ * the backend prepares a signPayload containing the unsigned UserOp.
1630
+ * This hook polls for it, prompts the user's passkey via WebAuthn, and
1631
+ * submits the signed UserOp back to the API.
1632
+ */
1633
+ declare function useTransferSigning(pollIntervalMs?: number, options?: UseTransferSigningOptions): UseTransferSigningResult;
1634
+
1379
1635
  interface ReownWallet {
1380
1636
  id: string;
1381
1637
  name: string;
@@ -1445,6 +1701,14 @@ interface PaymentState {
1445
1701
  accounts: Account[];
1446
1702
  chains: Chain[];
1447
1703
  loadingData: boolean;
1704
+ /**
1705
+ * True while wallet balances are still being fetched (the accounts endpoint
1706
+ * is now balance-free; balances arrive via a separate per-account call and
1707
+ * are merged in by `BALANCES_LOADED`). Drives the deposit screen's
1708
+ * balance-pill / token-row shimmer. Set true by `DATA_LOADED` /
1709
+ * `ACCOUNTS_RELOADED`, cleared by `BALANCES_LOADED`.
1710
+ */
1711
+ balancesLoading: boolean;
1448
1712
  /** True while the deposit screen is refreshing account/token data in place. */
1449
1713
  depositSelectionRefreshing: boolean;
1450
1714
  selectedProviderId: string | null;
@@ -1550,6 +1814,10 @@ interface PaymentState {
1550
1814
  tokenAddress?: string;
1551
1815
  chainId?: number;
1552
1816
  } | null;
1817
+ /** Lifetime spending limit the user confirmed on LinkTokensScreen. Surfaced on
1818
+ * ApprovingInWalletScreen's source row in place of the wallet address. Null
1819
+ * until the user confirms a limit, and cleared when the setup flow ends. */
1820
+ setupSpendingLimit: SpendingLimitSelection | null;
1553
1821
  /**
1554
1822
  * Mobile picker pre-prepare: a single speculative `createAccount` is fired on mount
1555
1823
  * when the wallet-picker is about to render on mobile. Its `walletDeeplinks`
@@ -1615,1145 +1883,1017 @@ interface InitialStateConfig {
1615
1883
  }
1616
1884
  declare function createInitialState(config: InitialStateConfig): PaymentState;
1617
1885
 
1618
- interface StepHandlers {
1886
+ interface LoginScreenProps {
1619
1887
  onLoginWithPasskey: () => void;
1620
1888
  onSignupWithPasskey: () => void;
1621
- onPrepareProvider: (providerId: string) => Promise<PreparedSession | null>;
1622
- onSelectProvider: (providerId: string, preparedSession?: PreparedSession) => Promise<void>;
1623
- onSelectWalletConnectWallet?: (wallet: ReownWallet) => Promise<void>;
1624
- onContinueConnection: (accountId: string) => void;
1625
- onSelectAccount: (accountId: string) => void;
1626
- onPay: (amount: number, overrides?: {
1627
- sourceType: SourceType;
1628
- sourceId: string;
1629
- }) => void;
1630
- onIncreaseLimit: () => void;
1631
- onConfirmSign: () => void;
1632
- onRetryMobileStatus: () => void;
1633
- /** Soft-retry the orchestrator (calls `orchestrator.restart()`) without reloading the page. */
1634
- onRetryAuthorization: () => void;
1635
- /** Re-run passkey signing for an already-created, signable transfer. */
1636
- onRetryTransferSigning: () => void;
1637
- onBackFromOpenWallet: () => void;
1638
- onLogout: () => void;
1639
- onNewPayment: () => void;
1640
- onSetPhase: (phase: PaymentPhase) => void;
1641
- onSelectSourceChainChange: (chainName: string) => void;
1642
- onSetSelectSourceTokenSymbol: (symbol: string) => void;
1643
- onConfirmSelectSource: () => void;
1644
- onSelectToken: () => void;
1645
- onSelectAuthorizedToken: (walletId: string, tokenSymbol: string, accountId?: string) => void;
1646
- onAuthorizeToken: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => void;
1647
- onPrepareTokenAuthorization: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => Promise<PreparedTokenAuthorization | null>;
1648
- onCommitTokenAuthorization: (prepared: PreparedTokenAuthorization) => void;
1649
- /** Navigate to wallet-picker when adding a new account from the deposit screen. */
1650
- onAddProviderFromDeposit: () => void;
1889
+ loading: boolean;
1890
+ error: string | null;
1891
+ onBack?: () => void;
1892
+ /** Dismiss the sheet. When set, the header shows a round (X) close button in the top-right instead of the back arrow. */
1893
+ onClose?: () => void;
1894
+ merchantInitials?: string;
1895
+ /** Overrides the default marketing heading when set (e.g. passkey popup copy). When set, the passkey info card is suppressed. */
1896
+ heroTitle?: string;
1897
+ /** Optional line shown under the heading. Reserved for callers that override `heroTitle`. */
1898
+ heroSubtitle?: string;
1899
+ /** When true, primary action is signup and secondary is sign-in. */
1900
+ preferSignup?: boolean;
1901
+ }
1902
+ declare function LoginScreen({ onLoginWithPasskey, onSignupWithPasskey, loading, error, onBack, onClose, merchantInitials, heroTitle, heroSubtitle, preferSignup, }: LoginScreenProps): react_jsx_runtime.JSX.Element;
1903
+
1904
+ interface DepositOptionsScreenProps {
1905
+ /** Recessed "Send Crypto Manually" row. Navigates to the manual-transfer flow. */
1906
+ onToAddress: () => void;
1651
1907
  /**
1652
- * Tapped from the "Send manually" action row in the inline source sheet.
1653
- * Currently a no-op placeholder; reserved for the manual-transfer entry point.
1908
+ * Primary "Deposit stablecoins" CTA. Routes to the login screen (wired to
1909
+ * handlers.onLogin) rather than prompting for a passkey directly, mirroring how
1910
+ * the connect-wallet entry point defers credential selection to LoginScreen.
1654
1911
  */
1655
- onSendManually: () => void;
1656
- /** Leave desktop link-tokens back to wallet selection, cancelling the paused auth run. */
1657
- onBackFromSetupDeposit: () => void;
1658
- /** Leave funding subflow (setup / token picker) back to deposit: restore selection, cancel executor. */
1659
- onBackFromSubflow: () => void;
1660
- onLogin: () => void;
1661
- onCancelLogin: () => void;
1662
- /** Advance a returning user off WelcomeBackScreen toward the wallet picker. */
1663
- onAcknowledgeWelcomeBack: () => void;
1664
- /** Back from WalletPickerScreen: return a walletless user to WelcomeBackScreen. */
1665
- onReturnToWelcomeBack: () => void;
1666
- /**
1667
- * Update the in-flow amount-entry value (string display). Called by
1668
- * DepositScreen entry mode on every keypress / preset tap. The view-model
1669
- * wires pure helpers (`enterAmountInput.ts`) into this handler so the
1670
- * component itself stays presentational.
1671
- */
1672
- onAmountInput: (value: string) => void;
1673
- /**
1674
- * Commit the in-flow amount-entry value and clear `requireAmountEntry`.
1675
- * Routes the user past entry mode back into the normal deposit flow.
1676
- */
1677
- onFinalizeAmount: () => void;
1678
- onSetDepositToken: (symbol: string, chainName: string, walletId?: string, tokenAddress?: string, chainId?: number) => void;
1679
- onConfirmSetupDeposit: () => void | Promise<void>;
1680
- /**
1681
- * Mobile only: foreground the already-connected WalletConnect wallet from the
1682
- * signing screen's manual "Open {wallet}" button. Opens the bare wallet
1683
- * deeplink (no `wc:` URI) so the pending Permit2 prompt surfaces without
1684
- * re-pairing. Undefined on desktop / when no foreground link is available.
1685
- */
1686
- onOpenWalletForeground?: () => void;
1687
- }
1688
- /** Flow identity: reducer state, auth, layout. */
1689
- interface StepRendererFlowProps {
1690
- state: PaymentState;
1691
- authenticated: boolean;
1692
- passkeyLoading: boolean;
1693
- isDesktop: boolean;
1694
- /**
1695
- * True when the SDK is hosted inside a native mobile app's in-app browser.
1696
- * Suppresses in-screen (X) close buttons (the host's native chrome handles
1697
- * dismissal) and removes rounded screen corners. Optional for backwards
1698
- * compatibility with pre-existing test fixtures; treated as `false` when
1699
- * absent.
1700
- */
1701
- isMobileApp?: boolean;
1702
- merchantName?: string;
1703
- onBack?: () => void;
1704
- onDismiss?: () => void;
1705
- /** Merchant-fixed depositAmount, or `null` for the hosted entry-mode flow. */
1706
- depositAmount: number | null;
1707
- /**
1708
- * Effective deposit amount = `parseAmount(state.amount) ?? depositAmount`.
1709
- * View models should read this for display so the user's typed value from
1710
- * deposit-screen entry mode propagates through `deposit`, `link-tokens`,
1711
- * `processing`, and `token-picker` screens. `depositAmount` is retained
1712
- * separately for "did the merchant fix this?" semantics (e.g.
1713
- * `AmountTooLowScreen.canRetry`).
1714
- */
1715
- effectiveDepositAmount: number | null;
1716
- minTransferAmountUsd: number;
1717
- /** Needed to render ManualTransferFlow when phase is manual-transfer. */
1718
- destination: Destination;
1719
- merchantAuthorization?: CreateManualTransferParams['merchantAuthorization'];
1720
- idempotencyKey?: string;
1721
- /** Host-level completion callback, forwarded to ManualTransferFlow. */
1722
- onComplete?: (transfer: Transfer) => void;
1723
- /** Host-level error callback, forwarded to ManualTransferFlow. */
1724
- onError?: (error: string) => void;
1725
- }
1726
- /** Polling, signing, and auth-executor surface. */
1727
- interface StepRendererRemoteProps {
1728
- pollingTransfer: Transfer | null;
1729
- pollingError: string | null;
1730
- authExecutorError: string | null;
1731
- /** True while `executeSessionById` is running (desktop inline wallet steps). */
1732
- authExecutorExecuting: boolean;
1733
- authExecutorCurrentAction?: AuthorizationAction | null;
1734
- /** True once a run has drained all authorization actions (orchestrator
1735
- * completed). Stays true through the post-sign settling window — when
1736
- * `currentAction` is already null — until the next run resets it. Lets the
1737
- * approving checklist render all items complete instead of reverting to the
1738
- * default active state while the next screen loads. */
1739
- authExecutorCompleted: boolean;
1740
- transferSigningSigning: boolean;
1741
- transferSigningError: string | null;
1742
- transferSigningPasskeyDismissed?: boolean;
1743
- pendingSelectSource: AuthorizationAction | null;
1744
- /**
1745
- * True once the user interactively resolved a SELECT_SOURCE this run (picked
1746
- * a token on LinkTokensScreen and tapped Approve). Distinguishes the
1747
- * post-Approve transient — where the executor's `currentAction` is still the
1748
- * stale OPEN_PROVIDER from pairing — from genuine pairing, so OpenWalletScreen
1749
- * is not re-shown after Approve. False during WC reauthorization auto-resolve
1750
- * pairing, which keeps OpenWalletScreen visible until the wallet pairs.
1751
- */
1752
- sourceSelectionResolved: boolean;
1753
- }
1754
- /** Values derived from accounts / selection (plus select-source picker data). */
1755
- interface StepRendererDerivedProps {
1756
- pendingConnections: Account[];
1757
- depositEligibleAccounts: Account[];
1758
- sourceName: string;
1759
- maxSourceBalance: number;
1760
- tokenCount: number;
1761
- selectedAccount: Account | undefined;
1762
- selectedSource: WalletSource | null;
1763
- selectSourceChoices: SelectSourceChainChoice[];
1764
- /** Balances on chains the WalletConnect session did not approve — rendered as disabled "Not supported" rows. */
1765
- selectSourceUnsupportedChoices: SelectSourceChainChoice[];
1766
- /** Native gas assets (ETH, MON, SOL, …) the wallet holds but Permit2 can't authorize — disabled "Not supported" rows. */
1767
- selectSourceNativeChoices: NativeUnsupportedEntry[];
1768
- selectSourceRecommended: {
1769
- chainName: string;
1770
- tokenSymbol: string;
1771
- } | null;
1772
- selectSourceAvailableBalance: number;
1773
- /**
1774
- * Reown registry chain ids per WalletConnect-typed account id (null =
1775
- * registry has no opinion, fail open). Used to badge requires-auth deposit
1776
- * sources on chains the backing wallet cannot authorize.
1777
- */
1778
- walletConnectChainIdsByAccount: Record<string, number[] | null>;
1779
- }
1780
- /** Ephemeral form UI state. */
1781
- interface StepRendererFormProps {
1782
- selectSourceChainName: string;
1783
- selectSourceTokenSymbol: string;
1784
- depositQuoteId: string | null;
1785
- depositQuoteFee: PreciseMoney | null;
1786
- depositQuoteLoading: boolean;
1787
- depositQuoteError: string | null;
1788
- }
1789
- interface StepRendererProps {
1790
- flow: StepRendererFlowProps;
1791
- remote: StepRendererRemoteProps;
1792
- derived: StepRendererDerivedProps;
1793
- forms: StepRendererFormProps;
1794
- handlers: StepHandlers;
1912
+ onSignInWithBlink: () => void;
1913
+ /** Dismiss the widget. When set, renders a round (X) close button in the top-right. */
1914
+ onClose?: () => void;
1795
1915
  }
1796
- declare function StepRenderer(props: StepRendererProps): react_jsx_runtime.JSX.Element;
1797
-
1798
1916
  /**
1799
- * Cross-origin iframe passkey helpers.
1800
- *
1801
- * When the webview-app runs inside a cross-origin iframe, WebAuthn
1802
- * ceremonies cannot execute from within the iframe on Safari. For passkey
1803
- * verification (signing) and signup (credential creation), we open a
1804
- * same-origin pop-up window on the Blink domain to perform the ceremony.
1805
- */
1806
- /**
1807
- * Thrown when `navigator.credentials.create()` fails inside a
1808
- * cross-origin iframe (Safari). The UI layer should catch this and
1809
- * offer the user a button that opens the Blink passkey pop-up.
1917
+ * Pre-login entry screen shown when `enableFullWidget` is true. Mirrors the
1918
+ * Figma "Payment method" redesign (frame 1623-32808): a Blink wordmark, a lime
1919
+ * mascot hero, the black "Deposit stablecoins / In a Blink" CTA
1920
+ * (BlinkDepositButton), an OR divider, and a recessed "Send Crypto Manually"
1921
+ * row that routes to the manual-transfer flow.
1810
1922
  */
1811
- declare class PasskeyIframeBlockedError extends Error {
1812
- constructor(message?: string);
1813
- }
1814
- interface PasskeyVerifyPopupOptions {
1815
- credentialIds: string[];
1816
- rpId: string;
1817
- /** Populated by `findDevicePasskeyViaPopup`; not set by callers. */
1818
- verificationToken?: string;
1819
- /** Privy JWT so the popup can report verification server-side. */
1820
- authToken?: string;
1821
- /** Core API base URL for server-side passkey activity reporting. */
1822
- apiBaseUrl?: string;
1923
+ declare function DepositOptionsScreen({ onToAddress, onSignInWithBlink, onClose, }: DepositOptionsScreenProps): react_jsx_runtime.JSX.Element;
1924
+
1925
+ interface WelcomeBackScreenProps {
1926
+ /** Recessed "Send Crypto Manually" row. Navigates to the manual-transfer flow. */
1927
+ onToAddress: () => void;
1928
+ /**
1929
+ * Primary "Complete setup & Deposit" CTA. Advances the returning user to the
1930
+ * wallet picker to link a wallet and continue the deposit flow.
1931
+ */
1932
+ onComplete: () => void;
1933
+ /** Dismiss the widget. When set, renders a round (X) close button in the top-right. */
1934
+ onClose?: () => void;
1823
1935
  }
1824
1936
  /**
1825
- * Opens a same-origin pop-up window on the Blink domain to check whether
1826
- * any of the given passkey credential IDs exist on this device.
1827
- *
1828
- * Used as a fallback when Safari blocks `navigator.credentials.get()`
1829
- * inside a cross-origin iframe. The popup runs on the Blink domain where
1830
- * the rpId matches, so WebAuthn works.
1831
- *
1832
- * Must be called from a user-gesture handler (e.g. button click) to
1833
- * avoid the browser's pop-up blocker.
1834
- *
1835
- * @returns The matching credential ID, or `null` if none matched or the
1836
- * popup was closed before completing.
1937
+ * Re-greeting screen for returning passkey users who reopen the full-widget
1938
+ * flow with a persisted session but no linked wallet. Mirrors
1939
+ * `DepositOptionsScreen`'s "Deposit stablecoins / In a Blink" CTA, wrapped in a
1940
+ * lime "Finish setup" frame, and routes onward to the wallet picker rather
1941
+ * than to login.
1837
1942
  */
1838
- declare function findDevicePasskeyViaPopup(options: PasskeyVerifyPopupOptions): Promise<string | null>;
1943
+ declare function WelcomeBackScreen({ onToAddress, onComplete, onClose, }: WelcomeBackScreenProps): react_jsx_runtime.JSX.Element;
1839
1944
 
1945
+ interface BlinkErrorScreenProps {
1946
+ /** Heading text shown under the illustration. */
1947
+ title: string;
1948
+ /** Body copy shown below the title. When null/undefined, nothing renders. */
1949
+ message?: string | null;
1950
+ /** Label for the primary CTA. When set together with `onRetry`, renders the button. */
1951
+ retryLabel?: string;
1952
+ onRetry?: () => void;
1953
+ /** When set, renders the round (X) close button in the header right slot. */
1954
+ onClose?: () => void;
1955
+ }
1840
1956
  /**
1841
- * Decodes a WebAuthn credential id from the same base64 (or base64url) encoding
1842
- * used when registering passkeys and returned by the API as `passkeyCredentialId`.
1957
+ * Shared error screen that matches the Figma onboarding redesign
1958
+ * (node 153:19811 "Sign in Failed"). Displays the bundled traffic-cone
1959
+ * illustration above a title + optional message, with an optional Try Again
1960
+ * CTA pinned to the footer and an optional close (X) button in the header.
1843
1961
  */
1844
- declare function credentialIdBase64ToBytes(value: string): Uint8Array<ArrayBuffer>;
1962
+ declare function BlinkErrorScreen({ title, message, retryLabel, onRetry, onClose, }: BlinkErrorScreenProps): react_jsx_runtime.JSX.Element;
1845
1963
 
1846
- declare function resolvePasskeyRpId(): string;
1847
- /**
1848
- * @deprecated Use {@link findDevicePasskey} instead, which checks all
1849
- * credentials in a single WebAuthn call.
1850
- */
1851
- declare function deviceHasPasskey(credentialId: string): Promise<boolean>;
1852
- /**
1853
- * Determines which (if any) of the given server-registered passkeys exists on
1854
- * the current device. All credential IDs are passed in a single
1855
- * `navigator.credentials.get()` call so the browser shows at most one prompt
1856
- * and the platform authenticator automatically selects the matching key.
1857
- *
1858
- * @param credentialIds - Base64-encoded WebAuthn credential IDs from the server.
1859
- * @returns The matching credential ID, or `null` if none are on this device.
1860
- */
1861
- declare function findDevicePasskey(credentialIds: string[]): Promise<string | null>;
1964
+ interface OtpVerifyScreenProps {
1965
+ /** Masked identifier displayed to the user (e.g. "user@email.com") */
1966
+ maskedIdentifier: string;
1967
+ otpCode: string;
1968
+ onOtpChange: (code: string) => void;
1969
+ onVerify: () => void;
1970
+ onResend: () => void;
1971
+ onBack: () => void;
1972
+ verifying: boolean;
1973
+ error: string | null;
1974
+ }
1975
+ declare function OtpVerifyScreen({ maskedIdentifier, otpCode, onOtpChange, onVerify, onResend, onBack, verifying, error, }: OtpVerifyScreenProps): react_jsx_runtime.JSX.Element;
1862
1976
 
1863
- interface UseTransferPollingResult {
1864
- transfer: Transfer | null;
1977
+ interface PasskeyScreenProps {
1978
+ onCreatePasskey: () => void;
1979
+ onBack?: () => void;
1980
+ onLogout?: () => void;
1981
+ creating: boolean;
1865
1982
  error: string | null;
1866
- isPolling: boolean;
1867
- startPolling: (transferId: string) => void;
1868
- stopPolling: () => void;
1983
+ /** When true, direct passkey creation failed (Safari iframe restriction). */
1984
+ popupFallback?: boolean;
1985
+ /** Opens a pop-up window on the Blink domain for passkey registration. */
1986
+ onCreatePasskeyViaPopup?: () => void;
1987
+ /** Creates a brand-new passkey on this device (for users who already have one on another device). */
1988
+ onCreateNewPasskey?: () => void;
1989
+ /** Popup fallback variant of onCreateNewPasskey. */
1990
+ onCreateNewPasskeyViaPopup?: () => void;
1991
+ /** When set, overrides `popupFallback` for the create-new link only. */
1992
+ createNewPopupFallback?: boolean;
1993
+ /** Loading state while a new passkey is being created. */
1994
+ creatingNewPasskey?: boolean;
1869
1995
  }
1870
- /**
1871
- * Polls GET /v1/transfers/{id} until status is COMPLETED or FAILED. Uses an
1872
- * adaptive interval (see FAST_POLL_COUNT/FAST_POLL_INTERVAL_MS) so the early
1873
- * polls — when the bridge is most likely to settle — fire quickly while
1874
- * later polls back off to `intervalMs` to limit API load.
1875
- */
1876
- declare function useTransferPolling(intervalMs?: number, overrideGetAccessToken?: () => Promise<string | null>): UseTransferPollingResult;
1996
+ declare function PasskeyScreen({ onCreatePasskey, onBack, onLogout, creating, error, popupFallback, onCreatePasskeyViaPopup, onCreateNewPasskey, onCreateNewPasskeyViaPopup, createNewPopupFallback, creatingNewPasskey, }: PasskeyScreenProps): react_jsx_runtime.JSX.Element;
1877
1997
 
1878
- type AccessTokenGetter = () => Promise<string | null | undefined>;
1879
- interface SignTransferOptions {
1880
- /**
1881
- * Win 2 hint: when the caller already has a fresh `signPayload` (e.g. from
1882
- * the POST /v1/transfers response), pass it here to skip the GET poll loop
1883
- * and proceed directly to the WebAuthn ceremony.
1884
- */
1885
- knownSignPayload?: TransferSignPayload | null;
1998
+ interface PasskeyPopupWelcomeScreenProps {
1999
+ /** Begins passkey creation (Privy signup). */
2000
+ onCreatePasskey: () => void;
2001
+ /** When set, renders an "or Sign in with passkey" secondary action for users who already have a passkey. */
2002
+ onSignInWithPasskey?: () => void;
2003
+ /** Disables the actions and shows the primary button's loading state. */
2004
+ creating?: boolean;
2005
+ /** Error copy shown in a banner below the hero. */
2006
+ error?: string | null;
2007
+ onBack?: () => void;
2008
+ onLogout?: () => void;
1886
2009
  }
1887
- interface UseTransferSigningResult {
1888
- signing: boolean;
1889
- signPayload: TransferSignPayload | null;
2010
+ declare function PasskeyPopupWelcomeScreen({ onCreatePasskey, onSignInWithPasskey, creating, error, onBack, onLogout, }: PasskeyPopupWelcomeScreenProps): react_jsx_runtime.JSX.Element;
2011
+
2012
+ interface VerifyPasskeyScreenProps {
2013
+ onVerify: () => void;
2014
+ onBack?: () => void;
2015
+ verifying: boolean;
1890
2016
  error: string | null;
1891
- passkeyDismissed: boolean;
2017
+ /** Override the default subtitle text (useful when rendering inside a popup). */
2018
+ subtitle?: string;
2019
+ }
2020
+ declare function VerifyPasskeyScreen({ onVerify, onBack, verifying, error, subtitle, }: VerifyPasskeyScreenProps): react_jsx_runtime.JSX.Element;
2021
+
2022
+ interface WalletPickerScreenProps {
2023
+ providers: Provider[];
2024
+ loading?: boolean;
2025
+ useDeeplink?: boolean;
2026
+ error?: string | null;
2027
+ preparedSessionsByProvider?: Record<string, PreparedSession>;
2028
+ preparingLinks?: boolean;
2029
+ directLinkCards?: boolean;
2030
+ onPrepareProvider: (providerId: string) => Promise<PreparedSession | null>;
2031
+ onSelectProvider: (providerId: string, preparedSession?: PreparedSession) => Promise<void>;
2032
+ onSelectWalletConnectWallet?: (wallet: ReownWallet) => Promise<void>;
2033
+ onBack?: () => void;
2034
+ onLogout?: () => void;
2035
+ isDesktop?: boolean;
2036
+ }
2037
+ declare function WalletPickerScreen({ providers, loading, useDeeplink, error, preparedSessionsByProvider, preparingLinks, directLinkCards, onPrepareProvider, onSelectProvider, onSelectWalletConnectWallet, onBack, onLogout, isDesktop, }: WalletPickerScreenProps): react_jsx_runtime.JSX.Element;
2038
+
2039
+ interface ManualTransferPasskeyScreenProps {
2040
+ onCreatePasskey: () => void;
2041
+ /** "No thanks" / close action — dismisses the modal. */
2042
+ onNoThanks: () => void;
2043
+ /** Delivered amount in USD, rendered as the "$X deposited" title. */
2044
+ amountUsd?: number;
2045
+ loading?: boolean;
2046
+ error?: string | null;
2047
+ onBack?: () => void;
2048
+ onClose?: () => void;
2049
+ }
2050
+ declare function ManualTransferPasskeyScreen({ onCreatePasskey, onNoThanks, amountUsd, loading, error, onBack, onClose, }: ManualTransferPasskeyScreenProps): react_jsx_runtime.JSX.Element;
2051
+
2052
+ /**
2053
+ * A single {token, chain} pair the user may pick as the deposit source on
2054
+ * the Setup / Deposit screens. Previously lived in `SetupScreen.tsx` but is
2055
+ * consumed by many unrelated modules (view-model builders, DepositScreen
2056
+ * dropdown, auth-app hooks), so it's hoisted here next to the helpers that
2057
+ * construct and match these options.
2058
+ */
2059
+ interface SetupTokenOption {
2060
+ symbol: string;
2061
+ chainName: string;
2062
+ balance?: number;
2063
+ walletId?: string;
2064
+ status?: string;
2065
+ tokenAddress?: string;
2066
+ chainId?: number;
2067
+ /** Account this token belongs to; used by multi-account pickers to group rows. */
2068
+ accountId?: string;
1892
2069
  /**
1893
- * Starts the signing flow:
1894
- * 1. Polls GET /v1/transfers/{id} until signPayload is present
1895
- * (skipped when `opts.knownSignPayload` is provided).
1896
- * 2. Triggers WebAuthn passkey prompt
1897
- * 3. Submits signed UserOp via PATCH /v1/transfers/{id}
2070
+ * Truncated wallet address (from `wallet.name`). One account may own wallets
2071
+ * at several distinct addresses (e.g. multiple Solana accounts under one
2072
+ * Phantom connection); multi-account pickers group rows by address so those
2073
+ * are not collapsed under a single header. EVM wallets share one address per
2074
+ * account, so this yields a single section there.
1898
2075
  */
1899
- signTransfer: (transferId: string, opts?: SignTransferOptions) => Promise<Transfer>;
2076
+ walletAddress?: string;
2077
+ /** Server-provided token logo URI from the catalog. Preferred over the local `TOKEN_LOGOS` map. */
2078
+ logoURI?: string | null;
1900
2079
  /**
1901
- * Regenerates a fresh SVM sign payload for a transfer whose signing window
1902
- * expired (POST /v1/transfers/{id}/sign-payload), reusing the same transfer
1903
- * id. Returns the refreshed Transfer carrying the new signPayload.
2080
+ * WalletConnect-typed account only: the Reown registry says the backing
2081
+ * wallet does not support this token's chain, so authorizing it would
2082
+ * dead-end (the prepare/authorize handlers' pre-filter rejects it).
2083
+ * Rendered as a disabled "Not supported, deposit manually" row. Never set
2084
+ * on AUTHORIZED rows — those deposit via passkey without the wallet.
1904
2085
  */
1905
- regenerateSignPayload: (transferId: string) => Promise<Transfer>;
1906
- }
1907
- interface UseTransferSigningOptions {
1908
- /** Optional API base URL override when used outside BlinkProvider. */
1909
- apiBaseUrl?: string;
1910
- /** Optional access-token getter override (e.g. deeplink query token). */
1911
- getAccessToken?: AccessTokenGetter;
1912
- /** Optional authorization-session token for session-authenticated transfer signing. */
1913
- authorizationSessionToken?: string;
2086
+ notSupported?: boolean;
1914
2087
  }
1915
- /**
1916
- * Post-authorization transfer signing hook.
1917
- *
1918
- * After the auth session completes and the transfer reaches AUTHORIZED,
1919
- * the backend prepares a signPayload containing the unsigned UserOp.
1920
- * This hook polls for it, prompts the user's passkey via WebAuthn, and
1921
- * submits the signed UserOp back to the API.
1922
- */
1923
- declare function useTransferSigning(pollIntervalMs?: number, options?: UseTransferSigningOptions): UseTransferSigningResult;
1924
2088
 
1925
- /**
1926
- * Best-effort UI label for device biometrics (Face ID, Touch ID, Windows Hello, etc.).
1927
- * The web platform does not expose the exact modality; this uses coarse `userAgent`
1928
- * detection only synchronous so it can run during render with no effects.
1929
- */
1930
- /**
1931
- * Returns short copy for passkey / biometric prompts based on the current environment.
1932
- * Does not call WebAuthn (no async); suitable for direct use in render.
1933
- */
1934
- declare function getDeviceBiometricUnlockText(): string;
2089
+ interface DepositCompleteScreenProps {
2090
+ amount: number;
2091
+ }
2092
+ declare function DepositCompleteScreen({ amount }: DepositCompleteScreenProps): react_jsx_runtime.JSX.Element;
1935
2093
 
1936
- interface ScreenLayoutProps {
1937
- children: ReactNode;
1938
- /** Content pinned to the bottom of the screen (buttons, footer) */
1939
- footer?: ReactNode;
2094
+ interface DepositScreenProps {
2095
+ merchantName?: string;
1940
2096
  /**
1941
- * When false, the body container does not scroll useful for screens that
1942
- * want an inner element (e.g. a list card) to be the scroll container so the
1943
- * surrounding chrome (heading, banners, CTA) stays pinned. Defaults to true.
2097
+ * True while wallet balances are still loading (accounts loaded balance-free;
2098
+ * balances arrive via a separate call). Drives the source-pill / token-row
2099
+ * shimmer so the screen renders immediately instead of waiting on RPC.
1944
2100
  */
1945
- scrollableBody?: boolean;
2101
+ balancesLoading?: boolean;
2102
+ /** Total available balance from source */
2103
+ availableBalance: number;
2104
+ /** Remaining One-Tap allowance from the API, or null when not configured */
2105
+ remainingLimit: number | null;
2106
+ /** Number of tokens/chains available */
2107
+ tokenCount: number;
2108
+ /** Pre-populated amount */
2109
+ initialAmount: number;
2110
+ /** Pre-transfer fee estimate from POST /v1/transfers/quotes */
2111
+ quoteFee?: PreciseMoney | null;
2112
+ /** Whether a fee quote is being fetched */
2113
+ quoteLoading?: boolean;
2114
+ /** User-facing error when the fee quote fails (e.g. amount too low) */
2115
+ quoteError?: string | null;
2116
+ /** Whether the deposit is currently processing */
2117
+ processing?: boolean;
2118
+ error: string | null;
2119
+ onDeposit: (amount: number) => void;
2120
+ onSwitchWallet: () => void;
2121
+ onBack: () => void;
2122
+ onLogout: () => void;
2123
+ /** Called when the user taps "Increase Limit" to re-authorize via wallet deeplink */
2124
+ onIncreaseLimit?: () => void;
2125
+ /** Whether a limit-increase flow is currently in progress */
2126
+ increasingLimit?: boolean;
2127
+ /** All user accounts for the source dropdown */
2128
+ accounts?: Account[];
2129
+ /** Currently selected account ID */
2130
+ selectedAccountId?: string | null;
2131
+ /** Called when an active account is selected from the dropdown */
2132
+ onSelectAccount?: (accountId: string) => void;
2133
+ /** Called when an inactive account is clicked (to authorize it) */
2134
+ onAuthorizeAccount?: (accountId: string) => void;
2135
+ /** Called when "+ Add Provider" is clicked in the dropdown */
2136
+ onAddProvider?: () => void;
2137
+ /** Called when the "Send manually" action row is tapped from the inline source sheet. */
2138
+ onSendManually?: () => void;
2139
+ /** Fallback: navigate to the full-page token picker when no inline options. */
2140
+ onSelectToken?: () => void;
2141
+ /** Available tokens for the inline dropdown. When provided, the token badge opens a dropdown instead of navigating. */
2142
+ tokenOptions?: SetupTokenOption[];
2143
+ /** Called when the user picks a token from the inline dropdown. */
2144
+ onPickToken?: (symbol: string, chainName: string, walletId?: string) => void;
2145
+ /** Mobile-only: true when token authorization should be prepared before a real deeplink tap. */
2146
+ useDeeplink?: boolean;
2147
+ onPrepareTokenAuthorization?: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => Promise<PreparedTokenAuthorization | null>;
2148
+ onCommitTokenAuthorization?: (prepared: PreparedTokenAuthorization) => void;
2149
+ /** Token symbol for the selected source, e.g. "USDC" or "USDT" */
2150
+ selectedTokenSymbol?: string;
2151
+ /** Chain name for the selected source, used to disambiguate same-symbol tokens on different chains. */
2152
+ selectedChainName?: string;
2153
+ /** Server-provided token logo URI for the selected source. */
2154
+ selectedTokenLogoUri?: string | null;
2155
+ /** Server-provided chain logo URI for the selected source. */
2156
+ selectedChainLogoUri?: string | null;
2157
+ /** Wallet that owns the selected source. Required for the inline source sheet
2158
+ * to mark the active row when two wallets/accounts are authorized on the
2159
+ * same symbol+chain. */
2160
+ selectedWalletId?: string | null;
2161
+ /** Status of the currently selected token source (e.g. "AUTHORIZED"). When present and not "AUTHORIZED", the screen surfaces an "authorize in wallet" CTA + banner. */
2162
+ selectedTokenStatus?: string;
2163
+ /** Called when the user taps "Continue in {wallet}" to authorize the currently selected (non-authorized) token. */
2164
+ onAuthorizeSelectedToken?: () => void;
2165
+ /** Whether the authorize-token flow is currently in progress. */
2166
+ authorizingToken?: boolean;
1946
2167
  /**
1947
- * When true, the footer floats over the body instead of taking its own band
1948
- * at the bottom of the sheet. Its background is a gradient that is
1949
- * transparent across the top half and fades to the solid sheet color for the
1950
- * bottom half, so the scroll content peeks through above the CTA while the
1951
- * button itself sits on a solid base. Only the footer's own children are
1952
- * interactive — the transparent gutter passes taps and scroll through to the
1953
- * list below. Screens that opt in must reserve bottom padding in their scroll
1954
- * container so the last row clears the floating footer. Defaults to false.
2168
+ * Minimum USD amount required for One-Tap on this screen. When the host sets
2169
+ * `depositAmount`, this should match it; otherwise the default floor ($0.25)
2170
+ * applies (see StepRenderer).
1955
2171
  */
1956
- floatingFooter?: boolean;
2172
+ minDepositFloor: number;
2173
+ /** Verbatim display value rendered after `$`, e.g. "0", "12.34", "12.". */
2174
+ amountEntryValue?: string;
2175
+ /** Digit keypress; `digit` is "0".."9". */
2176
+ onDigit?: (digit: string) => void;
2177
+ /** Decimal-point keypress. */
2178
+ onDecimal?: () => void;
2179
+ /** Backspace keypress. */
2180
+ onBackspace?: () => void;
2181
+ /** Whole-dollar preset chip tap. */
2182
+ onPreset?: (dollars: number) => void;
2183
+ /** Desktop path: raw native-input string (sanitized by the view-model). */
2184
+ onSetValue?: (raw: string) => void;
2185
+ /** Whole-dollar preset amounts. Defaults to [5, 25, 100, 250]. */
2186
+ presets?: number[];
1957
2187
  /**
1958
- * When true, the body still scrolls but its scrollbar is visually hidden
1959
- * (overflow behaviour is unchanged). Use for screens that should never show
1960
- * scrollbar chrome. Defaults to false.
2188
+ * When true, the entry-mode hero renders a native text input and the
2189
+ * on-screen keypad is never mounted. When false, the mobile keypad drives
2190
+ * input until the user dismisses it via Continue. Ignored when not in
2191
+ * entry mode.
1961
2192
  */
1962
- hideScrollbar?: boolean;
2193
+ isDesktop?: boolean;
1963
2194
  }
1964
- declare function ScreenLayout({ children, footer, scrollableBody, floatingFooter, hideScrollbar }: ScreenLayoutProps): react_jsx_runtime.JSX.Element;
2195
+ declare function DepositScreen({ balancesLoading, availableBalance, remainingLimit, initialAmount, minDepositFloor, quoteLoading, processing, error, onDeposit, onSwitchWallet, onBack, onLogout, onIncreaseLimit, increasingLimit, accounts, selectedAccountId, onSelectAccount: _onSelectAccount, onAuthorizeAccount: _onAuthorizeAccount, onAddProvider, onSendManually, onSelectToken, tokenOptions, onPickToken, useDeeplink, onPrepareTokenAuthorization, onCommitTokenAuthorization, selectedTokenSymbol, selectedChainName, selectedTokenLogoUri, selectedChainLogoUri, selectedWalletId, selectedTokenStatus, onAuthorizeSelectedToken, authorizingToken, amountEntryValue, onDigit, onDecimal, onBackspace, onPreset, onSetValue, presets, isDesktop, }: DepositScreenProps): react_jsx_runtime.JSX.Element;
1965
2196
 
1966
- interface ScreenHeaderProps {
1967
- /** Center title text */
1968
- title?: string;
1969
- /** Right-aligned element (avatar, close button, etc.) */
1970
- right?: ReactNode;
1971
- /** Called when back arrow is pressed. Omit to hide the back arrow. */
1972
- onBack?: () => void;
1973
- /**
1974
- * Left-aligned element rendered when `onBack` is absent (e.g. a brand
1975
- * wordmark on the entry screen). Ignored when `onBack` is provided so the
1976
- * back arrow always takes precedence.
1977
- */
1978
- left?: ReactNode;
1979
- /** Optional secondary label next to the title (e.g. "Simple") */
1980
- badge?: string;
1981
- /** When provided, renders the three-dot settings menu with a logout action in the right slot. */
2197
+ interface SuccessScreenProps {
2198
+ amount: number;
2199
+ currency: string;
2200
+ succeeded: boolean;
2201
+ error?: string | null;
2202
+ merchantName?: string;
2203
+ sourceName?: string;
2204
+ onDone?: () => void;
1982
2205
  onLogout?: () => void;
1983
2206
  /**
1984
- * Element rendered in the centered overlay layer (e.g. a brand wordmark).
1985
- * Takes precedence over `title` / `badge` when present.
2207
+ * When set and no `onDone` handler is provided, renders an instructional
2208
+ * message in place of the primary action button. Used by mobile-hosted
2209
+ * flows (e.g. auth-app) where the user has no client-side action to take
2210
+ * and should simply return to the merchant app.
1986
2211
  */
1987
- center?: ReactNode;
2212
+ returnMessage?: string;
1988
2213
  }
1989
- declare function ScreenHeader({ title, right, onBack, left, badge, onLogout, center }: ScreenHeaderProps): react_jsx_runtime.JSX.Element;
2214
+ declare function SuccessScreen({ amount, currency: _currency, succeeded, error, merchantName, sourceName, onDone, onLogout, returnMessage, }: SuccessScreenProps): react_jsx_runtime.JSX.Element;
1990
2215
 
1991
- declare function PoweredByFooter(): react_jsx_runtime.JSX.Element;
2216
+ interface ChainChoice$1 {
2217
+ chainName: string;
2218
+ balance: number;
2219
+ tokens: {
2220
+ tokenSymbol: string;
2221
+ balance: number;
2222
+ walletName?: string;
2223
+ walletLogoUrl?: string;
2224
+ logoURI?: string | null;
2225
+ }[];
2226
+ }
2227
+ interface SelectSourceScreenProps {
2228
+ choices: ChainChoice$1[];
2229
+ selectedChainName: string;
2230
+ selectedTokenSymbol: string;
2231
+ recommended: {
2232
+ chainName: string;
2233
+ tokenSymbol: string;
2234
+ } | null;
2235
+ onChainChange: (chainName: string) => void;
2236
+ onTokenChange: (tokenSymbol: string) => void;
2237
+ onConfirm: () => void;
2238
+ /** Primary footer button label (default: "Confirm source"). */
2239
+ confirmLabel?: string;
2240
+ onBack?: () => void;
2241
+ onLogout: () => void;
2242
+ }
2243
+ declare function SelectSourceScreen({ choices, selectedChainName, selectedTokenSymbol, recommended, onChainChange, onTokenChange, onConfirm, confirmLabel, onBack, onLogout, }: SelectSourceScreenProps): react_jsx_runtime.JSX.Element;
1992
2244
 
1993
- interface PrimaryButtonProps {
1994
- /** Button label. Optional only when `spinnerOnly` is set (no label is shown). */
1995
- children?: ReactNode;
1996
- onClick?: (event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
1997
- href?: string;
1998
- target?: HTMLAttributeAnchorTarget;
1999
- rel?: string;
2000
- disabled?: boolean;
2001
- loading?: boolean;
2002
- /** Override the default "Please wait..." text shown while loading. */
2003
- loadingText?: string;
2004
- /** Optional icon element rendered left of the label */
2005
- icon?: ReactNode;
2006
- /** 0-1 fractional progress. When set, the button renders in progress mode with a fill bar. */
2007
- progress?: number;
2008
- /** Text shown during progress mode (overrides children and loadingText). */
2009
- progressText?: string;
2010
- /** When true, the fill bar pulses to signal the user needs to take action (e.g. confirm in wallet). */
2011
- progressPaused?: boolean;
2245
+ interface DepositSourceAccount {
2246
+ id: string;
2247
+ /** Provider / account name (e.g. "MetaMask"). Used to look up a logo via KNOWN_LOGOS. */
2248
+ name: string;
2249
+ /** Optional account display logo, e.g. the selected Reown wallet icon. */
2250
+ logoURI?: string;
2251
+ /** Full wallet address; a shortened suffix "...abcd" is shown on the right. */
2252
+ address?: string | null;
2253
+ }
2254
+ interface SelectDepositSourceScreenProps {
2255
+ /** All deposit-eligible accounts to display, grouped one per section. */
2256
+ accounts: DepositSourceAccount[];
2257
+ /** Currently selected account; when present, that account's group is rendered first. */
2258
+ selectedAccountId?: string | null;
2259
+ /** Tokens the user can pick from. Rows below the minimum deposit floor are filtered out.
2260
+ * Each row should carry `accountId` so it can be grouped under the owning account. */
2261
+ tokenOptions: SetupTokenOption[];
2262
+ selectedTokenSymbol?: string;
2263
+ selectedChainName?: string;
2012
2264
  /**
2013
- * Renders the pill as a non-interactive waiting state: the black pill with a
2014
- * single centered spinner and no label. For surfaces where the user is
2015
- * blocked on an external action (e.g. signing in their wallet) and there is
2016
- * nothing to click.
2265
+ * True while wallet balances are still loading. When set and no token rows
2266
+ * are available yet, the sheet renders shimmer placeholder rows instead of
2267
+ * an empty list.
2017
2268
  */
2018
- spinnerOnly?: boolean;
2019
- }
2020
- declare function PrimaryButton({ children, onClick, href, target, rel, disabled, loading, loadingText, icon, progress, progressText, progressPaused, spinnerOnly, }: PrimaryButtonProps): react_jsx_runtime.JSX.Element;
2021
-
2022
- interface BlinkDepositButtonProps {
2023
- /** Fired when the user taps the button. Hosts typically open the Blink deposit flow. */
2024
- onClick: () => void;
2025
- /** Disables interaction and dims the button. */
2026
- disabled?: boolean;
2027
- /** Non-interactive waiting state (e.g. while preparing a deposit session). Dims like disabled. */
2028
- loading?: boolean;
2269
+ balancesLoading?: boolean;
2270
+ /** Wallet that owns the currently active token source. Required (with
2271
+ * symbol + chain) for a row to be marked as the active selection so
2272
+ * that two wallets/accounts authorized on the same symbol+chain don't
2273
+ * both light up. */
2274
+ selectedWalletId?: string | null;
2275
+ /** Called when the user picks a token row. */
2276
+ onPickToken: (symbol: string, chainName: string, walletId?: string) => void;
2277
+ /** Mobile-only: unauthorized token rows prepare a real deeplink footer CTA instead of closing immediately. */
2278
+ useDeeplink?: boolean;
2279
+ onPrepareTokenAuthorization?: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => Promise<PreparedTokenAuthorization | null>;
2280
+ onCommitTokenAuthorization?: (prepared: PreparedTokenAuthorization) => void;
2029
2281
  /**
2030
- * Promotional sticker copy (e.g. "2x Your Profits") rendered as a tilted
2031
- * badge straddling the button's bottom edge. Omit/null to hide it.
2282
+ * "Link Wallet" action row at the bottom of the sheet. When provided, the
2283
+ * row appears in the recessed action pill and routes to the existing add-
2284
+ * provider flow. Hidden when not provided.
2032
2285
  */
2033
- promoTagText?: string | null;
2286
+ onAddProvider?: () => void;
2287
+ /**
2288
+ * "Send manually" action row at the bottom of the sheet. When provided,
2289
+ * the row appears in the recessed action pill. Currently a no-op upstream
2290
+ * — placeholder for the manual-transfer entry point.
2291
+ */
2292
+ onSendManually?: () => void;
2293
+ /** Header back navigation. Falls back to onDone when omitted. */
2294
+ onBack?: () => void;
2295
+ /** Primary "Done" CTA used to dismiss the sheet. */
2296
+ onDone: () => void;
2297
+ onLogout?: () => void;
2034
2298
  }
2035
2299
  /**
2036
- * Blink-branded deposit CTA matching the Figma "Payment method" redesign
2037
- * (frame 1623-32808): a black pill with a bold "Deposit stablecoins" line over
2038
- * an italic "In a Blink" line, and overlapping USDC/USDT coin marks on the
2039
- * right.
2040
- *
2041
- * Exported for merchants to drop onto their own pages instead of building a
2042
- * custom button. Outside a BlinkProvider it intentionally styles itself with
2043
- * the default lightThemeNew palette; inside the widget it follows the
2044
- * configured theme tokens.
2300
+ * Figma "Select source" bottom-sheet (node 320:28467). Replaces the Deposit
2301
+ * confirmation content when the user taps the token badge under the
2302
+ * lightNew theme. Renders one card per deposit-eligible account (header row
2303
+ * plus that account's authorized token sources), followed by a single
2304
+ * "Authorisation required" card with the requires-auth rows from every
2305
+ * account.
2045
2306
  */
2046
- declare function BlinkDepositButton({ onClick, disabled, loading, promoTagText, }: BlinkDepositButtonProps): react_jsx_runtime.JSX.Element;
2047
-
2048
- interface OutlineButtonProps {
2049
- children: ReactNode;
2050
- onClick?: () => void;
2051
- disabled?: boolean;
2052
- }
2053
- declare function OutlineButton({ children, onClick, disabled }: OutlineButtonProps): react_jsx_runtime.JSX.Element;
2054
-
2055
- interface SecondaryButtonProps {
2056
- children: ReactNode;
2057
- onClick?: (event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
2058
- href?: string;
2059
- target?: HTMLAttributeAnchorTarget;
2060
- rel?: string;
2061
- disabled?: boolean;
2062
- loading?: boolean;
2063
- loadingText?: string;
2064
- }
2065
- declare function SecondaryButton({ children, onClick, href, target, rel, disabled, loading, loadingText, }: SecondaryButtonProps): react_jsx_runtime.JSX.Element;
2307
+ declare function SelectDepositSourceScreen({ accounts, selectedAccountId, tokenOptions, selectedTokenSymbol, selectedChainName, balancesLoading, selectedWalletId, onPickToken, useDeeplink, onPrepareTokenAuthorization, onCommitTokenAuthorization, onAddProvider, onSendManually, onBack, onDone, onLogout, }: SelectDepositSourceScreenProps): react_jsx_runtime.JSX.Element;
2066
2308
 
2067
- interface InfoBannerProps {
2068
- children: ReactNode;
2069
- /** SVG icon element. Defaults to a shield icon. */
2070
- icon?: ReactNode;
2309
+ interface ChainChoice {
2310
+ chainName: string;
2311
+ balance: number;
2312
+ tokens: {
2313
+ tokenSymbol: string;
2314
+ balance: number;
2315
+ }[];
2071
2316
  }
2072
- declare function InfoBanner({ children, icon }: InfoBannerProps): react_jsx_runtime.JSX.Element;
2073
-
2074
- type IconCircleVariant = 'accent' | 'success' | 'error';
2075
- interface IconCircleProps {
2076
- children: ReactNode;
2077
- variant?: IconCircleVariant;
2078
- size?: number;
2317
+ interface AdvancedSourceScreenProps {
2318
+ choices: ChainChoice[];
2319
+ selectedChainName: string;
2320
+ selectedTokenSymbol: string;
2321
+ onSelectSource: (chainName: string, tokenSymbol: string) => void;
2322
+ onBack: () => void;
2079
2323
  }
2080
- declare function IconCircle({ children, variant, size }: IconCircleProps): react_jsx_runtime.JSX.Element;
2324
+ declare function AdvancedSourceScreen({ choices, selectedChainName, selectedTokenSymbol, onSelectSource, onBack, }: AdvancedSourceScreenProps): react_jsx_runtime.JSX.Element;
2081
2325
 
2082
- interface StepItem {
2083
- label: string;
2084
- /** Optional sublabel (e.g. "$100 limit · 2 tokens approved") */
2085
- detail?: string;
2086
- status: 'pending' | 'active' | 'complete';
2087
- }
2088
- interface StepListProps {
2089
- steps: StepItem[];
2326
+ type TransferPhase = 'creating' | 'signing' | 'submitting' | 'sent';
2327
+ interface TransferStatusBaseProps {
2328
+ phase: TransferPhase;
2329
+ error: string | null;
2330
+ onLogout?: () => void;
2090
2331
  /**
2091
- * How to render the indicator for the active step.
2092
- * - 'number' (default): bordered circle with the step number.
2093
- * - 'spinner': small animated arc in the accent color.
2332
+ * Optional retry hook. Setup flows wire this to `orchestrator.restart()`;
2333
+ * deposit flows wire it only after the first passkey signing attempt fails.
2094
2334
  */
2095
- activeIndicator?: 'number' | 'spinner';
2335
+ onRetry?: () => void;
2336
+ retryLabel?: string;
2337
+ retryAfterDelay?: boolean;
2338
+ showRetryOnError?: boolean;
2096
2339
  /**
2097
- * Overall visual density.
2098
- * - 'md' (default): original compact look.
2099
- * - 'lg': larger badge, heavier label, more vertical breathing room
2100
- * (matches the Figma redesign).
2340
+ * Presentation of the error message. `error` (default) uses the red error
2341
+ * banner for genuine failures; `info` uses the neutral informational
2342
+ * NotificationBanner for benign, retryable conditions (e.g. an expired SVM
2343
+ * signing window).
2101
2344
  */
2102
- size?: 'md' | 'lg';
2103
- }
2104
- declare function StepList({ steps, activeIndicator, size, }: StepListProps): react_jsx_runtime.JSX.Element;
2105
-
2106
- interface SettingsMenuProps {
2107
- onLogout: () => void;
2345
+ errorVariant?: 'error' | 'info';
2108
2346
  }
2109
- declare function SettingsMenu({ onLogout }: SettingsMenuProps): react_jsx_runtime.JSX.Element;
2110
2347
 
2111
- interface SpinnerProps {
2112
- size?: number;
2113
- label?: string;
2348
+ interface DepositTransferStatusScreenProps extends TransferStatusBaseProps {
2349
+ visibleError?: string | null;
2114
2350
  }
2115
- declare function Spinner({ size, label }: SpinnerProps): react_jsx_runtime.JSX.Element;
2116
-
2117
- declare function BlinkLoadingScreen(): react_jsx_runtime.JSX.Element;
2118
- declare function BlinkInitialLoadingScreen(): react_jsx_runtime.JSX.Element;
2351
+ declare function DepositTransferStatusScreen({ phase, error, visibleError, errorVariant, onLogout, onRetry, }: DepositTransferStatusScreenProps): react_jsx_runtime.JSX.Element;
2119
2352
 
2120
- interface LoginScreenProps {
2121
- onLoginWithPasskey: () => void;
2122
- onSignupWithPasskey: () => void;
2353
+ interface OpenWalletScreenProps {
2354
+ walletName: string | null;
2355
+ deeplinkUri: string;
2123
2356
  loading: boolean;
2124
- error: string | null;
2357
+ /** When true (mobile), auto-opens deeplinks and shows the "Continue in wallet" button.
2358
+ * When false (desktop), shows inline authorization progress instead. */
2359
+ useDeeplink?: boolean;
2360
+ error?: string | null;
2361
+ walletLogoUrl?: string;
2362
+ onRetryStatus?: () => void;
2363
+ /** Soft-retry the orchestrator (calls `orchestrator.restart()`). Desktop only —
2364
+ * shown alongside the error banner when set so the user can recover from a
2365
+ * dismissed wallet popup without reloading the iframe. */
2366
+ onRetryAuthorization?: () => void;
2125
2367
  onBack?: () => void;
2126
- /** Dismiss the sheet. When set, the header shows a round (X) close button in the top-right instead of the back arrow. */
2127
- onClose?: () => void;
2128
- merchantInitials?: string;
2129
- /** Overrides the default marketing heading when set (e.g. passkey popup copy). When set, the passkey info card is suppressed. */
2130
- heroTitle?: string;
2131
- /** Optional line shown under the heading. Reserved for callers that override `heroTitle`. */
2132
- heroSubtitle?: string;
2133
- /** When true, primary action is signup and secondary is sign-in. */
2134
- preferSignup?: boolean;
2135
- }
2136
- declare function LoginScreen({ onLoginWithPasskey, onSignupWithPasskey, loading, error, onBack, onClose, merchantInitials, heroTitle, heroSubtitle, preferSignup, }: LoginScreenProps): react_jsx_runtime.JSX.Element;
2137
-
2138
- interface DepositOptionsScreenProps {
2139
- /** Recessed "Send Crypto Manually" row. Navigates to the manual-transfer flow. */
2140
- onToAddress: () => void;
2141
- /**
2142
- * Primary "Deposit stablecoins" CTA. Routes to the login screen (wired to
2143
- * handlers.onLogin) rather than prompting for a passkey directly, mirroring how
2144
- * the connect-wallet entry point defers credential selection to LoginScreen.
2145
- */
2146
- onSignInWithBlink: () => void;
2147
- /** Dismiss the widget. When set, renders a round (X) close button in the top-right. */
2148
- onClose?: () => void;
2368
+ onLogout?: () => void;
2149
2369
  }
2150
2370
  /**
2151
- * Pre-login entry screen shown when `enableFullWidget` is true. Mirrors the
2152
- * Figma "Payment method" redesign (frame 1623-32808): a Blink wordmark, a lime
2153
- * mascot hero, the black "Deposit stablecoins / In a Blink" CTA
2154
- * (BlinkDepositButton), an OR divider, and a recessed "Send Crypto Manually"
2155
- * row that routes to the manual-transfer flow.
2371
+ * Wallet authorization screen. On mobile, provides a user-tappable button
2372
+ * that triggers the deeplink via window.open. On desktop, shows inline
2373
+ * authorization progress while wallet extension popups handle the flow.
2156
2374
  */
2157
- declare function DepositOptionsScreen({ onToAddress, onSignInWithBlink, onClose, }: DepositOptionsScreenProps): react_jsx_runtime.JSX.Element;
2375
+ declare function OpenWalletScreen({ walletName, deeplinkUri, loading, walletLogoUrl, useDeeplink, error, onRetryStatus, onRetryAuthorization, onBack, onLogout, }: OpenWalletScreenProps): react_jsx_runtime.JSX.Element;
2158
2376
 
2159
- interface WelcomeBackScreenProps {
2160
- /** Recessed "Send Crypto Manually" row. Navigates to the manual-transfer flow. */
2161
- onToAddress: () => void;
2377
+ interface ApprovingInWalletScreenProps {
2378
+ tokenSymbol: string | null;
2379
+ chainName: string | null;
2380
+ /** Which authorization step the wallet is signing now. Drives the checklist:
2381
+ * 'approve' = on-chain Permit2 approval in progress (step 1 active);
2382
+ * 'sign' = approval done (this session or previously) → step 1 checked, step 2 active;
2383
+ * 'spl' = single Solana delegate approval (one item). */
2384
+ step: 'approve' | 'sign' | 'spl';
2385
+ /** When true, every checklist item renders complete (checked). Set during the
2386
+ * post-sign settling window so the checkmarks persist until the next screen
2387
+ * loads, rather than reverting to the active/pending default. `step` still
2388
+ * selects the shape (one SPL item vs. two EVM items). */
2389
+ complete?: boolean;
2390
+ /** True only while the wallet is genuinely signing the current action. Drives
2391
+ * the active-step spinner. False during the pre-signing transients (pairing
2392
+ * hand-off, awaiting the Approve tap) so the checklist stays at empty
2393
+ * pending circles instead of briefly flashing a spinner. */
2394
+ signing?: boolean;
2395
+ /** Lifetime spending limit label shown on the "{token} on {chain}" row in
2396
+ * place of the wallet address — "Unlimited", or "$<amount> lifetime spending
2397
+ * limit" for a capped allowance. Null renders the row title only. */
2398
+ spendingLimitLabel?: string | null;
2399
+ /** Deployed Blink smart-account address (EVM) or swig/delegate pubkey (Solana)
2400
+ * shown on the "Your Blink Passkey" row. Null until the signing metadata
2401
+ * resolves — the row then renders the label only, never a placeholder value. */
2402
+ destinationAddress?: string | null;
2403
+ /** Server-provided token logo URI for the source row's logo circle. */
2404
+ tokenLogoUri?: string | null;
2405
+ /** When true, signing has not been initiated yet: show the "Approve" CTA and
2406
+ * fire `onApprove` on click instead of auto-prompting the wallet. */
2407
+ awaitingApproval?: boolean;
2408
+ /** Fires when the user taps "Approve" to start the signing sequence. */
2409
+ onApprove?: () => void;
2410
+ error?: string | null;
2411
+ onRetry?: () => void;
2412
+ /** Desktop-only escape hatch back to the previous screen. */
2413
+ onBack?: () => void;
2414
+ /** Desktop-only settings/logout action. */
2415
+ onLogout?: () => void;
2416
+ /** Mobile WalletConnect: connected wallet name, for the "Open {wallet}" button. */
2417
+ walletName?: string | null;
2162
2418
  /**
2163
- * Primary "Complete setup & Deposit" CTA. Advances the returning user to the
2164
- * wallet picker to link a wallet and continue the deposit flow.
2419
+ * Mobile WalletConnect: bare wallet deeplink (no `wc:` URI) for the manual
2420
+ * "Open {wallet}" button. Foregrounds the already-connected wallet so the
2421
+ * pending signing prompt surfaces — does NOT re-pair. Absent on desktop.
2165
2422
  */
2166
- onComplete: () => void;
2167
- /** Dismiss the widget. When set, renders a round (X) close button in the top-right. */
2168
- onClose?: () => void;
2423
+ foregroundDeeplink?: string | null;
2424
+ /** Fires when the user taps "Open {wallet}" (opens `foregroundDeeplink`). */
2425
+ onOpenWallet?: () => void;
2169
2426
  }
2170
2427
  /**
2171
- * Re-greeting screen for returning passkey users who reopen the full-widget
2172
- * flow with a persisted session but no linked wallet. Mirrors
2173
- * `DepositOptionsScreen`'s "Deposit stablecoins / In a Blink" CTA, wrapped in a
2174
- * lime "Finish setup" frame, and routes onward to the wallet picker rather
2175
- * than to login.
2428
+ * Activation surface rendered while the user authorizes the Permit2 / SPL
2429
+ * spending in their wallet. NOT a payment screen no money moves here. Shows
2430
+ * the source wallet Blink passkey hand-off and a checklist of the signatures
2431
+ * being collected. Signing is user-initiated via the "Approve" button (it does
2432
+ * not auto-prompt) so the user reviews the source/destination first.
2176
2433
  */
2177
- declare function WelcomeBackScreen({ onToAddress, onComplete, onClose, }: WelcomeBackScreenProps): react_jsx_runtime.JSX.Element;
2434
+ declare function ApprovingInWalletScreen({ tokenSymbol, chainName, step, complete, signing, spendingLimitLabel, destinationAddress, tokenLogoUri, awaitingApproval, onApprove, error, onRetry, onBack, onLogout, walletName, foregroundDeeplink, onOpenWallet, }: ApprovingInWalletScreenProps): react_jsx_runtime.JSX.Element;
2178
2435
 
2179
- interface BlinkErrorScreenProps {
2180
- /** Heading text shown under the illustration. */
2181
- title: string;
2182
- /** Body copy shown below the title. When null/undefined, nothing renders. */
2183
- message?: string | null;
2184
- /** Label for the primary CTA. When set together with `onRetry`, renders the button. */
2185
- retryLabel?: string;
2186
- onRetry?: () => void;
2187
- /** When set, renders the round (X) close button in the header right slot. */
2188
- onClose?: () => void;
2436
+ interface ConfirmSignScreenProps {
2437
+ walletName: string | null;
2438
+ chainFamily?: 'evm' | 'svm' | null;
2439
+ signing: boolean;
2440
+ error: string | null;
2441
+ onSign: () => void;
2442
+ onLogout: () => void;
2189
2443
  }
2190
2444
  /**
2191
- * Shared error screen that matches the Figma onboarding redesign
2192
- * (node 153:19811 "Sign in Failed"). Displays the bundled traffic-cone
2193
- * illustration above a title + optional message, with an optional Try Again
2194
- * CTA pinned to the footer and an optional close (X) button in the header.
2445
+ * Shown after the user returns from wallet authorization. Requires an explicit
2446
+ * button tap to initiate passkey signing (FaceID) rather than auto-triggering.
2195
2447
  */
2196
- declare function BlinkErrorScreen({ title, message, retryLabel, onRetry, onClose, }: BlinkErrorScreenProps): react_jsx_runtime.JSX.Element;
2448
+ declare function ConfirmSignScreen({ walletName, chainFamily, signing, error, onSign, onLogout, }: ConfirmSignScreenProps): react_jsx_runtime.JSX.Element;
2197
2449
 
2198
- interface OtpVerifyScreenProps {
2199
- /** Masked identifier displayed to the user (e.g. "user@email.com") */
2200
- maskedIdentifier: string;
2201
- otpCode: string;
2202
- onOtpChange: (code: string) => void;
2203
- onVerify: () => void;
2204
- onResend: () => void;
2450
+ interface TokenPickerScreenProps {
2451
+ /**
2452
+ * The currently-selected linked account. May be `undefined` when the
2453
+ * previously-selected account has been removed from state (e.g. after
2454
+ * an account refresh). When undefined the screen renders a clear empty
2455
+ * state instead of crashing on `account.wallets`.
2456
+ */
2457
+ account: Account | undefined;
2458
+ chains: Array<{
2459
+ id: string;
2460
+ name: string;
2461
+ commonId: number | null;
2462
+ }>;
2463
+ onSelectAuthorized: (walletId: string, tokenSymbol: string) => void;
2464
+ onAuthorizeToken: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string) => void;
2205
2465
  onBack: () => void;
2206
- verifying: boolean;
2207
- error: string | null;
2208
- }
2209
- declare function OtpVerifyScreen({ maskedIdentifier, otpCode, onOtpChange, onVerify, onResend, onBack, verifying, error, }: OtpVerifyScreenProps): react_jsx_runtime.JSX.Element;
2210
-
2211
- interface PasskeyScreenProps {
2212
- onCreatePasskey: () => void;
2213
- onBack?: () => void;
2214
2466
  onLogout?: () => void;
2215
- creating: boolean;
2216
- error: string | null;
2217
- /** When true, direct passkey creation failed (Safari iframe restriction). */
2218
- popupFallback?: boolean;
2219
- /** Opens a pop-up window on the Blink domain for passkey registration. */
2220
- onCreatePasskeyViaPopup?: () => void;
2221
- /** Creates a brand-new passkey on this device (for users who already have one on another device). */
2222
- onCreateNewPasskey?: () => void;
2223
- /** Popup fallback variant of onCreateNewPasskey. */
2224
- onCreateNewPasskeyViaPopup?: () => void;
2225
- /** When set, overrides `popupFallback` for the create-new link only. */
2226
- createNewPopupFallback?: boolean;
2227
- /** Loading state while a new passkey is being created. */
2228
- creatingNewPasskey?: boolean;
2467
+ /** Deposit amount for the context card at top */
2468
+ depositAmount?: number;
2469
+ /** Currently selected token symbol, e.g. "USDC" or "USDT" */
2470
+ selectedTokenSymbol?: string;
2471
+ /** Currently selected wallet ID so we can identify the active token across chains */
2472
+ selectedWalletId?: string;
2229
2473
  }
2230
- declare function PasskeyScreen({ onCreatePasskey, onBack, onLogout, creating, error, popupFallback, onCreatePasskeyViaPopup, onCreateNewPasskey, onCreateNewPasskeyViaPopup, createNewPopupFallback, creatingNewPasskey, }: PasskeyScreenProps): react_jsx_runtime.JSX.Element;
2474
+ declare function TokenPickerScreen({ account, chains, onSelectAuthorized, onAuthorizeToken, onBack, onLogout, depositAmount, selectedTokenSymbol, selectedWalletId, }: TokenPickerScreenProps): react_jsx_runtime.JSX.Element;
2231
2475
 
2232
- interface PasskeyPopupWelcomeScreenProps {
2233
- /** Begins passkey creation (Privy signup). */
2234
- onCreatePasskey: () => void;
2235
- /** When set, renders an "or Sign in with passkey" secondary action for users who already have a passkey. */
2236
- onSignInWithPasskey?: () => void;
2237
- /** Disables the actions and shows the primary button's loading state. */
2238
- creating?: boolean;
2239
- /** Error copy shown in a banner below the hero. */
2240
- error?: string | null;
2241
- onBack?: () => void;
2242
- onLogout?: () => void;
2476
+ interface GuestTokenPickerRawRow {
2477
+ chainId: string;
2478
+ sourceChainId: number;
2479
+ chainName: string;
2480
+ tokenSymbol: string;
2481
+ tokenAddress: string;
2482
+ decimals: number;
2483
+ rawBalance: string;
2243
2484
  }
2244
- declare function PasskeyPopupWelcomeScreen({ onCreatePasskey, onSignInWithPasskey, creating, error, onBack, onLogout, }: PasskeyPopupWelcomeScreenProps): react_jsx_runtime.JSX.Element;
2245
-
2246
- interface VerifyPasskeyScreenProps {
2247
- onVerify: () => void;
2248
- onBack?: () => void;
2249
- verifying: boolean;
2485
+ interface GuestTokenEntry extends GuestTokenPickerRawRow {
2486
+ /** Human-readable token amount (not USD). */
2487
+ formattedBalance: string;
2488
+ }
2489
+ declare function mapGuestPickerEntries(rows: GuestTokenPickerRawRow[]): GuestTokenEntry[];
2490
+ interface GuestTokenPickerScreenProps {
2491
+ entries: GuestTokenEntry[];
2492
+ loading: boolean;
2493
+ bridgePhase?: 'preparing';
2250
2494
  error: string | null;
2251
- /** Override the default subtitle text (useful when rendering inside a popup). */
2252
- subtitle?: string;
2495
+ pendingEntry: GuestTokenEntry | null;
2496
+ quoteFee: unknown;
2497
+ quoteLoading: boolean;
2498
+ onSelect: (entry: GuestTokenEntry) => void;
2499
+ onConfirm: () => void;
2500
+ onBack: () => void;
2501
+ oneTapEnabled: boolean;
2502
+ onToggleOneTap: (enabled: boolean) => void;
2503
+ oneTapLimit: number;
2504
+ onSetOneTapLimit: (limit: number) => void;
2505
+ variant?: 'auth-setup';
2506
+ closeListOnSelect?: boolean;
2507
+ emptyMessage?: string;
2253
2508
  }
2254
- declare function VerifyPasskeyScreen({ onVerify, onBack, verifying, error, subtitle, }: VerifyPasskeyScreenProps): react_jsx_runtime.JSX.Element;
2509
+ declare function GuestTokenPickerScreen({ entries, loading, bridgePhase, error, pendingEntry, onSelect, onConfirm, onBack, oneTapEnabled, onToggleOneTap, oneTapLimit, onSetOneTapLimit, variant, closeListOnSelect, emptyMessage, }: GuestTokenPickerScreenProps): react_jsx_runtime.JSX.Element;
2255
2510
 
2256
- interface WalletPickerScreenProps {
2257
- providers: Provider[];
2258
- loading?: boolean;
2259
- useDeeplink?: boolean;
2260
- error?: string | null;
2261
- preparedSessionsByProvider?: Record<string, PreparedSession>;
2262
- preparingLinks?: boolean;
2263
- directLinkCards?: boolean;
2511
+ interface StepHandlers {
2512
+ onLoginWithPasskey: () => void;
2513
+ onSignupWithPasskey: () => void;
2264
2514
  onPrepareProvider: (providerId: string) => Promise<PreparedSession | null>;
2265
2515
  onSelectProvider: (providerId: string, preparedSession?: PreparedSession) => Promise<void>;
2266
2516
  onSelectWalletConnectWallet?: (wallet: ReownWallet) => Promise<void>;
2267
- onBack?: () => void;
2268
- onLogout?: () => void;
2269
- isDesktop?: boolean;
2517
+ onContinueConnection: (accountId: string) => void;
2518
+ onSelectAccount: (accountId: string) => void;
2519
+ onPay: (amount: number, overrides?: {
2520
+ sourceType: SourceType;
2521
+ sourceId: string;
2522
+ }) => void;
2523
+ onIncreaseLimit: () => void;
2524
+ onConfirmSign: () => void;
2525
+ onRetryMobileStatus: () => void;
2526
+ /** Soft-retry the orchestrator (calls `orchestrator.restart()`) without reloading the page. */
2527
+ onRetryAuthorization: () => void;
2528
+ /** Release the signing action paused on ApprovingInWalletScreen (user tapped "Approve"). */
2529
+ onApprove: () => void;
2530
+ /** Re-run passkey signing for an already-created, signable transfer. */
2531
+ onRetryTransferSigning: () => void;
2532
+ onBackFromOpenWallet: () => void;
2533
+ onLogout: () => void;
2534
+ onNewPayment: () => void;
2535
+ onSetPhase: (phase: PaymentPhase) => void;
2536
+ onSelectSourceChainChange: (chainName: string) => void;
2537
+ onSetSelectSourceTokenSymbol: (symbol: string) => void;
2538
+ onConfirmSelectSource: () => void;
2539
+ onSelectToken: () => void;
2540
+ onSelectAuthorizedToken: (walletId: string, tokenSymbol: string, accountId?: string) => void;
2541
+ onAuthorizeToken: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => void;
2542
+ onPrepareTokenAuthorization: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => Promise<PreparedTokenAuthorization | null>;
2543
+ onCommitTokenAuthorization: (prepared: PreparedTokenAuthorization) => void;
2544
+ /** Navigate to wallet-picker when adding a new account from the deposit screen. */
2545
+ onAddProviderFromDeposit: () => void;
2546
+ /**
2547
+ * Tapped from the "Send manually" action row in the inline source sheet.
2548
+ * Currently a no-op placeholder; reserved for the manual-transfer entry point.
2549
+ */
2550
+ onSendManually: () => void;
2551
+ /** Leave desktop link-tokens back to wallet selection, cancelling the paused auth run. */
2552
+ onBackFromSetupDeposit: () => void;
2553
+ /** Leave funding subflow (setup / token picker) back to deposit: restore selection, cancel executor. */
2554
+ onBackFromSubflow: () => void;
2555
+ onLogin: () => void;
2556
+ onCancelLogin: () => void;
2557
+ /** Advance a returning user off WelcomeBackScreen toward the wallet picker. */
2558
+ onAcknowledgeWelcomeBack: () => void;
2559
+ /** Back from WalletPickerScreen: return a walletless user to WelcomeBackScreen. */
2560
+ onReturnToWelcomeBack: () => void;
2561
+ /**
2562
+ * Update the in-flow amount-entry value (string display). Called by
2563
+ * DepositScreen entry mode on every keypress / preset tap. The view-model
2564
+ * wires pure helpers (`enterAmountInput.ts`) into this handler so the
2565
+ * component itself stays presentational.
2566
+ */
2567
+ onAmountInput: (value: string) => void;
2568
+ /**
2569
+ * Commit the in-flow amount-entry value and clear `requireAmountEntry`.
2570
+ * Routes the user past entry mode back into the normal deposit flow.
2571
+ */
2572
+ onFinalizeAmount: () => void;
2573
+ onSetDepositToken: (symbol: string, chainName: string, walletId?: string, tokenAddress?: string, chainId?: number) => void;
2574
+ onConfirmSetupDeposit: (limit: SpendingLimitSelection) => void | Promise<void>;
2575
+ /**
2576
+ * Mobile only: foreground the already-connected WalletConnect wallet from the
2577
+ * signing screen's manual "Open {wallet}" button. Opens the bare wallet
2578
+ * deeplink (no `wc:` URI) so the pending Permit2 prompt surfaces without
2579
+ * re-pairing. Undefined on desktop / when no foreground link is available.
2580
+ */
2581
+ onOpenWalletForeground?: () => void;
2270
2582
  }
2271
- declare function WalletPickerScreen({ providers, loading, useDeeplink, error, preparedSessionsByProvider, preparingLinks, directLinkCards, onPrepareProvider, onSelectProvider, onSelectWalletConnectWallet, onBack, onLogout, isDesktop, }: WalletPickerScreenProps): react_jsx_runtime.JSX.Element;
2272
-
2273
- interface ManualTransferPasskeyScreenProps {
2274
- onCreatePasskey: () => void;
2275
- /** "No thanks" / close action — dismisses the modal. */
2276
- onNoThanks: () => void;
2277
- /** Delivered amount in USD, rendered as the "$X deposited" title. */
2278
- amountUsd?: number;
2279
- loading?: boolean;
2280
- error?: string | null;
2583
+ /** Flow identity: reducer state, auth, layout. */
2584
+ interface StepRendererFlowProps {
2585
+ state: PaymentState;
2586
+ authenticated: boolean;
2587
+ passkeyLoading: boolean;
2588
+ isDesktop: boolean;
2589
+ /**
2590
+ * True when the SDK is hosted inside a native mobile app's in-app browser.
2591
+ * Suppresses in-screen (X) close buttons (the host's native chrome handles
2592
+ * dismissal) and removes rounded screen corners. Optional for backwards
2593
+ * compatibility with pre-existing test fixtures; treated as `false` when
2594
+ * absent.
2595
+ */
2596
+ isMobileApp?: boolean;
2597
+ merchantName?: string;
2281
2598
  onBack?: () => void;
2282
- onClose?: () => void;
2283
- }
2284
- declare function ManualTransferPasskeyScreen({ onCreatePasskey, onNoThanks, amountUsd, loading, error, onBack, onClose, }: ManualTransferPasskeyScreenProps): react_jsx_runtime.JSX.Element;
2285
-
2286
- /**
2287
- * A single {token, chain} pair the user may pick as the deposit source on
2288
- * the Setup / Deposit screens. Previously lived in `SetupScreen.tsx` but is
2289
- * consumed by many unrelated modules (view-model builders, DepositScreen
2290
- * dropdown, auth-app hooks), so it's hoisted here next to the helpers that
2291
- * construct and match these options.
2292
- */
2293
- interface SetupTokenOption {
2294
- symbol: string;
2295
- chainName: string;
2296
- balance?: number;
2297
- walletId?: string;
2298
- status?: string;
2299
- tokenAddress?: string;
2300
- chainId?: number;
2301
- /** Account this token belongs to; used by multi-account pickers to group rows. */
2302
- accountId?: string;
2599
+ onDismiss?: () => void;
2600
+ /** Merchant-fixed depositAmount, or `null` for the hosted entry-mode flow. */
2601
+ depositAmount: number | null;
2303
2602
  /**
2304
- * Truncated wallet address (from `wallet.name`). One account may own wallets
2305
- * at several distinct addresses (e.g. multiple Solana accounts under one
2306
- * Phantom connection); multi-account pickers group rows by address so those
2307
- * are not collapsed under a single header. EVM wallets share one address per
2308
- * account, so this yields a single section there.
2603
+ * Effective deposit amount = `parseAmount(state.amount) ?? depositAmount`.
2604
+ * View models should read this for display so the user's typed value from
2605
+ * deposit-screen entry mode propagates through `deposit`, `link-tokens`,
2606
+ * `processing`, and `token-picker` screens. `depositAmount` is retained
2607
+ * separately for "did the merchant fix this?" semantics (e.g.
2608
+ * `AmountTooLowScreen.canRetry`).
2309
2609
  */
2310
- walletAddress?: string;
2311
- /** Server-provided token logo URI from the catalog. Preferred over the local `TOKEN_LOGOS` map. */
2312
- logoURI?: string | null;
2610
+ effectiveDepositAmount: number | null;
2611
+ minTransferAmountUsd: number;
2612
+ /** Needed to render ManualTransferFlow when phase is manual-transfer. */
2613
+ destination: Destination;
2614
+ merchantAuthorization?: CreateManualTransferParams['merchantAuthorization'];
2615
+ idempotencyKey?: string;
2616
+ /** Host-level completion callback, forwarded to ManualTransferFlow. */
2617
+ onComplete?: (transfer: Transfer) => void;
2618
+ /** Host-level error callback, forwarded to ManualTransferFlow. */
2619
+ onError?: (error: string) => void;
2620
+ }
2621
+ /** Polling, signing, and auth-executor surface. */
2622
+ interface StepRendererRemoteProps {
2623
+ pollingTransfer: Transfer | null;
2624
+ pollingError: string | null;
2625
+ authExecutorError: string | null;
2626
+ /** True while `executeSessionById` is running (desktop inline wallet steps). */
2627
+ authExecutorExecuting: boolean;
2628
+ authExecutorCurrentAction?: AuthorizationAction | null;
2629
+ /** True while a signing action is paused waiting for the user to tap "Approve". */
2630
+ authExecutorAwaitingApproval?: boolean;
2631
+ /** Destination (deployed smart account / swig pubkey) for the paused signing action. */
2632
+ authExecutorApprovalDestinationAddress?: string | null;
2633
+ /** Live session-level smart-account ("Your Blink Passkey") address for the
2634
+ * in-flight approval, mirrored from the tracked session so the approval screen
2635
+ * renders it as soon as the backend surfaces it (created at token selection)
2636
+ * rather than only at the gate. Always the selected chain's address; null
2637
+ * until reported. EVM only. */
2638
+ authApprovalSmartAccountAddress?: string | null;
2639
+ /** True once a run has drained all authorization actions (orchestrator
2640
+ * completed). Stays true through the post-sign settling window — when
2641
+ * `currentAction` is already null — until the next run resets it. Lets the
2642
+ * approving checklist render all items complete instead of reverting to the
2643
+ * default active state while the next screen loads. */
2644
+ authExecutorCompleted: boolean;
2645
+ transferSigningSigning: boolean;
2646
+ transferSigningError: string | null;
2647
+ transferSigningPasskeyDismissed?: boolean;
2648
+ pendingSelectSource: AuthorizationAction | null;
2313
2649
  /**
2314
- * WalletConnect-typed account only: the Reown registry says the backing
2315
- * wallet does not support this token's chain, so authorizing it would
2316
- * dead-end (the prepare/authorize handlers' pre-filter rejects it).
2317
- * Rendered as a disabled "Not supported, deposit manually" row. Never set
2318
- * on AUTHORIZED rows those deposit via passkey without the wallet.
2650
+ * True once the user interactively resolved a SELECT_SOURCE this run (picked
2651
+ * a token on LinkTokensScreen and tapped Approve). Distinguishes the
2652
+ * post-Approve transient — where the executor's `currentAction` is still the
2653
+ * stale OPEN_PROVIDER from pairing from genuine pairing, so OpenWalletScreen
2654
+ * is not re-shown after Approve. False during WC reauthorization auto-resolve
2655
+ * pairing, which keeps OpenWalletScreen visible until the wallet pairs.
2319
2656
  */
2320
- notSupported?: boolean;
2657
+ sourceSelectionResolved: boolean;
2321
2658
  }
2322
-
2323
- interface LinkTokenEntry {
2324
- tokenSymbol: string;
2325
- chainName: string;
2326
- balanceUsd: number;
2659
+ /** Values derived from accounts / selection (plus select-source picker data). */
2660
+ interface StepRendererDerivedProps {
2661
+ pendingConnections: Account[];
2662
+ depositEligibleAccounts: Account[];
2663
+ sourceName: string;
2664
+ maxSourceBalance: number;
2665
+ tokenCount: number;
2666
+ selectedAccount: Account | undefined;
2667
+ selectedSource: WalletSource | null;
2668
+ selectSourceChoices: SelectSourceChainChoice[];
2669
+ /** Balances on chains the WalletConnect session did not approve — rendered as disabled "Not supported" rows. */
2670
+ selectSourceUnsupportedChoices: SelectSourceChainChoice[];
2671
+ /** Native gas assets (ETH, MON, SOL, …) the wallet holds but Permit2 can't authorize — disabled "Not supported" rows. */
2672
+ selectSourceNativeChoices: NativeUnsupportedEntry[];
2673
+ selectSourceRecommended: {
2674
+ chainName: string;
2675
+ tokenSymbol: string;
2676
+ } | null;
2677
+ selectSourceAvailableBalance: number;
2327
2678
  /**
2328
- * WalletConnect-only: the connected wallet cannot sign on this token's
2329
- * chain (missing from both the session's approved chains and the Reown
2330
- * registry). Renders the "Not supported, deposit manually" pill and makes
2331
- * the row unselectable.
2332
- *
2333
- * Also set for native gas assets (ETH, MON, SOL, …) that Permit2 / SPL
2334
- * delegate cannot authorize — see `balanceLabel` / `tokenLogoUri` below.
2679
+ * Reown registry chain ids per WalletConnect-typed account id (null =
2680
+ * registry has no opinion, fail open). Used to badge requires-auth deposit
2681
+ * sources on chains the backing wallet cannot authorize.
2335
2682
  */
2336
- notSupported?: boolean;
2683
+ walletConnectChainIdsByAccount: Record<string, number[] | null>;
2684
+ }
2685
+ /** Ephemeral form UI state. */
2686
+ interface StepRendererFormProps {
2687
+ selectSourceChainName: string;
2688
+ selectSourceTokenSymbol: string;
2689
+ depositQuoteId: string | null;
2690
+ depositQuoteFee: PreciseMoney | null;
2691
+ depositQuoteLoading: boolean;
2692
+ depositQuoteError: string | null;
2693
+ }
2694
+ interface StepRendererProps {
2695
+ flow: StepRendererFlowProps;
2696
+ remote: StepRendererRemoteProps;
2697
+ derived: StepRendererDerivedProps;
2698
+ forms: StepRendererFormProps;
2699
+ handlers: StepHandlers;
2700
+ }
2701
+ declare function StepRenderer(props: StepRendererProps): react_jsx_runtime.JSX.Element;
2702
+
2703
+ /**
2704
+ * Best-effort UI label for device biometrics (Face ID, Touch ID, Windows Hello, etc.).
2705
+ * The web platform does not expose the exact modality; this uses coarse `userAgent`
2706
+ * detection only — synchronous so it can run during render with no effects.
2707
+ */
2708
+ /**
2709
+ * Returns short copy for passkey / biometric prompts based on the current environment.
2710
+ * Does not call WebAuthn (no async); suitable for direct use in render.
2711
+ */
2712
+ declare function getDeviceBiometricUnlockText(): string;
2713
+
2714
+ interface ScreenLayoutProps {
2715
+ children: ReactNode;
2716
+ /** Content pinned to the bottom of the screen (buttons, footer) */
2717
+ footer?: ReactNode;
2337
2718
  /**
2338
- * Server-provided token logo URI (Relay CDN). Used for native gas-asset
2339
- * rows; supported stablecoins fall back to the bundled `TOKEN_LOGOS` map.
2719
+ * When false, the body container does not scroll — useful for screens that
2720
+ * want an inner element (e.g. a list card) to be the scroll container so the
2721
+ * surrounding chrome (heading, banners, CTA) stays pinned. Defaults to true.
2340
2722
  */
2341
- tokenLogoUri?: string | null;
2723
+ scrollableBody?: boolean;
2342
2724
  /**
2343
- * Preformatted native-unit balance (e.g. "0.7 SOL"). When set, it renders
2344
- * verbatim on the right instead of the `$X.XX` USD figure.
2725
+ * When true, the footer floats over the body instead of taking its own band
2726
+ * at the bottom of the sheet. Its background is a gradient that is
2727
+ * transparent across the top half and fades to the solid sheet color for the
2728
+ * bottom half, so the scroll content peeks through above the CTA while the
2729
+ * button itself sits on a solid base. Only the footer's own children are
2730
+ * interactive — the transparent gutter passes taps and scroll through to the
2731
+ * list below. Screens that opt in must reserve bottom padding in their scroll
2732
+ * container so the last row clears the floating footer. Defaults to false.
2345
2733
  */
2346
- balanceLabel?: string;
2347
- }
2348
- interface LinkTokensScreenProps {
2349
- entries: LinkTokenEntry[];
2350
- selectedIndex: number;
2351
- onSelect: (index: number) => void;
2352
- onApprove: () => void;
2353
- /** Desktop-only escape hatch back to wallet selection. */
2354
- onBack?: () => void;
2355
- /** Desktop-only settings/logout action. */
2356
- onLogout?: () => void;
2357
- /** Inline error from authorization or wallet. */
2358
- error?: string | null;
2734
+ floatingFooter?: boolean;
2359
2735
  /**
2360
- * True while the orchestrator is still resolving the available token list.
2361
- * Shows shimmer rows in place of real entries.
2736
+ * When true, the body still scrolls but its scrollbar is visually hidden
2737
+ * (overflow behaviour is unchanged). Use for screens that should never show
2738
+ * scrollbar chrome. Defaults to false.
2362
2739
  */
2363
- loading?: boolean;
2364
- /** Disables the Approve CTA while wallet calls / patches are in flight. */
2365
- approving?: boolean;
2366
- }
2367
- declare function LinkTokensScreen({ entries, selectedIndex, onSelect, onApprove, onBack, onLogout, error, loading, approving, }: LinkTokensScreenProps): react_jsx_runtime.JSX.Element;
2368
-
2369
- interface DepositCompleteScreenProps {
2370
- amount: number;
2740
+ hideScrollbar?: boolean;
2371
2741
  }
2372
- declare function DepositCompleteScreen({ amount }: DepositCompleteScreenProps): react_jsx_runtime.JSX.Element;
2742
+ declare function ScreenLayout({ children, footer, scrollableBody, floatingFooter, hideScrollbar }: ScreenLayoutProps): react_jsx_runtime.JSX.Element;
2373
2743
 
2374
- interface DepositScreenProps {
2375
- merchantName?: string;
2376
- /** Total available balance from source */
2377
- availableBalance: number;
2378
- /** Remaining One-Tap allowance from the API, or null when not configured */
2379
- remainingLimit: number | null;
2380
- /** Number of tokens/chains available */
2381
- tokenCount: number;
2382
- /** Pre-populated amount */
2383
- initialAmount: number;
2384
- /** Pre-transfer fee estimate from POST /v1/transfers/quotes */
2385
- quoteFee?: PreciseMoney | null;
2386
- /** Whether a fee quote is being fetched */
2387
- quoteLoading?: boolean;
2388
- /** User-facing error when the fee quote fails (e.g. amount too low) */
2389
- quoteError?: string | null;
2390
- /** Whether the deposit is currently processing */
2391
- processing?: boolean;
2392
- error: string | null;
2393
- onDeposit: (amount: number) => void;
2394
- onSwitchWallet: () => void;
2395
- onBack: () => void;
2396
- onLogout: () => void;
2397
- /** Called when the user taps "Increase Limit" to re-authorize via wallet deeplink */
2398
- onIncreaseLimit?: () => void;
2399
- /** Whether a limit-increase flow is currently in progress */
2400
- increasingLimit?: boolean;
2401
- /** All user accounts for the source dropdown */
2402
- accounts?: Account[];
2403
- /** Currently selected account ID */
2404
- selectedAccountId?: string | null;
2405
- /** Called when an active account is selected from the dropdown */
2406
- onSelectAccount?: (accountId: string) => void;
2407
- /** Called when an inactive account is clicked (to authorize it) */
2408
- onAuthorizeAccount?: (accountId: string) => void;
2409
- /** Called when "+ Add Provider" is clicked in the dropdown */
2410
- onAddProvider?: () => void;
2411
- /** Called when the "Send manually" action row is tapped from the inline source sheet. */
2412
- onSendManually?: () => void;
2413
- /** Fallback: navigate to the full-page token picker when no inline options. */
2414
- onSelectToken?: () => void;
2415
- /** Available tokens for the inline dropdown. When provided, the token badge opens a dropdown instead of navigating. */
2416
- tokenOptions?: SetupTokenOption[];
2417
- /** Called when the user picks a token from the inline dropdown. */
2418
- onPickToken?: (symbol: string, chainName: string, walletId?: string) => void;
2419
- /** Mobile-only: true when token authorization should be prepared before a real deeplink tap. */
2420
- useDeeplink?: boolean;
2421
- onPrepareTokenAuthorization?: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => Promise<PreparedTokenAuthorization | null>;
2422
- onCommitTokenAuthorization?: (prepared: PreparedTokenAuthorization) => void;
2423
- /** Token symbol for the selected source, e.g. "USDC" or "USDT" */
2424
- selectedTokenSymbol?: string;
2425
- /** Chain name for the selected source, used to disambiguate same-symbol tokens on different chains. */
2426
- selectedChainName?: string;
2427
- /** Server-provided token logo URI for the selected source. */
2428
- selectedTokenLogoUri?: string | null;
2429
- /** Server-provided chain logo URI for the selected source. */
2430
- selectedChainLogoUri?: string | null;
2431
- /** Wallet that owns the selected source. Required for the inline source sheet
2432
- * to mark the active row when two wallets/accounts are authorized on the
2433
- * same symbol+chain. */
2434
- selectedWalletId?: string | null;
2435
- /** Status of the currently selected token source (e.g. "AUTHORIZED"). When present and not "AUTHORIZED", the screen surfaces an "authorize in wallet" CTA + banner. */
2436
- selectedTokenStatus?: string;
2437
- /** Called when the user taps "Continue in {wallet}" to authorize the currently selected (non-authorized) token. */
2438
- onAuthorizeSelectedToken?: () => void;
2439
- /** Whether the authorize-token flow is currently in progress. */
2440
- authorizingToken?: boolean;
2441
- /**
2442
- * Minimum USD amount required for One-Tap on this screen. When the host sets
2443
- * `depositAmount`, this should match it; otherwise the default floor ($0.25)
2444
- * applies (see StepRenderer).
2445
- */
2446
- minDepositFloor: number;
2447
- /** Verbatim display value rendered after `$`, e.g. "0", "12.34", "12.". */
2448
- amountEntryValue?: string;
2449
- /** Digit keypress; `digit` is "0".."9". */
2450
- onDigit?: (digit: string) => void;
2451
- /** Decimal-point keypress. */
2452
- onDecimal?: () => void;
2453
- /** Backspace keypress. */
2454
- onBackspace?: () => void;
2455
- /** Whole-dollar preset chip tap. */
2456
- onPreset?: (dollars: number) => void;
2457
- /** Desktop path: raw native-input string (sanitized by the view-model). */
2458
- onSetValue?: (raw: string) => void;
2459
- /** Whole-dollar preset amounts. Defaults to [5, 25, 100, 250]. */
2460
- presets?: number[];
2744
+ interface ScreenHeaderProps {
2745
+ /** Center title text */
2746
+ title?: string;
2747
+ /** Right-aligned element (avatar, close button, etc.) */
2748
+ right?: ReactNode;
2749
+ /** Called when back arrow is pressed. Omit to hide the back arrow. */
2750
+ onBack?: () => void;
2461
2751
  /**
2462
- * When true, the entry-mode hero renders a native text input and the
2463
- * on-screen keypad is never mounted. When false, the mobile keypad drives
2464
- * input until the user dismisses it via Continue. Ignored when not in
2465
- * entry mode.
2752
+ * Left-aligned element rendered when `onBack` is absent (e.g. a brand
2753
+ * wordmark on the entry screen). Ignored when `onBack` is provided so the
2754
+ * back arrow always takes precedence.
2466
2755
  */
2467
- isDesktop?: boolean;
2468
- }
2469
- declare function DepositScreen({ availableBalance, remainingLimit, initialAmount, minDepositFloor, quoteLoading, processing, error, onDeposit, onSwitchWallet, onBack, onLogout, onIncreaseLimit, increasingLimit, accounts, selectedAccountId, onSelectAccount: _onSelectAccount, onAuthorizeAccount: _onAuthorizeAccount, onAddProvider, onSendManually, onSelectToken, tokenOptions, onPickToken, useDeeplink, onPrepareTokenAuthorization, onCommitTokenAuthorization, selectedTokenSymbol, selectedChainName, selectedTokenLogoUri, selectedChainLogoUri, selectedWalletId, selectedTokenStatus, onAuthorizeSelectedToken, authorizingToken, amountEntryValue, onDigit, onDecimal, onBackspace, onPreset, onSetValue, presets, isDesktop, }: DepositScreenProps): react_jsx_runtime.JSX.Element;
2470
-
2471
- interface SuccessScreenProps {
2472
- amount: number;
2473
- currency: string;
2474
- succeeded: boolean;
2475
- error?: string | null;
2476
- merchantName?: string;
2477
- sourceName?: string;
2478
- onDone?: () => void;
2756
+ left?: ReactNode;
2757
+ /** Optional secondary label next to the title (e.g. "Simple") */
2758
+ badge?: string;
2759
+ /** When provided, renders the three-dot settings menu with a logout action in the right slot. */
2479
2760
  onLogout?: () => void;
2480
2761
  /**
2481
- * When set and no `onDone` handler is provided, renders an instructional
2482
- * message in place of the primary action button. Used by mobile-hosted
2483
- * flows (e.g. auth-app) where the user has no client-side action to take
2484
- * and should simply return to the merchant app.
2762
+ * Element rendered in the centered overlay layer (e.g. a brand wordmark).
2763
+ * Takes precedence over `title` / `badge` when present.
2485
2764
  */
2486
- returnMessage?: string;
2765
+ center?: ReactNode;
2487
2766
  }
2488
- declare function SuccessScreen({ amount, currency: _currency, succeeded, error, merchantName, sourceName, onDone, onLogout, returnMessage, }: SuccessScreenProps): react_jsx_runtime.JSX.Element;
2767
+ declare function ScreenHeader({ title, right, onBack, left, badge, onLogout, center }: ScreenHeaderProps): react_jsx_runtime.JSX.Element;
2489
2768
 
2490
- interface ChainChoice$1 {
2491
- chainName: string;
2492
- balance: number;
2493
- tokens: {
2494
- tokenSymbol: string;
2495
- balance: number;
2496
- walletName?: string;
2497
- walletLogoUrl?: string;
2498
- logoURI?: string | null;
2499
- }[];
2500
- }
2501
- interface SelectSourceScreenProps {
2502
- choices: ChainChoice$1[];
2503
- selectedChainName: string;
2504
- selectedTokenSymbol: string;
2505
- recommended: {
2506
- chainName: string;
2507
- tokenSymbol: string;
2508
- } | null;
2509
- onChainChange: (chainName: string) => void;
2510
- onTokenChange: (tokenSymbol: string) => void;
2511
- onConfirm: () => void;
2512
- /** Primary footer button label (default: "Confirm source"). */
2513
- confirmLabel?: string;
2514
- onBack?: () => void;
2515
- onLogout: () => void;
2516
- }
2517
- declare function SelectSourceScreen({ choices, selectedChainName, selectedTokenSymbol, recommended, onChainChange, onTokenChange, onConfirm, confirmLabel, onBack, onLogout, }: SelectSourceScreenProps): react_jsx_runtime.JSX.Element;
2769
+ declare function PoweredByFooter(): react_jsx_runtime.JSX.Element;
2518
2770
 
2519
- interface DepositSourceAccount {
2520
- id: string;
2521
- /** Provider / account name (e.g. "MetaMask"). Used to look up a logo via KNOWN_LOGOS. */
2522
- name: string;
2523
- /** Optional account display logo, e.g. the selected Reown wallet icon. */
2524
- logoURI?: string;
2525
- /** Full wallet address; a shortened suffix "...abcd" is shown on the right. */
2526
- address?: string | null;
2527
- }
2528
- interface SelectDepositSourceScreenProps {
2529
- /** All deposit-eligible accounts to display, grouped one per section. */
2530
- accounts: DepositSourceAccount[];
2531
- /** Currently selected account; when present, that account's group is rendered first. */
2532
- selectedAccountId?: string | null;
2533
- /** Tokens the user can pick from. Rows below the minimum deposit floor are filtered out.
2534
- * Each row should carry `accountId` so it can be grouped under the owning account. */
2535
- tokenOptions: SetupTokenOption[];
2536
- selectedTokenSymbol?: string;
2537
- selectedChainName?: string;
2538
- /** Wallet that owns the currently active token source. Required (with
2539
- * symbol + chain) for a row to be marked as the active selection so
2540
- * that two wallets/accounts authorized on the same symbol+chain don't
2541
- * both light up. */
2542
- selectedWalletId?: string | null;
2543
- /** Called when the user picks a token row. */
2544
- onPickToken: (symbol: string, chainName: string, walletId?: string) => void;
2545
- /** Mobile-only: unauthorized token rows prepare a real deeplink footer CTA instead of closing immediately. */
2546
- useDeeplink?: boolean;
2547
- onPrepareTokenAuthorization?: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string, accountId?: string) => Promise<PreparedTokenAuthorization | null>;
2548
- onCommitTokenAuthorization?: (prepared: PreparedTokenAuthorization) => void;
2771
+ interface PrimaryButtonProps {
2772
+ /** Button label. Optional only when `spinnerOnly` is set (no label is shown). */
2773
+ children?: ReactNode;
2774
+ onClick?: (event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
2775
+ href?: string;
2776
+ target?: HTMLAttributeAnchorTarget;
2777
+ rel?: string;
2778
+ disabled?: boolean;
2779
+ loading?: boolean;
2780
+ /** Override the default "Please wait..." text shown while loading. */
2781
+ loadingText?: string;
2782
+ /** Optional icon element rendered left of the label */
2783
+ icon?: ReactNode;
2784
+ /** 0-1 fractional progress. When set, the button renders in progress mode with a fill bar. */
2785
+ progress?: number;
2786
+ /** Text shown during progress mode (overrides children and loadingText). */
2787
+ progressText?: string;
2788
+ /** When true, the fill bar pulses to signal the user needs to take action (e.g. confirm in wallet). */
2789
+ progressPaused?: boolean;
2549
2790
  /**
2550
- * "Link Wallet" action row at the bottom of the sheet. When provided, the
2551
- * row appears in the recessed action pill and routes to the existing add-
2552
- * provider flow. Hidden when not provided.
2791
+ * Renders the pill as a non-interactive waiting state: the black pill with a
2792
+ * single centered spinner and no label. For surfaces where the user is
2793
+ * blocked on an external action (e.g. signing in their wallet) and there is
2794
+ * nothing to click.
2553
2795
  */
2554
- onAddProvider?: () => void;
2796
+ spinnerOnly?: boolean;
2797
+ }
2798
+ declare function PrimaryButton({ children, onClick, href, target, rel, disabled, loading, loadingText, icon, progress, progressText, progressPaused, spinnerOnly, }: PrimaryButtonProps): react_jsx_runtime.JSX.Element;
2799
+
2800
+ interface BlinkDepositButtonProps {
2801
+ /** Fired when the user taps the button. Hosts typically open the Blink deposit flow. */
2802
+ onClick: () => void;
2803
+ /** Disables interaction and dims the button. */
2804
+ disabled?: boolean;
2805
+ /** Non-interactive waiting state (e.g. while preparing a deposit session). Dims like disabled. */
2806
+ loading?: boolean;
2555
2807
  /**
2556
- * "Send manually" action row at the bottom of the sheet. When provided,
2557
- * the row appears in the recessed action pill. Currently a no-op upstream
2558
- * — placeholder for the manual-transfer entry point.
2808
+ * Promotional sticker copy (e.g. "2x Your Profits") rendered as a tilted
2809
+ * badge straddling the button's bottom edge. Omit/null to hide it.
2559
2810
  */
2560
- onSendManually?: () => void;
2561
- /** Header back navigation. Falls back to onDone when omitted. */
2562
- onBack?: () => void;
2563
- /** Primary "Done" CTA used to dismiss the sheet. */
2564
- onDone: () => void;
2565
- onLogout?: () => void;
2811
+ promoTagText?: string | null;
2566
2812
  }
2567
2813
  /**
2568
- * Figma "Select source" bottom-sheet (node 320:28467). Replaces the Deposit
2569
- * confirmation content when the user taps the token badge under the
2570
- * lightNew theme. Renders one card per deposit-eligible account (header row
2571
- * plus that account's authorized token sources), followed by a single
2572
- * "Authorisation required" card with the requires-auth rows from every
2573
- * account.
2814
+ * Blink-branded deposit CTA matching the Figma "Payment method" redesign
2815
+ * (frame 1623-32808): a black pill with a bold "Deposit stablecoins" line over
2816
+ * an italic "In a Blink" line, and overlapping USDC/USDT coin marks on the
2817
+ * right.
2818
+ *
2819
+ * Exported for merchants to drop onto their own pages instead of building a
2820
+ * custom button. Outside a BlinkProvider it intentionally styles itself with
2821
+ * the default lightThemeNew palette; inside the widget it follows the
2822
+ * configured theme tokens.
2574
2823
  */
2575
- declare function SelectDepositSourceScreen({ accounts, selectedAccountId, tokenOptions, selectedTokenSymbol, selectedChainName, selectedWalletId, onPickToken, useDeeplink, onPrepareTokenAuthorization, onCommitTokenAuthorization, onAddProvider, onSendManually, onBack, onDone, onLogout, }: SelectDepositSourceScreenProps): react_jsx_runtime.JSX.Element;
2824
+ declare function BlinkDepositButton({ onClick, disabled, loading, promoTagText, }: BlinkDepositButtonProps): react_jsx_runtime.JSX.Element;
2576
2825
 
2577
- interface ChainChoice {
2578
- chainName: string;
2579
- balance: number;
2580
- tokens: {
2581
- tokenSymbol: string;
2582
- balance: number;
2583
- }[];
2584
- }
2585
- interface AdvancedSourceScreenProps {
2586
- choices: ChainChoice[];
2587
- selectedChainName: string;
2588
- selectedTokenSymbol: string;
2589
- onSelectSource: (chainName: string, tokenSymbol: string) => void;
2590
- onBack: () => void;
2826
+ interface OutlineButtonProps {
2827
+ children: ReactNode;
2828
+ onClick?: () => void;
2829
+ disabled?: boolean;
2591
2830
  }
2592
- declare function AdvancedSourceScreen({ choices, selectedChainName, selectedTokenSymbol, onSelectSource, onBack, }: AdvancedSourceScreenProps): react_jsx_runtime.JSX.Element;
2831
+ declare function OutlineButton({ children, onClick, disabled }: OutlineButtonProps): react_jsx_runtime.JSX.Element;
2593
2832
 
2594
- type TransferPhase = 'creating' | 'signing' | 'submitting' | 'sent';
2595
- interface TransferStatusBaseProps {
2596
- phase: TransferPhase;
2597
- error: string | null;
2598
- onLogout?: () => void;
2599
- /**
2600
- * Optional retry hook. Setup flows wire this to `orchestrator.restart()`;
2601
- * deposit flows wire it only after the first passkey signing attempt fails.
2602
- */
2603
- onRetry?: () => void;
2604
- retryLabel?: string;
2605
- retryAfterDelay?: boolean;
2606
- showRetryOnError?: boolean;
2607
- /**
2608
- * Presentation of the error message. `error` (default) uses the red error
2609
- * banner for genuine failures; `info` uses the neutral informational
2610
- * NotificationBanner for benign, retryable conditions (e.g. an expired SVM
2611
- * signing window).
2612
- */
2613
- errorVariant?: 'error' | 'info';
2833
+ interface SecondaryButtonProps {
2834
+ children: ReactNode;
2835
+ onClick?: (event: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
2836
+ href?: string;
2837
+ target?: HTMLAttributeAnchorTarget;
2838
+ rel?: string;
2839
+ disabled?: boolean;
2840
+ loading?: boolean;
2841
+ loadingText?: string;
2614
2842
  }
2843
+ declare function SecondaryButton({ children, onClick, href, target, rel, disabled, loading, loadingText, }: SecondaryButtonProps): react_jsx_runtime.JSX.Element;
2615
2844
 
2616
- interface DepositTransferStatusScreenProps extends TransferStatusBaseProps {
2617
- visibleError?: string | null;
2845
+ interface InfoBannerProps {
2846
+ children: ReactNode;
2847
+ /** SVG icon element. Defaults to a shield icon. */
2848
+ icon?: ReactNode;
2618
2849
  }
2619
- declare function DepositTransferStatusScreen({ phase, error, visibleError, errorVariant, onLogout, onRetry, }: DepositTransferStatusScreenProps): react_jsx_runtime.JSX.Element;
2850
+ declare function InfoBanner({ children, icon }: InfoBannerProps): react_jsx_runtime.JSX.Element;
2620
2851
 
2621
- interface OpenWalletScreenProps {
2622
- walletName: string | null;
2623
- deeplinkUri: string;
2624
- loading: boolean;
2625
- /** When true (mobile), auto-opens deeplinks and shows the "Continue in wallet" button.
2626
- * When false (desktop), shows inline authorization progress instead. */
2627
- useDeeplink?: boolean;
2628
- error?: string | null;
2629
- walletLogoUrl?: string;
2630
- onRetryStatus?: () => void;
2631
- /** Soft-retry the orchestrator (calls `orchestrator.restart()`). Desktop only —
2632
- * shown alongside the error banner when set so the user can recover from a
2633
- * dismissed wallet popup without reloading the iframe. */
2634
- onRetryAuthorization?: () => void;
2635
- onBack?: () => void;
2636
- onLogout?: () => void;
2852
+ type IconCircleVariant = 'accent' | 'success' | 'error';
2853
+ interface IconCircleProps {
2854
+ children: ReactNode;
2855
+ variant?: IconCircleVariant;
2856
+ size?: number;
2637
2857
  }
2638
- /**
2639
- * Wallet authorization screen. On mobile, provides a user-tappable button
2640
- * that triggers the deeplink via window.open. On desktop, shows inline
2641
- * authorization progress while wallet extension popups handle the flow.
2642
- */
2643
- declare function OpenWalletScreen({ walletName, deeplinkUri, loading, walletLogoUrl, useDeeplink, error, onRetryStatus, onRetryAuthorization, onBack, onLogout, }: OpenWalletScreenProps): react_jsx_runtime.JSX.Element;
2858
+ declare function IconCircle({ children, variant, size }: IconCircleProps): react_jsx_runtime.JSX.Element;
2644
2859
 
2645
- interface ApprovingInWalletScreenProps {
2646
- tokenSymbol: string | null;
2647
- chainName: string | null;
2648
- /** Which authorization step the wallet is signing now. Drives the checklist:
2649
- * 'approve' = on-chain Permit2 approval in progress (step 1 active);
2650
- * 'sign' = approval done (this session or previously) → step 1 checked, step 2 active;
2651
- * 'spl' = single Solana delegate approval (one item). */
2652
- step: 'approve' | 'sign' | 'spl';
2653
- /** When true, every checklist item renders complete (checked). Set during the
2654
- * post-sign settling window so the checkmarks persist until the next screen
2655
- * loads, rather than reverting to the active/pending default. `step` still
2656
- * selects the shape (one SPL item vs. two EVM items). */
2657
- complete?: boolean;
2658
- error?: string | null;
2659
- onRetry?: () => void;
2660
- /** Desktop-only escape hatch back to the previous screen. */
2661
- onBack?: () => void;
2662
- /** Desktop-only settings/logout action. */
2663
- onLogout?: () => void;
2664
- /** Mobile WalletConnect: connected wallet name, for the "Open {wallet}" button. */
2665
- walletName?: string | null;
2860
+ interface StepItem {
2861
+ label: string;
2862
+ /** Optional sublabel (e.g. "$100 limit · 2 tokens approved") */
2863
+ detail?: string;
2864
+ status: 'pending' | 'active' | 'complete';
2865
+ }
2866
+ interface StepListProps {
2867
+ steps: StepItem[];
2666
2868
  /**
2667
- * Mobile WalletConnect: bare wallet deeplink (no `wc:` URI) for the manual
2668
- * "Open {wallet}" button. Foregrounds the already-connected wallet so the
2669
- * pending signing prompt surfaces does NOT re-pair. Absent on desktop.
2869
+ * How to render the indicator for the active step.
2870
+ * - 'number' (default): bordered circle with the step number.
2871
+ * - 'spinner': small animated arc in the accent color.
2670
2872
  */
2671
- foregroundDeeplink?: string | null;
2672
- /** Fires when the user taps "Open {wallet}" (opens `foregroundDeeplink`). */
2673
- onOpenWallet?: () => void;
2873
+ activeIndicator?: 'number' | 'spinner';
2874
+ /**
2875
+ * Overall visual density.
2876
+ * - 'md' (default): original compact look.
2877
+ * - 'lg': larger badge, heavier label, more vertical breathing room
2878
+ * (matches the Figma redesign).
2879
+ */
2880
+ size?: 'md' | 'lg';
2674
2881
  }
2675
- /**
2676
- * Activation surface rendered while the user signs the Permit2 / SPL
2677
- * authorization in their wallet. NOT a payment screen — no money moves here.
2678
- * Shares chrome with LinkTokensScreen (header wordmark, h2 heading, recessed
2679
- * card, footer lock banner) so the link → authorize steps read as one page.
2680
- */
2681
- declare function ApprovingInWalletScreen({ tokenSymbol, chainName, step, complete, error, onRetry, onBack, onLogout, walletName, foregroundDeeplink, onOpenWallet, }: ApprovingInWalletScreenProps): react_jsx_runtime.JSX.Element;
2882
+ declare function StepList({ steps, activeIndicator, size, }: StepListProps): react_jsx_runtime.JSX.Element;
2682
2883
 
2683
- interface ConfirmSignScreenProps {
2684
- walletName: string | null;
2685
- chainFamily?: 'evm' | 'svm' | null;
2686
- signing: boolean;
2687
- error: string | null;
2688
- onSign: () => void;
2884
+ interface SettingsMenuProps {
2689
2885
  onLogout: () => void;
2690
2886
  }
2691
- /**
2692
- * Shown after the user returns from wallet authorization. Requires an explicit
2693
- * button tap to initiate passkey signing (FaceID) rather than auto-triggering.
2694
- */
2695
- declare function ConfirmSignScreen({ walletName, chainFamily, signing, error, onSign, onLogout, }: ConfirmSignScreenProps): react_jsx_runtime.JSX.Element;
2887
+ declare function SettingsMenu({ onLogout }: SettingsMenuProps): react_jsx_runtime.JSX.Element;
2696
2888
 
2697
- interface TokenPickerScreenProps {
2698
- /**
2699
- * The currently-selected linked account. May be `undefined` when the
2700
- * previously-selected account has been removed from state (e.g. after
2701
- * an account refresh). When undefined the screen renders a clear empty
2702
- * state instead of crashing on `account.wallets`.
2703
- */
2704
- account: Account | undefined;
2705
- chains: Array<{
2706
- id: string;
2707
- name: string;
2708
- commonId: number | null;
2709
- }>;
2710
- onSelectAuthorized: (walletId: string, tokenSymbol: string) => void;
2711
- onAuthorizeToken: (walletId: string, tokenAddress: string, chainId: number, tokenSymbol: string) => void;
2712
- onBack: () => void;
2713
- onLogout?: () => void;
2714
- /** Deposit amount for the context card at top */
2715
- depositAmount?: number;
2716
- /** Currently selected token symbol, e.g. "USDC" or "USDT" */
2717
- selectedTokenSymbol?: string;
2718
- /** Currently selected wallet ID so we can identify the active token across chains */
2719
- selectedWalletId?: string;
2889
+ interface SpinnerProps {
2890
+ size?: number;
2891
+ label?: string;
2720
2892
  }
2721
- declare function TokenPickerScreen({ account, chains, onSelectAuthorized, onAuthorizeToken, onBack, onLogout, depositAmount, selectedTokenSymbol, selectedWalletId, }: TokenPickerScreenProps): react_jsx_runtime.JSX.Element;
2893
+ declare function Spinner({ size, label }: SpinnerProps): react_jsx_runtime.JSX.Element;
2722
2894
 
2723
- interface GuestTokenPickerRawRow {
2724
- chainId: string;
2725
- sourceChainId: number;
2726
- chainName: string;
2727
- tokenSymbol: string;
2728
- tokenAddress: string;
2729
- decimals: number;
2730
- rawBalance: string;
2731
- }
2732
- interface GuestTokenEntry extends GuestTokenPickerRawRow {
2733
- /** Human-readable token amount (not USD). */
2734
- formattedBalance: string;
2735
- }
2736
- declare function mapGuestPickerEntries(rows: GuestTokenPickerRawRow[]): GuestTokenEntry[];
2737
- interface GuestTokenPickerScreenProps {
2738
- entries: GuestTokenEntry[];
2739
- loading: boolean;
2740
- bridgePhase?: 'preparing';
2741
- error: string | null;
2742
- pendingEntry: GuestTokenEntry | null;
2743
- quoteFee: unknown;
2744
- quoteLoading: boolean;
2745
- onSelect: (entry: GuestTokenEntry) => void;
2746
- onConfirm: () => void;
2747
- onBack: () => void;
2748
- oneTapEnabled: boolean;
2749
- onToggleOneTap: (enabled: boolean) => void;
2750
- oneTapLimit: number;
2751
- onSetOneTapLimit: (limit: number) => void;
2752
- variant?: 'auth-setup';
2753
- closeListOnSelect?: boolean;
2754
- emptyMessage?: string;
2755
- }
2756
- declare function GuestTokenPickerScreen({ entries, loading, bridgePhase, error, pendingEntry, onSelect, onConfirm, onBack, oneTapEnabled, onToggleOneTap, oneTapLimit, onSetOneTapLimit, variant, closeListOnSelect, emptyMessage, }: GuestTokenPickerScreenProps): react_jsx_runtime.JSX.Element;
2895
+ declare function BlinkLoadingScreen(): react_jsx_runtime.JSX.Element;
2896
+ declare function BlinkInitialLoadingScreen(): react_jsx_runtime.JSX.Element;
2757
2897
 
2758
2898
  /**
2759
2899
  * Formats a native-asset amount for display (e.g. `0.7`, `1.2345`, `12.5`).
@@ -2890,4 +3030,4 @@ declare function clearDebugEntries(): void;
2890
3030
  */
2891
3031
  declare function useBlinkDebugLog(): DebugEntry[];
2892
3032
 
2893
- export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, type Account, type ActionExecutionResult, type AdvancedSettings, AdvancedSourceScreen, type Amount, type AnalyticsProps, ApprovingInWalletScreen, type ApprovingInWalletScreenProps, type AuthorizationAction, type AuthorizationSession, AuthorizationSessionCancelledError, type AuthorizationSessionDetail, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, type BlinkPaymentProps, BlinkProvider, type BlinkProviderProps, type Chain, ConfirmSignScreen, type DebugEntry, type DebugLevel, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, type Destination, type ErrorResponse, type ExecutionResult, type GuestTokenEntry, type GuestTokenPickerRawRow, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, type LinkTokenEntry, LinkTokensScreen, type ListResponse, LoginScreen, ManualTransferPasskeyScreen, type MerchantAuthorization, type MerchantPublicKey, type MobileFlowState, type NativeUnsupportedEntry, OpenWalletScreen, type OrchestratorResult, type OrchestratorRunOptions, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, type PaymentPhase, type PaymentState, PoweredByFooter, type PreciseMoney, PrimaryButton, type Provider, ScreenHeader, ScreenLayout, type ScreenName, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, type SetupTokenOption, type SolanaAccountSwitchDeps, type SourceOption, type SourceSelection, type SourceType, Spinner, type StepHandlers, type StepItem, StepList, StepRenderer, type StepRendererDerivedProps, type StepRendererFlowProps, type StepRendererFormProps, type StepRendererProps, type StepRendererRemoteProps, SuccessScreen, type ThemeMode, type ThemeTokens, type TokenBalance, TokenPickerScreen, type Transfer, type TransferDestination, type TransferPhase, type UseAuthorizationExecutorResult, type UseAuthorizationOrchestratorResult, type UserConfig, VerifyPasskeyScreen, type Wallet, type WalletAccountChange, type WalletAccountSwitchResult, type WalletCapabilities, type WalletCapabilitiesDebugSnapshot, type WalletDeeplink, WalletPickerScreen, type WalletSource, type WalletToken, WelcomeBackScreen, appendDebug, api as blinkApi, buildNativeUnsupportedEntries, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, formatNativeAmount, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, identifyUser, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resetUser, resolveAnalyticsEnvironment, resolvePasskeyRpId, sanitizeProps, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, track, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
3033
+ export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, type Account, type ActionExecutionResult, type AdvancedSettings, AdvancedSourceScreen, type Amount, type AnalyticsProps, ApprovingInWalletScreen, type ApprovingInWalletScreenProps, type AuthorizationAction, type AuthorizationSession, AuthorizationSessionCancelledError, type AuthorizationSessionDetail, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, type BlinkPaymentProps, BlinkProvider, type BlinkProviderProps, type Chain, ConfirmSignScreen, type DebugEntry, type DebugLevel, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, type Destination, type ErrorResponse, type ExecutionResult, type GuestTokenEntry, type GuestTokenPickerRawRow, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, type LinkTokenEntry, LinkTokensScreen, type ListResponse, LoginScreen, ManualTransferPasskeyScreen, type MerchantAuthorization, type MerchantPublicKey, type MobileFlowState, type NativeUnsupportedEntry, OpenWalletScreen, type OrchestratorResult, type OrchestratorRunOptions, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, type PaymentPhase, type PaymentState, PoweredByFooter, type PreciseMoney, PrimaryButton, type Provider, ScreenHeader, ScreenLayout, type ScreenName, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, type SetupTokenOption, type SolanaAccountSwitchDeps, type SourceOption, type SourceSelection, type SourceType, type SpendingLimitSelection, Spinner, type StepHandlers, type StepItem, StepList, StepRenderer, type StepRendererDerivedProps, type StepRendererFlowProps, type StepRendererFormProps, type StepRendererProps, type StepRendererRemoteProps, SuccessScreen, type ThemeMode, type ThemeTokens, type TokenBalance, TokenPickerScreen, type Transfer, type TransferDestination, type TransferPhase, type UseAuthorizationExecutorResult, type UseAuthorizationOrchestratorResult, type UserConfig, VerifyPasskeyScreen, type Wallet, type WalletAccountChange, type WalletAccountSwitchResult, type WalletCapabilities, type WalletCapabilitiesDebugSnapshot, type WalletDeeplink, WalletPickerScreen, type WalletSource, type WalletToken, WelcomeBackScreen, appendDebug, api as blinkApi, buildNativeUnsupportedEntries, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, formatNativeAmount, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, identifyUser, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resetUser, resolveAnalyticsEnvironment, resolvePasskeyRpId, sanitizeProps, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, track, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };