@rhinestone/1auth 0.1.0
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/chunk-UXYKIMGZ.mjs +482 -0
- package/dist/chunk-UXYKIMGZ.mjs.map +1 -0
- package/dist/client-C1inywuT.d.mts +777 -0
- package/dist/client-C1inywuT.d.ts +777 -0
- package/dist/index.d.mts +267 -0
- package/dist/index.d.ts +267 -0
- package/dist/index.js +2701 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2213 -0
- package/dist/index.mjs.map +1 -0
- package/dist/provider-Dgh51NRc.d.mts +24 -0
- package/dist/provider-q7M728Mn.d.ts +24 -0
- package/dist/react.d.mts +41 -0
- package/dist/react.d.ts +41 -0
- package/dist/react.js +228 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +193 -0
- package/dist/react.mjs.map +1 -0
- package/dist/server.d.mts +81 -0
- package/dist/server.d.ts +81 -0
- package/dist/server.js +142 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +116 -0
- package/dist/server.mjs.map +1 -0
- package/dist/wagmi.d.mts +15 -0
- package/dist/wagmi.d.ts +15 -0
- package/dist/wagmi.js +569 -0
- package/dist/wagmi.js.map +1 -0
- package/dist/wagmi.mjs +176 -0
- package/dist/wagmi.mjs.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/account.ts","../src/walletClient/index.ts","../src/batch/BatchQueueContext.tsx","../src/batch/BatchQueueWidget.tsx","../src/verify.ts"],"sourcesContent":["import { parseEther, parseUnits, hashTypedData, encodeFunctionData, type TypedDataDefinition, type Address } from \"viem\";\nimport type {\n PasskeyProviderConfig,\n SigningRequestOptions,\n SigningResult,\n CreateSigningRequestResponse,\n SigningRequestStatus,\n SigningErrorCode,\n EmbedOptions,\n UserPasskeysResponse,\n PasskeyCredential,\n RegisterResult,\n LoginResult,\n AuthenticateOptions,\n AuthenticateResult,\n SendIntentOptions,\n SendIntentResult,\n PrepareIntentResponse,\n ExecuteIntentResponse,\n WebAuthnSignature,\n SendSwapOptions,\n SendSwapResult,\n ThemeConfig,\n SignMessageOptions,\n SignMessageResult,\n SignTypedDataOptions,\n SignTypedDataResult,\n} from \"./types\";\nimport {\n getChainById,\n getTokenDecimals,\n getTokenSymbol,\n isTokenAddressSupported,\n resolveTokenAddress,\n} from \"./registry\";\n\nconst POPUP_WIDTH = 450;\nconst POPUP_HEIGHT = 600;\nconst DEFAULT_EMBED_WIDTH = \"400px\";\nconst DEFAULT_EMBED_HEIGHT = \"500px\";\nconst MODAL_WIDTH = 360;\nconst MODAL_WIDTH_EXPANDED = 600;\n\nexport class PasskeyProviderClient {\n private config: PasskeyProviderConfig;\n private theme: ThemeConfig;\n\n constructor(config: PasskeyProviderConfig) {\n this.config = config;\n this.theme = config.theme || {};\n }\n\n /**\n * Update the theme configuration at runtime\n */\n setTheme(theme: ThemeConfig): void {\n this.theme = theme;\n }\n\n /**\n * Build theme URL parameters\n */\n private getThemeParams(overrideTheme?: ThemeConfig): string {\n const theme = { ...this.theme, ...overrideTheme };\n const params = new URLSearchParams();\n\n if (theme.mode) {\n params.set('theme', theme.mode);\n }\n if (theme.accent) {\n params.set('accent', theme.accent);\n }\n\n return params.toString();\n }\n\n /**\n * Get the dialog URL (Vite app URL)\n * Defaults to providerUrl if dialogUrl is not set\n */\n private getDialogUrl(): string {\n return this.config.dialogUrl || this.config.providerUrl;\n }\n\n /**\n * Get the origin for message validation\n * Uses dialogUrl origin if set, otherwise providerUrl origin\n */\n private getDialogOrigin(): string {\n const dialogUrl = this.getDialogUrl();\n try {\n return new URL(dialogUrl).origin;\n } catch {\n return dialogUrl;\n }\n }\n\n /**\n * Get the base provider URL\n */\n getProviderUrl(): string {\n return this.config.providerUrl;\n }\n\n /**\n * Get the configured client ID\n */\n getClientId(): string {\n return this.config.clientId;\n }\n\n private async waitForTransactionHash(\n intentId: string,\n options: { timeoutMs?: number; intervalMs?: number } = {}\n ): Promise<string | undefined> {\n const timeoutMs = options.timeoutMs ?? 120_000;\n const intervalMs = options.intervalMs ?? 2_000;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n const response = await fetch(\n `${this.config.providerUrl}/api/intent/status/${intentId}`,\n {\n headers: {\n \"x-client-id\": this.config.clientId,\n },\n }\n );\n if (response.ok) {\n const data = await response.json();\n if (data.transactionHash) {\n return data.transactionHash as string;\n }\n if (data.status === \"failed\" || data.status === \"expired\") {\n return undefined;\n }\n }\n } catch {\n // Keep polling until timeout.\n }\n\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n return undefined;\n }\n\n /**\n * Show Porto-style \"Get started\" auth dialog (combines sign in + sign up)\n * This is the recommended method for authentication - shows a modal overlay\n * with both sign in and create account options.\n */\n async authWithModal(options?: {\n username?: string;\n theme?: ThemeConfig;\n oauthEnabled?: boolean;\n }): Promise<LoginResult | RegisterResult> {\n const dialogUrl = this.getDialogUrl();\n const params = new URLSearchParams({\n clientId: this.config.clientId,\n mode: 'iframe',\n });\n if (options?.username) {\n params.set('username', options.username);\n }\n if (options?.oauthEnabled === false) {\n params.set('oauth', '0');\n }\n\n // Add theme params\n const themeParams = this.getThemeParams(options?.theme);\n if (themeParams) {\n const themeParsed = new URLSearchParams(themeParams);\n themeParsed.forEach((value, key) => params.set(key, value));\n }\n\n const url = `${dialogUrl}/dialog/auth?${params.toString()}`;\n\n const { dialog, iframe, cleanup } = this.createModalDialog(url);\n\n return this.waitForModalAuthResponse(dialog, iframe, cleanup);\n }\n\n /**\n * Authenticate a user with an optional challenge to sign.\n *\n * This method combines authentication (sign in / sign up) with optional\n * challenge signing, enabling off-chain login without on-chain transactions.\n *\n * When a challenge is provided:\n * 1. User authenticates (sign in or sign up)\n * 2. The challenge is hashed with a domain separator\n * 3. User signs the hash with their passkey\n * 4. Returns user info + signature for server-side verification\n *\n * The domain separator (\"\\x19Passkey Signed Message:\\n\") ensures the signature\n * cannot be reused for transaction signing, preventing phishing attacks.\n *\n * @example\n * ```typescript\n * // Authenticate with a login challenge\n * const result = await client.authenticate({\n * challenge: `Login to MyApp\\nTimestamp: ${Date.now()}\\nNonce: ${crypto.randomUUID()}`\n * });\n *\n * if (result.success && result.signature) {\n * // Verify signature server-side\n * const isValid = await verifyOnServer(\n * result.username,\n * result.signature,\n * result.signedHash\n * );\n * }\n * ```\n */\n async authenticate(options?: AuthenticateOptions & { theme?: ThemeConfig }): Promise<AuthenticateResult> {\n const dialogUrl = this.getDialogUrl();\n const params = new URLSearchParams({\n clientId: this.config.clientId,\n mode: 'iframe',\n });\n\n if (options?.challenge) {\n params.set('challenge', options.challenge);\n }\n\n // Add theme params\n const themeParams = this.getThemeParams(options?.theme);\n if (themeParams) {\n const themeParsed = new URLSearchParams(themeParams);\n themeParsed.forEach((value, key) => params.set(key, value));\n }\n\n const url = `${dialogUrl}/dialog/authenticate?${params.toString()}`;\n\n const { dialog, iframe, cleanup } = this.createModalDialog(url);\n\n return this.waitForAuthenticateResponse(dialog, iframe, cleanup);\n }\n\n /**\n * Show signing in a modal overlay (Porto-style iframe dialog)\n */\n async signWithModal(options: SigningRequestOptions & { theme?: ThemeConfig }): Promise<SigningResult> {\n const dialogUrl = this.getDialogUrl();\n const themeParams = this.getThemeParams(options?.theme);\n const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ''}`;\n\n const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);\n\n // Send signing data via postMessage after iframe loads\n const dialogOrigin = this.getDialogOrigin();\n await new Promise<void>((resolve) => {\n iframe.onload = () => {\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_INIT\",\n mode: \"iframe\",\n challenge: options.challenge,\n username: options.username,\n description: options.description,\n transaction: options.transaction,\n metadata: options.metadata,\n }, dialogOrigin);\n resolve();\n };\n });\n\n return this.waitForSigningResponse(dialog, iframe, cleanup);\n }\n\n /**\n * Send an intent to the Rhinestone orchestrator\n *\n * This is the high-level method for cross-chain transactions:\n * 1. Prepares the intent (gets quote from orchestrator)\n * 2. Shows the signing modal with real fees\n * 3. Submits the signed intent for execution\n * 4. Returns the transaction hash\n *\n * @example\n * ```typescript\n * const result = await client.sendIntent({\n * username: 'alice',\n * targetChain: 8453, // Base\n * calls: [\n * {\n * to: '0x...',\n * data: '0x...',\n * label: 'Swap ETH for USDC',\n * sublabel: '0.1 ETH → ~250 USDC',\n * },\n * ],\n * });\n *\n * if (result.success) {\n * console.log('Transaction hash:', result.transactionHash);\n * }\n * ```\n */\n async sendIntent(options: SendIntentOptions): Promise<SendIntentResult> {\n // Determine username, targetChain, and calls from either signedIntent or direct options\n const signedIntent = options.signedIntent;\n const username = signedIntent?.username || options.username;\n const targetChain = signedIntent?.targetChain || options.targetChain;\n const calls = signedIntent?.calls || options.calls;\n\n // Validate we have required fields\n if (!username && !signedIntent?.accountAddress) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"INVALID_OPTIONS\",\n message: \"Either username, accountAddress, or signedIntent with user identifier is required\",\n },\n };\n }\n\n if (!targetChain || !calls?.length) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"INVALID_OPTIONS\",\n message: \"targetChain and calls are required (either directly or via signedIntent)\",\n },\n };\n }\n\n // 1. Prepare intent (get quote from orchestrator)\n // If signedIntent is provided, send it directly for signature verification\n // Otherwise, send unsigned request (only works for first-party apps in ALLOWED_ORIGINS)\n let prepareResponse: PrepareIntentResponse;\n try {\n const requestBody = signedIntent || {\n username: options.username,\n targetChain: options.targetChain,\n calls: options.calls,\n tokenRequests: options.tokenRequests,\n sourceAssets: options.sourceAssets,\n clientId: this.config.clientId,\n };\n\n const response = await fetch(`${this.config.providerUrl}/api/intent/prepare`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.error || \"Failed to prepare intent\";\n\n // If user not found, clear stored user to force re-authentication\n if (errorMessage.includes(\"User not found\")) {\n localStorage.removeItem(\"1auth-user\");\n }\n\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: errorMessage.includes(\"User not found\") ? \"USER_NOT_FOUND\" : \"PREPARE_FAILED\",\n message: errorMessage,\n },\n };\n }\n\n prepareResponse = await response.json();\n } catch (error) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Network error\",\n },\n };\n }\n\n // 2. Show signing modal (no DB storage - data sent via postMessage)\n const dialogUrl = this.getDialogUrl();\n const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe`;\n const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);\n\n // 3. Wait for dialog to signal ready, then send signing data\n const dialogOrigin = this.getDialogOrigin();\n await new Promise<void>((resolve) => {\n const handleReady = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n if (event.data?.type === \"PASSKEY_READY\") {\n window.removeEventListener(\"message\", handleReady);\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_INIT\",\n mode: \"iframe\",\n calls,\n chainId: targetChain,\n transaction: prepareResponse.transaction,\n challenge: prepareResponse.challenge,\n username,\n accountAddress: prepareResponse.accountAddress,\n intentId: prepareResponse.intentId,\n }, dialogOrigin);\n resolve();\n }\n };\n window.addEventListener(\"message\", handleReady);\n });\n\n // 4. Wait for signing result (modal stays open)\n const signingResult = await this.waitForSigningResponse(dialog, iframe, cleanup);\n\n if (!signingResult.success) {\n // cleanup already called if user rejected via X button\n return {\n success: false,\n intentId: prepareResponse.intentId,\n status: \"failed\",\n error: signingResult.error,\n };\n }\n\n // 5. Execute intent with signature\n let executeResponse: ExecuteIntentResponse;\n try {\n const response = await fetch(`${this.config.providerUrl}/api/intent/execute`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intentId: prepareResponse.intentId,\n signature: signingResult.signature,\n passkey: signingResult.passkey, // Include passkey info for signature encoding\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n // Send failure status to dialog\n this.sendTransactionStatus(iframe, \"failed\");\n // Wait for dialog to close\n await this.waitForDialogClose(dialog, cleanup);\n return {\n success: false,\n intentId: prepareResponse.intentId,\n status: \"failed\",\n error: {\n code: \"EXECUTE_FAILED\",\n message: errorData.error || \"Failed to execute intent\",\n },\n };\n }\n\n executeResponse = await response.json();\n } catch (error) {\n // Send failure status to dialog\n this.sendTransactionStatus(iframe, \"failed\");\n // Wait for dialog to close\n await this.waitForDialogClose(dialog, cleanup);\n return {\n success: false,\n intentId: prepareResponse.intentId,\n status: \"failed\",\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Network error\",\n },\n };\n }\n\n // 6. Wait for completion using SDK's waitForExecution via server endpoint\n const closeOn = options.closeOn || \"preconfirmed\";\n const acceptPreconfirmations = closeOn !== \"completed\";\n\n let finalStatus = executeResponse.status;\n let finalTxHash = executeResponse.transactionHash;\n\n if (finalStatus === \"pending\") {\n // Send \"processing\" status to dialog\n this.sendTransactionStatus(iframe, \"processing\");\n\n try {\n // Use the wait endpoint which uses the SDK's waitForExecution internally\n const waitResponse = await fetch(\n `${this.config.providerUrl}/api/intent/wait/${prepareResponse.intentId}?preconfirm=${acceptPreconfirmations}`,\n {\n headers: {\n \"x-client-id\": this.config.clientId,\n },\n }\n );\n\n if (waitResponse.ok) {\n const waitResult = await waitResponse.json();\n finalStatus = waitResult.status === \"preconfirmed\" || waitResult.status === \"completed\"\n ? \"completed\"\n : waitResult.status;\n finalTxHash = waitResult.transactionHash;\n } else {\n // Wait failed, keep pending status\n console.error(\"Wait endpoint failed:\", await waitResponse.text());\n }\n } catch (waitError) {\n console.error(\"Failed to wait for intent:\", waitError);\n }\n }\n\n // 7. Send final status to dialog\n const displayStatus = finalStatus === \"completed\" ? \"confirmed\" : finalStatus;\n this.sendTransactionStatus(iframe, displayStatus, finalTxHash);\n\n // Wait for dialog to be closed by user\n await this.waitForDialogClose(dialog, cleanup);\n\n if (options.waitForHash && !finalTxHash) {\n const hash = await this.waitForTransactionHash(prepareResponse.intentId, {\n timeoutMs: options.hashTimeoutMs,\n intervalMs: options.hashIntervalMs,\n });\n if (hash) {\n finalTxHash = hash;\n finalStatus = \"completed\";\n } else {\n finalStatus = \"failed\";\n return {\n success: false,\n intentId: prepareResponse.intentId,\n status: finalStatus,\n transactionHash: finalTxHash,\n operationId: executeResponse.operationId,\n error: {\n code: \"HASH_TIMEOUT\",\n message: \"Timed out waiting for transaction hash\",\n },\n };\n }\n }\n\n return {\n success: finalStatus === \"completed\",\n intentId: prepareResponse.intentId,\n status: finalStatus,\n transactionHash: finalTxHash,\n operationId: executeResponse.operationId,\n error: executeResponse.error,\n };\n }\n\n /**\n * Send transaction status to the dialog iframe\n */\n private sendTransactionStatus(\n iframe: HTMLIFrameElement,\n status: string,\n transactionHash?: string\n ): void {\n const dialogOrigin = this.getDialogOrigin();\n iframe.contentWindow?.postMessage(\n {\n type: \"TRANSACTION_STATUS\",\n status,\n transactionHash,\n },\n dialogOrigin\n );\n }\n\n /**\n * Wait for the signing result without closing the modal\n */\n private waitForIntentSigningResponse(\n requestId: string,\n dialog: HTMLDialogElement,\n _iframe: HTMLIFrameElement,\n cleanup: () => void\n ): Promise<SigningResult> {\n const dialogOrigin = this.getDialogOrigin();\n\n return new Promise((resolve) => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const message = event.data;\n const payload = message?.data as { requestId?: string; signature?: WebAuthnSignature; passkey?: { credentialId: string; publicKeyX: string; publicKeyY: string } } | undefined;\n\n if (message?.type === \"PASSKEY_SIGNING_RESULT\" && payload?.requestId === requestId) {\n window.removeEventListener(\"message\", handleMessage);\n\n if (message.success && payload.signature) {\n resolve({\n success: true,\n requestId,\n signature: payload.signature,\n passkey: payload.passkey, // Include passkey info for signature encoding\n });\n } else {\n resolve({\n success: false,\n error: message.error || {\n code: \"SIGNING_FAILED\" as SigningErrorCode,\n message: \"Signing failed\",\n },\n });\n }\n } else if (message?.type === \"PASSKEY_CLOSE\") {\n // User clicked X button to close/reject\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve({\n success: false,\n error: {\n code: \"USER_REJECTED\" as SigningErrorCode,\n message: \"User closed the dialog\",\n },\n });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n dialog.showModal();\n });\n }\n\n /**\n * Wait for signing result (simplified - no requestId matching)\n */\n private waitForSigningResponse(\n dialog: HTMLDialogElement,\n _iframe: HTMLIFrameElement,\n cleanup: () => void\n ): Promise<SigningResult & { signedHash?: string }> {\n const dialogOrigin = this.getDialogOrigin();\n console.log(\"[SDK] waitForSigningResponse, expecting origin:\", dialogOrigin);\n\n return new Promise((resolve) => {\n const handleMessage = (event: MessageEvent) => {\n console.log(\"[SDK] Received message:\", event.origin, event.data?.type);\n if (event.origin !== dialogOrigin) {\n console.log(\"[SDK] Origin mismatch, ignoring. Expected:\", dialogOrigin, \"Got:\", event.origin);\n return;\n }\n\n const message = event.data;\n const payload = message?.data as { signature?: WebAuthnSignature; passkey?: { credentialId: string; publicKeyX: string; publicKeyY: string }; signedHash?: string } | undefined;\n\n if (message?.type === \"PASSKEY_SIGNING_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n\n if (message.success && payload?.signature) {\n resolve({\n success: true,\n signature: payload.signature,\n passkey: payload.passkey,\n signedHash: payload.signedHash,\n });\n } else {\n resolve({\n success: false,\n error: message.error || {\n code: \"SIGNING_FAILED\" as SigningErrorCode,\n message: \"Signing failed\",\n },\n });\n }\n } else if (message?.type === \"PASSKEY_CLOSE\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve({\n success: false,\n error: {\n code: \"USER_REJECTED\" as SigningErrorCode,\n message: \"User closed the dialog\",\n },\n });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n }\n\n /**\n * Wait for the dialog to be closed\n */\n private waitForDialogClose(\n dialog: HTMLDialogElement,\n cleanup: () => void\n ): Promise<void> {\n const dialogOrigin = this.getDialogOrigin();\n\n return new Promise((resolve) => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n if (event.data?.type === \"PASSKEY_CLOSE\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve();\n }\n };\n\n // Also handle dialog close via escape key or clicking outside\n const handleClose = () => {\n window.removeEventListener(\"message\", handleMessage);\n dialog.removeEventListener(\"close\", handleClose);\n cleanup();\n resolve();\n };\n\n window.addEventListener(\"message\", handleMessage);\n dialog.addEventListener(\"close\", handleClose);\n });\n }\n\n /**\n * Poll for intent status\n *\n * Use this to check on the status of a submitted intent\n * that hasn't completed yet.\n */\n async getIntentStatus(intentId: string): Promise<SendIntentResult> {\n try {\n const response = await fetch(\n `${this.config.providerUrl}/api/intent/status/${intentId}`,\n {\n headers: {\n \"x-client-id\": this.config.clientId,\n },\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n intentId,\n status: \"failed\",\n error: {\n code: \"STATUS_FAILED\",\n message: errorData.error || \"Failed to get intent status\",\n },\n };\n }\n\n const data = await response.json();\n return {\n success: data.status === \"completed\",\n intentId,\n status: data.status,\n transactionHash: data.transactionHash,\n operationId: data.operationId,\n };\n } catch (error) {\n return {\n success: false,\n intentId,\n status: \"failed\",\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Network error\",\n },\n };\n }\n }\n\n /**\n * Send a swap intent through the Rhinestone orchestrator\n *\n * This is a high-level abstraction for token swaps (including cross-chain):\n * 1. Resolves token symbols to addresses\n * 2. Builds the swap intent with tokenRequests (output-first model)\n * 3. The orchestrator's solver network finds the best route\n * 4. Executes via the standard intent flow\n *\n * NOTE: The `amount` parameter specifies the OUTPUT amount (what the user wants to receive),\n * not the input amount. The orchestrator will calculate the required input from sourceAssets.\n *\n * @example\n * ```typescript\n * // Buy 100 USDC using ETH on Base\n * const result = await client.sendSwap({\n * username: 'alice',\n * targetChain: 8453,\n * fromToken: 'ETH',\n * toToken: 'USDC',\n * amount: '100', // Receive 100 USDC\n * });\n *\n * // Cross-chain: Buy 50 USDC on Base, paying with ETH from any chain\n * const result = await client.sendSwap({\n * username: 'alice',\n * targetChain: 8453, // Base\n * fromToken: 'ETH',\n * toToken: 'USDC',\n * amount: '50', // Receive 50 USDC\n * });\n * ```\n */\n async sendSwap(options: SendSwapOptions): Promise<SendSwapResult> {\n try {\n getChainById(options.targetChain);\n } catch {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"INVALID_CHAIN\",\n message: `Unsupported chain: ${options.targetChain}`,\n },\n };\n }\n\n const resolveToken = (token: string, label: \"fromToken\" | \"toToken\") => {\n try {\n const address = resolveTokenAddress(token, options.targetChain);\n if (!isTokenAddressSupported(address, options.targetChain)) {\n return {\n error: `Unsupported ${label}: ${token} on chain ${options.targetChain}`,\n };\n }\n return { address };\n } catch (error) {\n return {\n error: error instanceof Error\n ? error.message\n : `Unsupported ${label}: ${token} on chain ${options.targetChain}`,\n };\n }\n };\n\n const fromTokenResult = resolveToken(options.fromToken, \"fromToken\");\n if (!fromTokenResult.address) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"INVALID_TOKEN\",\n message: fromTokenResult.error || `Unknown fromToken: ${options.fromToken}`,\n },\n };\n }\n\n const toTokenResult = resolveToken(options.toToken, \"toToken\");\n if (!toTokenResult.address) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"INVALID_TOKEN\",\n message: toTokenResult.error || `Unknown toToken: ${options.toToken}`,\n },\n };\n }\n\n const fromTokenAddress = fromTokenResult.address;\n const toTokenAddress = toTokenResult.address;\n\n // Debug: log token resolution\n console.log(\"[SDK sendSwap] Token resolution:\", {\n fromToken: options.fromToken,\n fromTokenAddress,\n toToken: options.toToken,\n toTokenAddress,\n targetChain: options.targetChain,\n });\n\n const formatTokenLabel = (token: string, fallback: string): string => {\n if (!token.startsWith(\"0x\")) {\n return token.toUpperCase();\n }\n try {\n return getTokenSymbol(token as Address, options.targetChain);\n } catch {\n return fallback;\n }\n };\n\n const fromSymbol = formatTokenLabel(\n options.fromToken,\n `${options.fromToken.slice(0, 6)}...${options.fromToken.slice(-4)}`\n );\n const toSymbol = formatTokenLabel(\n options.toToken,\n `${options.toToken.slice(0, 6)}...${options.toToken.slice(-4)}`\n );\n\n // Check if swapping from/to native ETH\n const isFromNativeEth =\n fromTokenAddress === \"0x0000000000000000000000000000000000000000\";\n const isToNativeEth =\n toTokenAddress === \"0x0000000000000000000000000000000000000000\";\n\n // Get decimals for the tokens to convert human-readable amounts to base units\n // Use known decimals for common tokens as fallback\n const KNOWN_DECIMALS: Record<string, number> = {\n ETH: 18,\n WETH: 18,\n USDC: 6,\n USDT: 6,\n USDT0: 6,\n };\n const getDecimals = (symbol: string, chainId: number): number => {\n const upperSymbol = symbol.toUpperCase();\n try {\n const decimals = getTokenDecimals(upperSymbol as never, chainId);\n console.log(`[SDK] getTokenDecimals(${upperSymbol}, ${chainId}) = ${decimals}`);\n return decimals;\n } catch (e) {\n console.warn(`[SDK] getTokenDecimals failed for ${upperSymbol}, using fallback`, e);\n return KNOWN_DECIMALS[upperSymbol] ?? 18;\n }\n };\n const fromDecimals = getDecimals(options.fromToken, options.targetChain);\n const toDecimals = getDecimals(options.toToken, options.targetChain);\n\n // Check if this is a bridge (same token) or swap (different tokens)\n const isBridge = options.fromToken.toUpperCase() === options.toToken.toUpperCase();\n\n // Build tokenRequests - tells orchestrator what output token/amount we want\n // The amount parameter now represents OUTPUT (what user wants to receive)\n // We always specify tokenRequests so the orchestrator knows the desired output\n let tokenRequests: { token: string; amount: string }[] | undefined;\n if (!isToNativeEth) {\n // For non-native output tokens, specify the exact output amount we want\n tokenRequests = [{\n token: toTokenAddress,\n amount: parseUnits(options.amount, toDecimals).toString(),\n }];\n }\n // For native ETH output: orchestrator handles it differently (no tokenRequests needed)\n\n console.log(\"[SDK sendSwap] Building intent:\", {\n isBridge,\n isFromNativeEth,\n isToNativeEth,\n fromDecimals,\n toDecimals,\n tokenRequests,\n });\n\n // Build the intent\n // The orchestrator will handle finding the best swap/bridge route\n // For swaps/bridges, we use tokenRequests to specify output\n // We need at least one call (SDK requirement), so we use a minimal placeholder\n const result = await this.sendIntent({\n username: options.username,\n targetChain: options.targetChain,\n calls: [\n {\n // Minimal call - just signals to orchestrator we want the tokenRequests delivered\n to: toTokenAddress,\n value: \"0\",\n },\n ],\n // Request specific output tokens - this is what actually matters for swaps\n tokenRequests,\n // Constrain orchestrator to use only the fromToken as input\n // This ensures the swap uses the correct source token\n // Pass the symbol (not address) so orchestrator can resolve per-chain\n sourceAssets: options.sourceAssets || [options.fromToken.toUpperCase()],\n closeOn: options.closeOn || \"preconfirmed\",\n waitForHash: options.waitForHash,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n\n // Return with swap-specific data\n return {\n ...result,\n quote: result.success\n ? {\n fromToken: fromTokenAddress,\n toToken: toTokenAddress,\n amountIn: options.amount,\n amountOut: \"\", // Filled by orchestrator quote\n rate: \"\",\n }\n : undefined,\n };\n }\n\n /**\n * Sign an arbitrary message with the user's passkey\n *\n * This is for off-chain message signing (e.g., authentication challenges,\n * terms acceptance, login signatures), NOT for transaction signing.\n * The message is displayed to the user and signed with their passkey.\n *\n * @example\n * ```typescript\n * // Sign a login challenge\n * const result = await client.signMessage({\n * username: 'alice',\n * message: `Sign in to MyApp\\nTimestamp: ${Date.now()}\\nNonce: ${crypto.randomUUID()}`,\n * description: 'Verify your identity to continue',\n * });\n *\n * if (result.success) {\n * // Send signature to your backend for verification\n * await fetch('/api/verify', {\n * method: 'POST',\n * body: JSON.stringify({\n * signature: result.signature,\n * message: result.signedMessage,\n * }),\n * });\n * }\n * ```\n */\n async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {\n const dialogUrl = this.getDialogUrl();\n const themeParams = this.getThemeParams(options?.theme);\n const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ''}`;\n\n const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);\n\n // Wait for dialog to signal ready, then send message signing data\n const dialogOrigin = this.getDialogOrigin();\n await new Promise<void>((resolve) => {\n const handleReady = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n if (event.data?.type === \"PASSKEY_READY\") {\n window.removeEventListener(\"message\", handleReady);\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_INIT\",\n mode: \"iframe\",\n message: options.message,\n challenge: options.challenge || options.message,\n username: options.username,\n description: options.description,\n metadata: options.metadata,\n }, dialogOrigin);\n resolve();\n }\n };\n window.addEventListener(\"message\", handleReady);\n });\n\n const signingResult = await this.waitForSigningResponse(dialog, iframe, cleanup);\n\n cleanup();\n\n if (signingResult.success) {\n return {\n success: true,\n signature: signingResult.signature,\n signedMessage: options.message,\n signedHash: signingResult.signedHash as `0x${string}` | undefined,\n passkey: signingResult.passkey,\n };\n }\n\n return {\n success: false,\n error: signingResult.error,\n };\n }\n\n /**\n * Sign EIP-712 typed data with the user's passkey\n *\n * This method allows signing structured data following the EIP-712 standard.\n * The typed data is displayed to the user in a human-readable format before signing.\n *\n * @example\n * ```typescript\n * // Sign an ERC-2612 Permit\n * const result = await client.signTypedData({\n * username: 'alice',\n * domain: {\n * name: 'Dai Stablecoin',\n * version: '1',\n * chainId: 1,\n * verifyingContract: '0x6B175474E89094C44Da98b954EecdeCB5BE3830F',\n * },\n * types: {\n * Permit: [\n * { name: 'owner', type: 'address' },\n * { name: 'spender', type: 'address' },\n * { name: 'value', type: 'uint256' },\n * { name: 'nonce', type: 'uint256' },\n * { name: 'deadline', type: 'uint256' },\n * ],\n * },\n * primaryType: 'Permit',\n * message: {\n * owner: '0xabc...',\n * spender: '0xdef...',\n * value: 1000000000000000000n,\n * nonce: 0n,\n * deadline: 1735689600n,\n * },\n * });\n *\n * if (result.success) {\n * console.log('Signed hash:', result.signedHash);\n * }\n * ```\n */\n async signTypedData(options: SignTypedDataOptions): Promise<SignTypedDataResult> {\n // Compute the EIP-712 hash using viem\n // Use unknown cast to work around viem's strict template literal type requirements\n const signedHash = hashTypedData({\n domain: options.domain,\n types: options.types,\n primaryType: options.primaryType,\n message: options.message,\n } as unknown as TypedDataDefinition);\n\n const dialogUrl = this.getDialogUrl();\n const themeParams = this.getThemeParams(options?.theme);\n const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ''}`;\n\n const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);\n\n // Wait for dialog to signal ready, then send typed data\n const dialogOrigin = this.getDialogOrigin();\n await new Promise<void>((resolve) => {\n const handleReady = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n if (event.data?.type === \"PASSKEY_READY\") {\n window.removeEventListener(\"message\", handleReady);\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_INIT\",\n mode: \"iframe\",\n signingMode: \"typedData\",\n typedData: {\n domain: options.domain,\n types: options.types,\n primaryType: options.primaryType,\n message: options.message,\n },\n challenge: signedHash,\n username: options.username,\n description: options.description,\n }, dialogOrigin);\n resolve();\n }\n };\n window.addEventListener(\"message\", handleReady);\n });\n\n const signingResult = await this.waitForSigningResponse(dialog, iframe, cleanup);\n\n cleanup();\n\n if (signingResult.success) {\n return {\n success: true,\n signature: signingResult.signature,\n signedHash,\n passkey: signingResult.passkey,\n };\n }\n\n return {\n success: false,\n error: signingResult.error,\n };\n }\n\n async signWithPopup(options: SigningRequestOptions): Promise<SigningResult> {\n const request = await this.createSigningRequest(options, \"popup\");\n\n // Use dialogUrl to construct the signing URL (override server's URL)\n const dialogUrl = this.getDialogUrl();\n const signingUrl = `${dialogUrl}/dialog/sign/${request.requestId}?mode=popup`;\n\n const popup = this.openPopup(signingUrl);\n if (!popup) {\n return {\n success: false,\n error: {\n code: \"POPUP_BLOCKED\",\n message:\n \"Popup was blocked by the browser. Please allow popups for this site.\",\n },\n };\n }\n\n return this.waitForPopupResponse(request.requestId, popup);\n }\n\n async signWithRedirect(\n options: SigningRequestOptions,\n redirectUrl?: string\n ): Promise<void> {\n const finalRedirectUrl = redirectUrl || this.config.redirectUrl;\n if (!finalRedirectUrl) {\n throw new Error(\n \"redirectUrl is required for redirect flow. Pass it to signWithRedirect() or set it in the constructor.\"\n );\n }\n\n const request = await this.createSigningRequest(\n options,\n \"redirect\",\n finalRedirectUrl\n );\n\n // Use dialogUrl to construct the signing URL (override server's URL)\n const dialogUrl = this.getDialogUrl();\n const signingUrl = `${dialogUrl}/dialog/sign/${request.requestId}?mode=redirect&redirectUrl=${encodeURIComponent(finalRedirectUrl)}`;\n\n window.location.href = signingUrl;\n }\n\n async signWithEmbed(\n options: SigningRequestOptions,\n embedOptions: EmbedOptions\n ): Promise<SigningResult> {\n const request = await this.createSigningRequest(options, \"embed\");\n\n const iframe = this.createEmbed(request.requestId, embedOptions);\n\n return this.waitForEmbedResponse(request.requestId, iframe, embedOptions);\n }\n\n private createEmbed(\n requestId: string,\n options: EmbedOptions\n ): HTMLIFrameElement {\n const dialogUrl = this.getDialogUrl();\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${dialogUrl}/dialog/sign/${requestId}?mode=iframe`;\n iframe.style.width = options.width || DEFAULT_EMBED_WIDTH;\n iframe.style.height = options.height || DEFAULT_EMBED_HEIGHT;\n iframe.style.border = \"none\";\n iframe.style.borderRadius = \"12px\";\n iframe.style.boxShadow = \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\";\n iframe.id = `passkey-embed-${requestId}`;\n iframe.allow = \"publickey-credentials-get *; publickey-credentials-create *\";\n\n iframe.onload = () => {\n options.onReady?.();\n };\n\n options.container.appendChild(iframe);\n\n return iframe;\n }\n\n private waitForEmbedResponse(\n requestId: string,\n iframe: HTMLIFrameElement,\n embedOptions: EmbedOptions\n ): Promise<SigningResult> {\n const dialogOrigin = this.getDialogOrigin();\n return new Promise((resolve) => {\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n iframe.remove();\n embedOptions.onClose?.();\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) {\n return;\n }\n\n const message = event.data;\n // The Messenger sends: { type, success, data: { requestId, signature }, error }\n const payload = message?.data as { requestId?: string; signature?: WebAuthnSignature } | undefined;\n\n if (\n message?.type === \"PASSKEY_SIGNING_RESULT\" &&\n payload?.requestId === requestId\n ) {\n cleanup();\n\n if (message.success && payload.signature) {\n resolve({\n success: true,\n requestId,\n signature: payload.signature,\n });\n } else {\n resolve({\n success: false,\n requestId,\n error: message.error,\n });\n }\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n }\n\n removeEmbed(requestId: string): void {\n const iframe = document.getElementById(`passkey-embed-${requestId}`);\n if (iframe) {\n iframe.remove();\n }\n }\n\n async handleRedirectCallback(): Promise<SigningResult> {\n const params = new URLSearchParams(window.location.search);\n const requestId = params.get(\"request_id\");\n const status = params.get(\"status\");\n const error = params.get(\"error\");\n const errorMessage = params.get(\"error_message\");\n\n if (error) {\n return {\n success: false,\n requestId: requestId || undefined,\n error: {\n code: error as SigningResult extends { success: false }\n ? SigningResult[\"error\"][\"code\"]\n : never,\n message: errorMessage || \"Unknown error\",\n },\n };\n }\n\n if (!requestId) {\n return {\n success: false,\n error: {\n code: \"INVALID_REQUEST\",\n message: \"No request_id found in callback URL\",\n },\n };\n }\n\n if (status !== \"completed\") {\n return {\n success: false,\n requestId,\n error: {\n code: \"UNKNOWN\",\n message: `Unexpected status: ${status}`,\n },\n };\n }\n\n return this.fetchSigningResult(requestId);\n }\n\n /**\n * Fetch passkeys for a user from the auth provider\n */\n async getPasskeys(username: string): Promise<PasskeyCredential[]> {\n const response = await fetch(\n `${this.config.providerUrl}/api/users/${encodeURIComponent(username)}/passkeys`,\n {\n headers: {\n \"x-client-id\": this.config.clientId,\n },\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || errorData.message || \"Failed to fetch passkeys\");\n }\n\n const data: UserPasskeysResponse = await response.json();\n return data.passkeys;\n }\n\n private async createSigningRequest(\n options: SigningRequestOptions,\n mode: \"popup\" | \"redirect\" | \"embed\",\n redirectUrl?: string\n ): Promise<CreateSigningRequestResponse> {\n const response = await fetch(\n `${this.config.providerUrl}/api/sign/request`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n clientId: this.config.clientId,\n username: options.username,\n challenge: options.challenge,\n description: options.description,\n metadata: options.metadata,\n transaction: options.transaction,\n mode,\n redirectUrl,\n }),\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || errorData.message || \"Failed to create signing request\");\n }\n\n return response.json();\n }\n\n private openPopup(url: string): Window | null {\n const left = window.screenX + (window.outerWidth - POPUP_WIDTH) / 2;\n const top = window.screenY + 50; // Near top of window\n\n return window.open(\n url,\n \"passkey-signing\",\n `width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top},popup=true`\n );\n }\n\n /**\n * Create a modal dialog with an iframe inside (Porto-style overlay)\n */\n private createModalDialog(url: string): {\n dialog: HTMLDialogElement;\n iframe: HTMLIFrameElement;\n cleanup: () => void;\n } {\n const dialogUrl = this.getDialogUrl();\n const hostUrl = new URL(dialogUrl);\n\n // Create dialog element\n const dialog = document.createElement(\"dialog\");\n dialog.dataset.passkey = \"\";\n document.body.appendChild(dialog);\n\n // Add styles with AppKit-inspired polish\n const style = document.createElement(\"style\");\n style.textContent = `\n dialog[data-passkey] {\n padding: 0;\n border: none;\n background: transparent;\n max-width: none;\n max-height: none;\n margin: 0;\n position: fixed;\n top: 50px;\n left: 50%;\n transform: translateX(-50%);\n outline: none;\n }\n\n dialog[data-passkey]::backdrop {\n background-color: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n }\n\n dialog[data-passkey] iframe {\n background-color: transparent;\n border-radius: 14px;\n border: none;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n transition: width 0.2s ease-out, height 0.15s ease-out;\n }\n\n @media (min-width: 769px) {\n dialog[data-passkey] iframe {\n animation: passkey_zoomIn 0.2s cubic-bezier(0.32, 0.72, 0, 1);\n }\n }\n\n @media (max-width: 768px) {\n dialog[data-passkey] {\n width: 100vw !important;\n height: auto !important;\n max-height: 90vh !important;\n max-height: 90dvh !important;\n top: auto !important;\n bottom: 0 !important;\n left: 0 !important;\n right: 0 !important;\n transform: none !important;\n margin: 0 !important;\n }\n\n dialog[data-passkey] iframe {\n animation: passkey_slideFromBottom 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n width: 100% !important;\n max-height: 90vh !important;\n max-height: 90dvh !important;\n box-shadow: 0 -4px 32px rgba(0, 0, 0, 0.15) !important;\n }\n }\n\n @keyframes passkey_zoomIn {\n from {\n opacity: 0;\n transform: scale(0.96) translateY(8px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n @keyframes passkey_slideFromBottom {\n from { transform: translate3d(0, 100%, 0); }\n to { transform: translate3d(0, 0, 0); }\n }\n\n @keyframes passkey_shake {\n 0%, 100% { transform: translateX(0); }\n 20% { transform: translateX(-4px); }\n 40% { transform: translateX(4px); }\n 60% { transform: translateX(-4px); }\n 80% { transform: translateX(4px); }\n }\n `;\n dialog.appendChild(style);\n\n // Create iframe\n const iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\n \"allow\",\n \"publickey-credentials-get *; publickey-credentials-create *; clipboard-write\"\n );\n iframe.setAttribute(\"aria-label\", \"Passkey Authentication\");\n iframe.setAttribute(\"tabindex\", \"0\");\n iframe.setAttribute(\n \"sandbox\",\n \"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n );\n iframe.setAttribute(\"src\", url);\n iframe.setAttribute(\"title\", \"Passkey\");\n iframe.style.border = \"none\";\n iframe.style.height = \"400px\"; // Initial height, will be resized\n iframe.style.width = `${MODAL_WIDTH}px`; // Initial width, can be resized\n\n dialog.appendChild(iframe);\n\n // Handle resize and disconnect messages from iframe\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== hostUrl.origin) return;\n if (event.data?.type === \"PASSKEY_RESIZE\") {\n iframe.style.height = `${event.data.height}px`;\n if (event.data.width) {\n iframe.style.width = `${event.data.width}px`;\n }\n } else if (event.data?.type === \"PASSKEY_DISCONNECT\") {\n // Clear stored user from parent's localStorage\n localStorage.removeItem(\"1auth-user\");\n }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // Handle escape key\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n cleanup();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n\n // Handle backdrop click\n dialog.addEventListener(\"click\", (event) => {\n if (event.target === dialog) {\n cleanup();\n }\n });\n\n // Show modal\n dialog.showModal();\n\n const cleanup = () => {\n window.removeEventListener(\"message\", handleMessage);\n document.removeEventListener(\"keydown\", handleEscape);\n dialog.close();\n dialog.remove();\n };\n\n return { dialog, iframe, cleanup };\n }\n\n private waitForModalAuthResponse(\n _dialog: HTMLDialogElement,\n _iframe: HTMLIFrameElement,\n cleanup: () => void\n ): Promise<LoginResult | RegisterResult> {\n const dialogOrigin = this.getDialogOrigin();\n return new Promise((resolve) => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const data = event.data;\n if (data?.type === \"PASSKEY_LOGIN_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n\n if (data.success) {\n resolve({\n success: true,\n username: data.data?.username,\n user: data.data?.user,\n });\n } else {\n resolve({\n success: false,\n error: data.error,\n });\n }\n } else if (data?.type === \"PASSKEY_REGISTER_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n\n if (data.success) {\n resolve({\n success: true,\n username: data.data?.username,\n });\n } else {\n resolve({\n success: false,\n error: data.error,\n });\n }\n } else if (data?.type === \"PASSKEY_CLOSE\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve({\n success: false,\n error: {\n code: \"USER_CANCELLED\",\n message: \"Authentication was cancelled\",\n },\n });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n }\n\n private waitForAuthenticateResponse(\n _dialog: HTMLDialogElement,\n _iframe: HTMLIFrameElement,\n cleanup: () => void\n ): Promise<AuthenticateResult> {\n const dialogOrigin = this.getDialogOrigin();\n return new Promise((resolve) => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const data = event.data;\n if (data?.type === \"PASSKEY_AUTHENTICATE_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n\n if (data.success) {\n resolve({\n success: true,\n username: data.data?.username,\n user: data.data?.user,\n accountAddress: data.data?.accountAddress,\n signature: data.data?.signature,\n signedHash: data.data?.signedHash,\n });\n } else {\n resolve({\n success: false,\n error: data.error,\n });\n }\n } else if (data?.type === \"PASSKEY_CLOSE\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve({\n success: false,\n error: {\n code: \"USER_CANCELLED\",\n message: \"Authentication was cancelled\",\n },\n });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n }\n\n private waitForModalSigningResponse(\n requestId: string,\n _dialog: HTMLDialogElement,\n _iframe: HTMLIFrameElement,\n cleanup: () => void\n ): Promise<SigningResult> {\n const dialogOrigin = this.getDialogOrigin();\n return new Promise((resolve) => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const message = event.data;\n // The Messenger sends: { type, success, data: { requestId, signature }, error }\n // So we need to check message.data.requestId, not message.requestId\n const payload = message?.data as { requestId?: string; signature?: WebAuthnSignature } | undefined;\n\n if (message?.type === \"PASSKEY_SIGNING_RESULT\" && payload?.requestId === requestId) {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n\n if (message.success && payload.signature) {\n resolve({\n success: true,\n requestId,\n signature: payload.signature,\n });\n } else {\n resolve({\n success: false,\n requestId,\n error: message.error,\n });\n }\n } else if (message?.type === \"PASSKEY_CLOSE\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve({\n success: false,\n requestId,\n error: {\n code: \"USER_REJECTED\",\n message: \"Signing was cancelled\",\n },\n });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n }\n\n private waitForPopupResponse(\n requestId: string,\n popup: Window\n ): Promise<SigningResult> {\n const dialogOrigin = this.getDialogOrigin();\n return new Promise((resolve) => {\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener(\"message\", handleMessage);\n resolve({\n success: false,\n requestId,\n error: {\n code: \"USER_REJECTED\",\n message: \"Popup was closed without completing\",\n },\n });\n }\n }, 500);\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) {\n return;\n }\n\n const message = event.data;\n // The Messenger sends: { type, success, data: { requestId, signature }, error }\n const payload = message?.data as { requestId?: string; signature?: WebAuthnSignature } | undefined;\n\n if (\n message?.type === \"PASSKEY_SIGNING_RESULT\" &&\n payload?.requestId === requestId\n ) {\n clearInterval(checkClosed);\n window.removeEventListener(\"message\", handleMessage);\n popup.close();\n\n if (message.success && payload.signature) {\n resolve({\n success: true,\n requestId,\n signature: payload.signature,\n });\n } else {\n resolve({\n success: false,\n requestId,\n error: message.error,\n });\n }\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n }\n\n private async fetchSigningResult(requestId: string): Promise<SigningResult> {\n const response = await fetch(\n `${this.config.providerUrl}/api/sign/request/${requestId}`,\n {\n headers: {\n \"x-client-id\": this.config.clientId,\n },\n }\n );\n\n if (!response.ok) {\n return {\n success: false,\n requestId,\n error: {\n code: \"NETWORK_ERROR\",\n message: \"Failed to fetch signing result\",\n },\n };\n }\n\n const data: SigningRequestStatus = await response.json();\n\n if (data.status === \"COMPLETED\" && data.signature) {\n return {\n success: true,\n requestId,\n signature: data.signature,\n };\n }\n\n const errorCode: SigningErrorCode = data.error?.code || \"UNKNOWN\";\n return {\n success: false,\n requestId,\n error: {\n code: errorCode,\n message: data.error?.message || `Request status: ${data.status}`,\n },\n };\n }\n}\n","import {\n bytesToString,\n hexToString,\n isHex,\n type Address,\n type LocalAccount,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport { toAccount } from \"viem/accounts\";\nimport { PasskeyProviderClient } from \"./client\";\nimport type { EIP712Domain, EIP712Types } from \"./types\";\nimport { encodeWebAuthnSignature } from \"./walletClient/utils\";\n\nexport type PasskeyAccount = LocalAccount<\"1auth\"> & {\n username: string;\n};\n\nexport function createPasskeyAccount(\n client: PasskeyProviderClient,\n params: { address: Address; username: string }\n): PasskeyAccount {\n const { address, username } = params;\n\n const normalizeMessage = (message: SignableMessage): string => {\n if (typeof message === \"string\") return message;\n const raw = message.raw;\n if (isHex(raw)) {\n try {\n return hexToString(raw);\n } catch {\n return raw;\n }\n }\n return bytesToString(raw);\n };\n\n const account = toAccount({\n address,\n signMessage: async ({ message }: { message: SignableMessage }) => {\n const result = await client.signMessage({\n username,\n message: normalizeMessage(message),\n });\n if (!result.success || !result.signature) {\n throw new Error(result.error?.message || \"Signing failed\");\n }\n return encodeWebAuthnSignature(result.signature);\n },\n signTransaction: async () => {\n throw new Error(\"signTransaction not supported; use sendIntent\");\n },\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData\n >(\n typedData: TypedDataDefinition<typedData, primaryType>\n ) => {\n if (!typedData.domain || !typedData.types || !typedData.primaryType) {\n throw new Error(\"Invalid typed data\");\n }\n const domainInput = typedData.domain as Partial<EIP712Domain>;\n if (!domainInput.name || !domainInput.version) {\n throw new Error(\"Typed data domain must include name and version\");\n }\n const domain: EIP712Domain = {\n name: domainInput.name,\n version: domainInput.version,\n chainId:\n typeof domainInput.chainId === \"bigint\"\n ? Number(domainInput.chainId)\n : domainInput.chainId,\n verifyingContract: domainInput.verifyingContract,\n salt: domainInput.salt,\n };\n const rawTypes =\n typedData.types as Record<string, readonly { name: string; type: string }[]>;\n const normalizedTypes = Object.fromEntries(\n Object.entries(rawTypes).map(([key, fields]) => [\n key,\n fields.map((field) => ({ name: field.name, type: field.type })),\n ])\n ) as EIP712Types;\n const result = await client.signTypedData({\n username,\n domain,\n types: normalizedTypes,\n primaryType: typedData.primaryType as string,\n message: typedData.message as Record<string, unknown>,\n });\n if (!result.success || !result.signature) {\n throw new Error(result.error?.message || \"Signing failed\");\n }\n return encodeWebAuthnSignature(result.signature);\n },\n });\n\n return {\n ...(account as LocalAccount<\"1auth\">),\n username,\n };\n}\n","import {\n createWalletClient,\n hashMessage,\n hashTypedData,\n type WalletClient,\n type Hash,\n type SignableMessage,\n type TypedDataDefinition,\n} from 'viem';\nimport { toAccount } from 'viem/accounts';\nimport { PasskeyProviderClient } from '../client';\nimport type {\n PasskeyWalletClientConfig,\n SendCallsParams,\n TransactionCall,\n} from './types';\nimport {\n encodeWebAuthnSignature,\n hashCalls,\n buildTransactionReview,\n} from './utils';\n\nexport type { PasskeyWalletClientConfig, TransactionCall, SendCallsParams } from './types';\nexport { encodeWebAuthnSignature, hashCalls } from './utils';\n\n/**\n * Extended WalletClient with passkey signing and batch transaction support\n */\nexport type PasskeyWalletClient = WalletClient & {\n /**\n * Send multiple calls as a single batched transaction\n * Opens the passkey modal for user approval\n */\n sendCalls: (params: SendCallsParams) => Promise<Hash>;\n};\n\n/**\n * Create a viem-compatible WalletClient that uses passkeys for signing\n *\n * @example\n * ```typescript\n * import { createPasskeyWalletClient } from '@rhinestone/1auth';\n * import { baseSepolia } from 'viem/chains';\n * import { http } from 'viem';\n *\n * const walletClient = createPasskeyWalletClient({\n * accountAddress: '0x...',\n * username: 'alice',\n * providerUrl: 'https://auth.example.com',\n * clientId: 'my-dapp',\n * chain: baseSepolia,\n * transport: http(),\n * });\n *\n * // Standard viem API\n * const hash = await walletClient.sendTransaction({\n * to: '0x...',\n * data: '0x...',\n * value: 0n,\n * });\n *\n * // Batched transactions\n * const batchHash = await walletClient.sendCalls({\n * calls: [\n * { to: '0x...', data: '0x...' },\n * { to: '0x...', data: '0x...' },\n * ],\n * });\n * ```\n */\nexport function createPasskeyWalletClient(\n config: PasskeyWalletClientConfig\n): PasskeyWalletClient {\n const provider = new PasskeyProviderClient({\n providerUrl: config.providerUrl,\n clientId: config.clientId,\n dialogUrl: config.dialogUrl,\n });\n\n // Helper function to sign a message\n const signMessageImpl = async (message: SignableMessage): Promise<`0x${string}`> => {\n const hash = hashMessage(message);\n\n const result = await provider.signWithModal({\n challenge: hash,\n username: config.username,\n description: 'Sign message',\n transaction: {\n actions: [\n {\n type: 'custom',\n label: 'Sign Message',\n sublabel:\n typeof message === 'string'\n ? message.slice(0, 50) + (message.length > 50 ? '...' : '')\n : 'Raw message',\n },\n ],\n },\n });\n\n if (!result.success) {\n throw new Error(result.error?.message || 'Signing failed');\n }\n\n return encodeWebAuthnSignature(result.signature);\n };\n\n // Helper function to sign a transaction\n const signTransactionImpl = async (transaction: any): Promise<`0x${string}`> => {\n const calls: TransactionCall[] = [\n {\n to: transaction.to!,\n data: transaction.data,\n value: transaction.value,\n },\n ];\n\n const hash = hashCalls(calls);\n\n const result = await provider.signWithModal({\n challenge: hash,\n username: config.username,\n description: 'Sign transaction',\n transaction: buildTransactionReview(calls),\n });\n\n if (!result.success) {\n throw new Error(result.error?.message || 'Signing failed');\n }\n\n return encodeWebAuthnSignature(result.signature);\n };\n\n // Helper function to sign typed data\n const signTypedDataImpl = async (typedData: any): Promise<`0x${string}`> => {\n const hash = hashTypedData(typedData as TypedDataDefinition);\n\n const result = await provider.signWithModal({\n challenge: hash,\n username: config.username,\n description: 'Sign typed data',\n transaction: {\n actions: [\n {\n type: 'custom',\n label: 'Sign Data',\n sublabel: typedData.primaryType || 'Typed Data',\n },\n ],\n },\n });\n\n if (!result.success) {\n throw new Error(result.error?.message || 'Signing failed');\n }\n\n return encodeWebAuthnSignature(result.signature);\n };\n\n // Create account with type assertion to avoid complex generic issues\n const account = toAccount({\n address: config.accountAddress,\n signMessage: ({ message }) => signMessageImpl(message),\n signTransaction: signTransactionImpl,\n signTypedData: signTypedDataImpl as any,\n });\n\n // Create the base wallet client\n const client = createWalletClient({\n account,\n chain: config.chain,\n transport: config.transport,\n });\n\n // Extend with sendCalls for batched transactions\n const extendedClient = Object.assign(client, {\n /**\n * Send a single transaction via intent flow\n */\n async sendTransaction(transaction: any): Promise<Hash> {\n const calls: TransactionCall[] = [\n {\n to: transaction.to!,\n data: transaction.data,\n value: transaction.value,\n },\n ];\n const closeOn = (config.waitForHash ?? true)\n ? \"completed\"\n : \"preconfirmed\";\n\n const result = await provider.sendIntent({\n username: config.username,\n targetChain: config.chain.id,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data,\n value: call.value ? call.value.toString() : \"0\",\n label: call.label,\n sublabel: call.sublabel,\n })),\n closeOn,\n waitForHash: config.waitForHash ?? true,\n hashTimeoutMs: config.hashTimeoutMs,\n hashIntervalMs: config.hashIntervalMs,\n });\n\n if (!result.success || !result.transactionHash) {\n throw new Error(result.error?.message || \"Transaction failed\");\n }\n\n return result.transactionHash as Hash;\n },\n /**\n * Send multiple calls as a single batched transaction\n */\n async sendCalls(params: SendCallsParams): Promise<Hash> {\n const { calls } = params;\n const closeOn = (config.waitForHash ?? true)\n ? \"completed\"\n : \"preconfirmed\";\n const result = await provider.sendIntent({\n username: config.username,\n targetChain: config.chain.id,\n calls: calls.map((call) => ({\n to: call.to,\n data: call.data,\n value: call.value ? call.value.toString() : \"0\",\n label: call.label,\n sublabel: call.sublabel,\n })),\n closeOn,\n waitForHash: config.waitForHash ?? true,\n hashTimeoutMs: config.hashTimeoutMs,\n hashIntervalMs: config.hashIntervalMs,\n });\n\n if (!result.success || !result.transactionHash) {\n throw new Error(result.error?.message || \"Transaction failed\");\n }\n\n return result.transactionHash as Hash;\n },\n });\n\n return extendedClient as PasskeyWalletClient;\n}\n","import * as React from \"react\";\nimport type { PasskeyProviderClient } from \"../client\";\nimport type { IntentCall, SendIntentResult } from \"../types\";\nimport { getChainName as getRegistryChainName } from \"../registry\";\n\n/**\n * A batched call in the queue\n */\nexport interface BatchedCall {\n /** Unique ID for removal */\n id: string;\n /** The actual call data */\n call: IntentCall;\n /** Chain ID for execution */\n targetChain: number;\n /** Timestamp when added */\n addedAt: number;\n}\n\nexport function getChainName(chainId: number): string {\n return getRegistryChainName(chainId);\n}\n\n/**\n * Batch queue context value\n */\nexport interface BatchQueueContextValue {\n /** Current queue of batched calls */\n queue: BatchedCall[];\n /** Chain ID of the current batch (from first call) */\n batchChainId: number | null;\n /** Add a call to the batch */\n addToBatch: (call: IntentCall, targetChain: number) => { success: boolean; error?: string };\n /** Remove a call from the batch */\n removeFromBatch: (id: string) => void;\n /** Clear all calls from the batch */\n clearBatch: () => void;\n /** Sign and execute all batched calls */\n signAll: (username: string) => Promise<SendIntentResult>;\n /** Whether the widget is expanded */\n isExpanded: boolean;\n /** Set widget expanded state */\n setExpanded: (expanded: boolean) => void;\n /** Whether signing is in progress */\n isSigning: boolean;\n /** Animation trigger for bounce effect */\n animationTrigger: number;\n}\n\nconst BatchQueueContext = React.createContext<BatchQueueContextValue | null>(null);\n\n/**\n * Hook to access the batch queue context\n */\nexport function useBatchQueue(): BatchQueueContextValue {\n const context = React.useContext(BatchQueueContext);\n if (!context) {\n throw new Error(\"useBatchQueue must be used within a BatchQueueProvider\");\n }\n return context;\n}\n\n/**\n * Generate a unique ID for a batched call\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * localStorage key for persisting the batch queue\n */\nfunction getStorageKey(username?: string): string {\n return username ? `1auth_batch_queue_${username}` : \"1auth_batch_queue_anonymous\";\n}\n\nexport interface BatchQueueProviderProps {\n /** The PasskeyProviderClient instance */\n client: PasskeyProviderClient;\n /** Optional username for localStorage persistence key */\n username?: string;\n /** Children to render */\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the batch queue\n */\nexport function BatchQueueProvider({\n client,\n username,\n children,\n}: BatchQueueProviderProps) {\n const [queue, setQueue] = React.useState<BatchedCall[]>([]);\n const [isExpanded, setExpanded] = React.useState(false);\n const [isSigning, setIsSigning] = React.useState(false);\n const [animationTrigger, setAnimationTrigger] = React.useState(0);\n\n // Derive batch chain from first call in queue\n const batchChainId = queue.length > 0 ? queue[0].targetChain : null;\n\n // Load queue from localStorage on mount\n React.useEffect(() => {\n const storageKey = getStorageKey(username);\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const parsed = JSON.parse(stored) as BatchedCall[];\n // Validate the structure\n if (Array.isArray(parsed) && parsed.every(item =>\n typeof item.id === 'string' &&\n typeof item.call === 'object' &&\n typeof item.targetChain === 'number'\n )) {\n setQueue(parsed);\n }\n }\n } catch {\n // Ignore localStorage errors\n }\n }, [username]);\n\n // Save queue to localStorage when it changes\n React.useEffect(() => {\n const storageKey = getStorageKey(username);\n try {\n if (queue.length > 0) {\n localStorage.setItem(storageKey, JSON.stringify(queue));\n } else {\n localStorage.removeItem(storageKey);\n }\n } catch {\n // Ignore localStorage errors\n }\n }, [queue, username]);\n\n const addToBatch = React.useCallback((call: IntentCall, targetChain: number): { success: boolean; error?: string } => {\n // Check if trying to add to a batch with a different chain\n if (batchChainId !== null && batchChainId !== targetChain) {\n return {\n success: false,\n error: `Batch is set to ${getChainName(batchChainId)}. Sign current batch first or clear it.`,\n };\n }\n\n const batchedCall: BatchedCall = {\n id: generateId(),\n call,\n targetChain,\n addedAt: Date.now(),\n };\n\n setQueue(prev => [...prev, batchedCall]);\n setAnimationTrigger(prev => prev + 1);\n\n return { success: true };\n }, [batchChainId]);\n\n const removeFromBatch = React.useCallback((id: string) => {\n setQueue(prev => prev.filter(item => item.id !== id));\n }, []);\n\n const clearBatch = React.useCallback(() => {\n setQueue([]);\n setExpanded(false);\n }, []);\n\n const signAll = React.useCallback(async (username: string): Promise<SendIntentResult> => {\n if (queue.length === 0) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"EMPTY_BATCH\",\n message: \"No calls in batch to sign\",\n },\n };\n }\n\n const targetChain = queue[0].targetChain;\n const calls = queue.map(item => item.call);\n\n setIsSigning(true);\n\n try {\n const result = await client.sendIntent({\n username,\n targetChain,\n calls,\n });\n\n if (result.success) {\n // Clear the batch on success\n clearBatch();\n }\n\n return result;\n } finally {\n setIsSigning(false);\n }\n }, [queue, client, clearBatch]);\n\n const value: BatchQueueContextValue = {\n queue,\n batchChainId,\n addToBatch,\n removeFromBatch,\n clearBatch,\n signAll,\n isExpanded,\n setExpanded,\n isSigning,\n animationTrigger,\n };\n\n return (\n <BatchQueueContext.Provider value={value}>\n {children}\n </BatchQueueContext.Provider>\n );\n}\n","import * as React from \"react\";\nimport { useBatchQueue, getChainName } from \"./BatchQueueContext\";\n\n// Inject animation styles into document head\nconst ANIMATION_STYLES = `\n@keyframes batch-bounce-in {\n 0% { transform: scale(0.8); opacity: 0; }\n 50% { transform: scale(1.05); }\n 100% { transform: scale(1); opacity: 1; }\n}\n@keyframes batch-item-bounce {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-2px); }\n 75% { transform: translateX(2px); }\n}\n`;\n\nfunction injectStyles() {\n if (typeof document === \"undefined\") return;\n const styleId = \"batch-queue-widget-styles\";\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = ANIMATION_STYLES;\n document.head.appendChild(style);\n}\n\n// Inline styles\nconst widgetStyles: React.CSSProperties = {\n position: \"fixed\",\n bottom: \"16px\",\n right: \"16px\",\n zIndex: 50,\n backgroundColor: \"#18181b\",\n color: \"#ffffff\",\n borderRadius: \"12px\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n minWidth: \"240px\",\n maxWidth: \"360px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n fontSize: \"14px\",\n overflow: \"hidden\",\n};\n\nconst headerStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"12px 16px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n};\n\nconst headerLeftStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst counterBadgeStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#18181b\",\n borderRadius: \"9999px\",\n padding: \"2px 8px\",\n fontSize: \"12px\",\n fontWeight: 600,\n};\n\nconst chainBadgeStyles: React.CSSProperties = {\n backgroundColor: \"rgba(255,255,255,0.15)\",\n color: \"#a1a1aa\",\n borderRadius: \"4px\",\n padding: \"2px 6px\",\n fontSize: \"11px\",\n};\n\nconst signAllButtonStyles: React.CSSProperties = {\n backgroundColor: \"#ffffff\",\n color: \"#18181b\",\n border: \"none\",\n borderRadius: \"6px\",\n padding: \"6px 12px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"background-color 0.15s\",\n};\n\nconst signAllButtonHoverStyles: React.CSSProperties = {\n backgroundColor: \"#e4e4e7\",\n};\n\nconst signAllButtonDisabledStyles: React.CSSProperties = {\n opacity: 0.5,\n cursor: \"not-allowed\",\n};\n\nconst listContainerStyles: React.CSSProperties = {\n maxHeight: \"300px\",\n overflowY: \"auto\",\n borderTop: \"1px solid #27272a\",\n};\n\nconst callItemStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n padding: \"10px 16px\",\n borderBottom: \"1px solid #27272a\",\n position: \"relative\",\n};\n\nconst callItemLastStyles: React.CSSProperties = {\n borderBottom: \"none\",\n};\n\nconst callContentStyles: React.CSSProperties = {\n flex: 1,\n minWidth: 0,\n};\n\nconst callLabelStyles: React.CSSProperties = {\n fontWeight: 500,\n marginBottom: \"2px\",\n};\n\nconst callSublabelStyles: React.CSSProperties = {\n color: \"#a1a1aa\",\n fontSize: \"12px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n};\n\nconst removeButtonStyles: React.CSSProperties = {\n position: \"absolute\",\n left: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"#dc2626\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: \"4px\",\n width: \"20px\",\n height: \"20px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n};\n\nconst removeButtonVisibleStyles: React.CSSProperties = {\n opacity: 1,\n};\n\nconst clearButtonStyles: React.CSSProperties = {\n display: \"block\",\n width: \"100%\",\n padding: \"10px 16px\",\n backgroundColor: \"transparent\",\n color: \"#a1a1aa\",\n border: \"none\",\n borderTop: \"1px solid #27272a\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n textAlign: \"center\",\n transition: \"color 0.15s\",\n};\n\nconst clearButtonHoverStyles: React.CSSProperties = {\n color: \"#ffffff\",\n};\n\n// Chevron icon\nfunction ChevronIcon({ down }: { down: boolean }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transition: \"transform 0.2s\",\n transform: down ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n }}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nexport interface BatchQueueWidgetProps {\n /** Callback when \"Sign All\" is clicked - should provide username */\n onSignAll: () => void;\n}\n\n/**\n * Floating widget showing the batch queue\n */\nexport function BatchQueueWidget({ onSignAll }: BatchQueueWidgetProps) {\n const {\n queue,\n batchChainId,\n removeFromBatch,\n clearBatch,\n isExpanded,\n setExpanded,\n isSigning,\n animationTrigger,\n } = useBatchQueue();\n\n const [hoveredItemId, setHoveredItemId] = React.useState<string | null>(null);\n const [isSignAllHovered, setIsSignAllHovered] = React.useState(false);\n const [isClearHovered, setIsClearHovered] = React.useState(false);\n const [shouldAnimate, setShouldAnimate] = React.useState(false);\n\n // Inject CSS animations on mount\n React.useEffect(() => {\n injectStyles();\n }, []);\n\n // Trigger bounce animation when item is added\n React.useEffect(() => {\n if (animationTrigger > 0) {\n setShouldAnimate(true);\n const timer = setTimeout(() => setShouldAnimate(false), 300);\n return () => clearTimeout(timer);\n }\n }, [animationTrigger]);\n\n // Don't render if queue is empty\n if (queue.length === 0) {\n return null;\n }\n\n const handleHeaderClick = () => {\n setExpanded(!isExpanded);\n };\n\n const handleSignAllClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Don't toggle expand\n if (!isSigning) {\n onSignAll();\n }\n };\n\n const animatedWidgetStyles: React.CSSProperties = {\n ...widgetStyles,\n animation: shouldAnimate ? \"batch-bounce-in 0.3s ease-out\" : undefined,\n };\n\n const currentSignAllStyles: React.CSSProperties = {\n ...signAllButtonStyles,\n ...(isSignAllHovered && !isSigning ? signAllButtonHoverStyles : {}),\n ...(isSigning ? signAllButtonDisabledStyles : {}),\n };\n\n return (\n <div style={animatedWidgetStyles}>\n {/* Header - always visible */}\n <div style={headerStyles} onClick={handleHeaderClick}>\n <div style={headerLeftStyles}>\n <ChevronIcon down={isExpanded} />\n <span style={counterBadgeStyles}>{queue.length}</span>\n <span>call{queue.length !== 1 ? \"s\" : \"\"} queued</span>\n {batchChainId && (\n <span style={chainBadgeStyles}>{getChainName(batchChainId)}</span>\n )}\n </div>\n <button\n style={currentSignAllStyles}\n onClick={handleSignAllClick}\n onMouseEnter={() => setIsSignAllHovered(true)}\n onMouseLeave={() => setIsSignAllHovered(false)}\n disabled={isSigning}\n >\n {isSigning ? \"Signing...\" : \"Sign All\"}\n </button>\n </div>\n\n {/* Expanded list of calls */}\n {isExpanded && (\n <>\n <div style={listContainerStyles}>\n {queue.map((item, index) => {\n const isHovered = hoveredItemId === item.id;\n const isLast = index === queue.length - 1;\n\n return (\n <div\n key={item.id}\n style={{\n ...callItemStyles,\n ...(isLast ? callItemLastStyles : {}),\n paddingLeft: isHovered ? \"36px\" : \"16px\",\n transition: \"padding-left 0.15s\",\n }}\n onMouseEnter={() => setHoveredItemId(item.id)}\n onMouseLeave={() => setHoveredItemId(null)}\n >\n <button\n style={{\n ...removeButtonStyles,\n ...(isHovered ? removeButtonVisibleStyles : {}),\n }}\n onClick={() => removeFromBatch(item.id)}\n title=\"Remove from batch\"\n >\n ×\n </button>\n <div style={callContentStyles}>\n <div style={callLabelStyles}>\n {item.call.label || \"Contract Call\"}\n </div>\n {item.call.sublabel && (\n <div style={callSublabelStyles}>{item.call.sublabel}</div>\n )}\n {!item.call.sublabel && item.call.to && (\n <div style={callSublabelStyles}>\n To: {item.call.to.slice(0, 6)}...{item.call.to.slice(-4)}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Clear batch button */}\n <button\n style={{\n ...clearButtonStyles,\n ...(isClearHovered ? clearButtonHoverStyles : {}),\n }}\n onClick={clearBatch}\n onMouseEnter={() => setIsClearHovered(true)}\n onMouseLeave={() => setIsClearHovered(false)}\n >\n Clear batch\n </button>\n </>\n )}\n </div>\n );\n}\n","import { keccak256, toBytes } from \"viem\";\n\n/**\n * The domain separator prefix used for passkey message signing.\n * This ensures message signatures cannot be replayed for transaction signing.\n */\nexport const PASSKEY_MESSAGE_PREFIX = \"\\x19Passkey Signed Message:\\n\";\n\n/**\n * Hash a message with the passkey domain separator.\n *\n * This is the same hashing function used by the passkey sign dialog.\n * Use this to verify that the `signedHash` returned from `signMessage()`\n * matches your original message.\n *\n * Format: keccak256(\"\\x19Passkey Signed Message:\\n\" + len + message)\n *\n * @example\n * ```typescript\n * const message = \"Sign in to MyApp\\nTimestamp: 1234567890\";\n * const result = await client.signMessage({ username: 'alice', message });\n *\n * // Verify the hash matches\n * const expectedHash = hashMessage(message);\n * if (result.signedHash === expectedHash) {\n * console.log('Hash matches - signature is for this message');\n * }\n * ```\n */\nexport function hashMessage(message: string): `0x${string}` {\n const prefixed = PASSKEY_MESSAGE_PREFIX + message.length.toString() + message;\n return keccak256(toBytes(prefixed));\n}\n\n/**\n * Verify that a signedHash matches the expected message.\n *\n * This is a convenience wrapper around `hashMessage()` that returns\n * a boolean. For full cryptographic verification of the P256 signature,\n * use on-chain verification via the WebAuthn.sol contract.\n *\n * @example\n * ```typescript\n * const result = await client.signMessage({ username: 'alice', message });\n *\n * if (result.success && verifyMessageHash(message, result.signedHash)) {\n * // The signature is for this exact message\n * // For full verification, verify the P256 signature on-chain or server-side\n * }\n * ```\n */\nexport function verifyMessageHash(\n message: string,\n signedHash: string | undefined\n): boolean {\n if (!signedHash) return false;\n const expectedHash = hashMessage(message);\n return expectedHash.toLowerCase() === signedHash.toLowerCase();\n}\n"],"mappings":"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","names":["hashTypedData","toAccount","hashTypedData","toAccount","getChainName","username","React","jsx","getChainName","hashMessage"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { P as PasskeyProviderClient } from './client-C1inywuT.mjs';
|
|
2
|
+
|
|
3
|
+
type ProviderRequest = {
|
|
4
|
+
method: string;
|
|
5
|
+
params?: unknown[] | Record<string, unknown>;
|
|
6
|
+
};
|
|
7
|
+
type Listener = (...args: unknown[]) => void;
|
|
8
|
+
type PasskeyProvider = {
|
|
9
|
+
request: (args: ProviderRequest) => Promise<unknown>;
|
|
10
|
+
on: (event: string, listener: Listener) => void;
|
|
11
|
+
removeListener: (event: string, listener: Listener) => void;
|
|
12
|
+
disconnect: () => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
type PasskeyProviderOptions = {
|
|
15
|
+
client: PasskeyProviderClient;
|
|
16
|
+
chainId: number;
|
|
17
|
+
storageKey?: string;
|
|
18
|
+
waitForHash?: boolean;
|
|
19
|
+
hashTimeoutMs?: number;
|
|
20
|
+
hashIntervalMs?: number;
|
|
21
|
+
};
|
|
22
|
+
declare function createPasskeyProvider(options: PasskeyProviderOptions): PasskeyProvider;
|
|
23
|
+
|
|
24
|
+
export { type PasskeyProvider as P, type PasskeyProviderOptions as a, createPasskeyProvider as c };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { P as PasskeyProviderClient } from './client-C1inywuT.js';
|
|
2
|
+
|
|
3
|
+
type ProviderRequest = {
|
|
4
|
+
method: string;
|
|
5
|
+
params?: unknown[] | Record<string, unknown>;
|
|
6
|
+
};
|
|
7
|
+
type Listener = (...args: unknown[]) => void;
|
|
8
|
+
type PasskeyProvider = {
|
|
9
|
+
request: (args: ProviderRequest) => Promise<unknown>;
|
|
10
|
+
on: (event: string, listener: Listener) => void;
|
|
11
|
+
removeListener: (event: string, listener: Listener) => void;
|
|
12
|
+
disconnect: () => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
type PasskeyProviderOptions = {
|
|
15
|
+
client: PasskeyProviderClient;
|
|
16
|
+
chainId: number;
|
|
17
|
+
storageKey?: string;
|
|
18
|
+
waitForHash?: boolean;
|
|
19
|
+
hashTimeoutMs?: number;
|
|
20
|
+
hashIntervalMs?: number;
|
|
21
|
+
};
|
|
22
|
+
declare function createPasskeyProvider(options: PasskeyProviderOptions): PasskeyProvider;
|
|
23
|
+
|
|
24
|
+
export { type PasskeyProvider as P, type PasskeyProviderOptions as a, createPasskeyProvider as c };
|
package/dist/react.d.mts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { P as PasskeyProviderClient, v as SendIntentOptions, S as SendIntentResult, y as CloseOnStatus, M as MerchantSignedIntent } from './client-C1inywuT.mjs';
|
|
4
|
+
|
|
5
|
+
interface PayButtonProps {
|
|
6
|
+
/** The PasskeyProviderClient instance */
|
|
7
|
+
client: PasskeyProviderClient;
|
|
8
|
+
/** Intent parameters (calls, targetChain, etc.) - username will be filled automatically */
|
|
9
|
+
intent: Omit<SendIntentOptions, "username" | "closeOn" | "signedIntent">;
|
|
10
|
+
/** Called when payment succeeds */
|
|
11
|
+
onSuccess?: (result: SendIntentResult) => void;
|
|
12
|
+
/** Called when payment fails */
|
|
13
|
+
onError?: (error: Error) => void;
|
|
14
|
+
/** When to close the dialog and return success. Defaults to "preconfirmed" */
|
|
15
|
+
closeOn?: CloseOnStatus;
|
|
16
|
+
/**
|
|
17
|
+
* Optional callback to get a signed intent from your backend.
|
|
18
|
+
* Provides XSS protection by ensuring calls are constructed server-side.
|
|
19
|
+
* If provided, this will be called with the intent and username before sending.
|
|
20
|
+
* The returned signed intent will be used instead of the raw intent.
|
|
21
|
+
*/
|
|
22
|
+
getSignedIntent?: (params: {
|
|
23
|
+
username: string;
|
|
24
|
+
targetChain: number;
|
|
25
|
+
calls: SendIntentOptions["calls"];
|
|
26
|
+
tokenRequests?: SendIntentOptions["tokenRequests"];
|
|
27
|
+
}) => Promise<MerchantSignedIntent>;
|
|
28
|
+
/** Button text - defaults to "Pay with 1auth" */
|
|
29
|
+
children?: React.ReactNode;
|
|
30
|
+
/** Custom class name */
|
|
31
|
+
className?: string;
|
|
32
|
+
/** Custom inline styles (merged with defaults) */
|
|
33
|
+
style?: React.CSSProperties;
|
|
34
|
+
/** Disabled state */
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
/** Hide the fingerprint icon */
|
|
37
|
+
hideIcon?: boolean;
|
|
38
|
+
}
|
|
39
|
+
declare function PayButton({ client, intent, onSuccess, onError, closeOn, getSignedIntent, children, className, style, disabled, hideIcon, }: PayButtonProps): react_jsx_runtime.JSX.Element;
|
|
40
|
+
|
|
41
|
+
export { CloseOnStatus, PayButton, type PayButtonProps, SendIntentOptions, SendIntentResult };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { P as PasskeyProviderClient, v as SendIntentOptions, S as SendIntentResult, y as CloseOnStatus, M as MerchantSignedIntent } from './client-C1inywuT.js';
|
|
4
|
+
|
|
5
|
+
interface PayButtonProps {
|
|
6
|
+
/** The PasskeyProviderClient instance */
|
|
7
|
+
client: PasskeyProviderClient;
|
|
8
|
+
/** Intent parameters (calls, targetChain, etc.) - username will be filled automatically */
|
|
9
|
+
intent: Omit<SendIntentOptions, "username" | "closeOn" | "signedIntent">;
|
|
10
|
+
/** Called when payment succeeds */
|
|
11
|
+
onSuccess?: (result: SendIntentResult) => void;
|
|
12
|
+
/** Called when payment fails */
|
|
13
|
+
onError?: (error: Error) => void;
|
|
14
|
+
/** When to close the dialog and return success. Defaults to "preconfirmed" */
|
|
15
|
+
closeOn?: CloseOnStatus;
|
|
16
|
+
/**
|
|
17
|
+
* Optional callback to get a signed intent from your backend.
|
|
18
|
+
* Provides XSS protection by ensuring calls are constructed server-side.
|
|
19
|
+
* If provided, this will be called with the intent and username before sending.
|
|
20
|
+
* The returned signed intent will be used instead of the raw intent.
|
|
21
|
+
*/
|
|
22
|
+
getSignedIntent?: (params: {
|
|
23
|
+
username: string;
|
|
24
|
+
targetChain: number;
|
|
25
|
+
calls: SendIntentOptions["calls"];
|
|
26
|
+
tokenRequests?: SendIntentOptions["tokenRequests"];
|
|
27
|
+
}) => Promise<MerchantSignedIntent>;
|
|
28
|
+
/** Button text - defaults to "Pay with 1auth" */
|
|
29
|
+
children?: React.ReactNode;
|
|
30
|
+
/** Custom class name */
|
|
31
|
+
className?: string;
|
|
32
|
+
/** Custom inline styles (merged with defaults) */
|
|
33
|
+
style?: React.CSSProperties;
|
|
34
|
+
/** Disabled state */
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
/** Hide the fingerprint icon */
|
|
37
|
+
hideIcon?: boolean;
|
|
38
|
+
}
|
|
39
|
+
declare function PayButton({ client, intent, onSuccess, onError, closeOn, getSignedIntent, children, className, style, disabled, hideIcon, }: PayButtonProps): react_jsx_runtime.JSX.Element;
|
|
40
|
+
|
|
41
|
+
export { CloseOnStatus, PayButton, type PayButtonProps, SendIntentOptions, SendIntentResult };
|