@rhinestone/1auth 0.1.0 → 0.1.2
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/README.md +130 -0
- package/dist/{chunk-UXYKIMGZ.mjs → chunk-TACK3LJN.mjs} +180 -21
- package/dist/chunk-TACK3LJN.mjs.map +1 -0
- package/dist/{client-C1inywuT.d.mts → client-DyYGKWj3.d.mts} +321 -33
- package/dist/{client-C1inywuT.d.ts → client-DyYGKWj3.d.ts} +321 -33
- package/dist/index.d.mts +29 -16
- package/dist/index.d.ts +29 -16
- package/dist/index.js +1041 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +861 -229
- package/dist/index.mjs.map +1 -1
- package/dist/provider-CNTZPPFz.d.ts +33 -0
- package/dist/provider-Ctr7HQHR.d.mts +33 -0
- package/dist/react.d.mts +4 -4
- package/dist/react.d.ts +4 -4
- package/dist/react.js.map +1 -1
- package/dist/react.mjs.map +1 -1
- package/dist/server.d.mts +10 -44
- package/dist/server.d.ts +10 -44
- package/dist/server.js +11 -8
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +11 -8
- package/dist/server.mjs.map +1 -1
- package/dist/wagmi.d.mts +5 -4
- package/dist/wagmi.d.ts +5 -4
- package/dist/wagmi.js +173 -23
- package/dist/wagmi.js.map +1 -1
- package/dist/wagmi.mjs +3 -2
- package/dist/wagmi.mjs.map +1 -1
- package/package.json +24 -11
- package/dist/chunk-UXYKIMGZ.mjs.map +0 -1
- package/dist/provider-Dgh51NRc.d.mts +0 -24
- package/dist/provider-q7M728Mn.d.ts +0 -24
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/registry.ts","../src/provider.ts","../src/walletClient/utils.ts","../src/account.ts","../src/walletClient/index.ts","../src/batch/BatchQueueContext.tsx","../src/batch/BatchQueueWidget.tsx","../src/verify.ts"],"sourcesContent":["export { PasskeyProviderClient } from \"./client\";\nexport { createPasskeyProvider } from \"./provider\";\nexport type { PasskeyProvider, PasskeyProviderOptions } from \"./provider\";\nexport { createPasskeyAccount } from \"./account\";\nexport type { PasskeyAccount } from \"./account\";\nexport type {\n PasskeyProviderConfig,\n SigningRequestOptions,\n SigningResult,\n SigningSuccess,\n SigningError,\n SigningErrorCode,\n WebAuthnSignature,\n CreateSigningRequestResponse,\n SigningRequestStatus,\n EmbedOptions,\n PasskeyCredential,\n UserPasskeysResponse,\n RegisterOptions,\n RegisterResult,\n LoginOptions,\n LoginResult,\n // Authentication with challenge signing types\n AuthenticateOptions,\n AuthenticateResult,\n // Message signing types\n SignMessageOptions,\n SignMessageResult,\n // EIP-712 typed data signing types\n SignTypedDataOptions,\n SignTypedDataResult,\n EIP712Domain,\n EIP712Types,\n EIP712TypeField,\n // Transaction review types\n TransactionAction,\n TransactionFees,\n BalanceRequirement,\n TransactionDetails,\n // Intent types for Rhinestone orchestrator\n IntentCall,\n IntentTokenRequest,\n MerchantSignedIntent,\n SendIntentOptions,\n IntentQuote,\n IntentStatus,\n OrchestratorStatus,\n CloseOnStatus,\n SendIntentResult,\n PrepareIntentResponse,\n ExecuteIntentResponse,\n // Swap types\n SendSwapOptions,\n SendSwapResult,\n SwapQuote,\n // Theme configuration\n ThemeConfig,\n} from \"./types\";\n\n// Viem WalletClient integration\nexport {\n createPasskeyWalletClient,\n encodeWebAuthnSignature,\n hashCalls,\n} from \"./walletClient\";\nexport type {\n PasskeyWalletClient,\n PasskeyWalletClientConfig,\n TransactionCall,\n SendCallsParams,\n} from \"./walletClient\";\n\n// Batch queue components\nexport {\n BatchQueueProvider,\n useBatchQueue,\n BatchQueueWidget,\n getChainName,\n} from \"./batch\";\nexport type {\n BatchedCall,\n BatchQueueContextValue,\n BatchQueueProviderProps,\n BatchQueueWidgetProps,\n} from \"./batch\";\n\n// Registry helpers for supported chains/tokens (Rhinestone)\nexport {\n getSupportedChainIds,\n getSupportedChains,\n getAllSupportedChainsAndTokens,\n getSupportedTokens,\n getSupportedTokenSymbols,\n getChainById,\n getChainExplorerUrl,\n getChainRpcUrl,\n resolveTokenAddress,\n isTestnet,\n getTokenAddress,\n getTokenSymbol,\n getTokenDecimals,\n isTokenAddressSupported,\n} from \"./registry\";\nexport type { TokenConfig, ChainFilterOptions } from \"./registry\";\n\n// Message signing verification utilities\nexport {\n hashMessage,\n verifyMessageHash,\n PASSKEY_MESSAGE_PREFIX,\n} from \"./verify\";\n","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 type { Address, Chain } from \"viem\";\nimport { isAddress } from \"viem\";\nimport * as viemChains from \"viem/chains\";\nimport {\n getAllSupportedChainsAndTokens as getAllSupportedChainsAndTokensRaw,\n getSupportedTokens as getSupportedTokensRaw,\n getTokenAddress,\n getTokenDecimals,\n} from \"@rhinestone/sdk\";\n\nexport type TokenConfig = {\n symbol: string;\n address: Address;\n decimals: number;\n supportsMultichain?: boolean;\n [key: string]: unknown;\n};\n\nexport type ChainFilterOptions = {\n includeTestnets?: boolean;\n chainIds?: number[];\n};\n\nconst env: Record<string, string | undefined> =\n typeof process !== \"undefined\" ? process.env : {};\n\nconst ALL_VIEM_CHAINS = (Object.values(viemChains) as unknown[]).filter(\n (value): value is Chain =>\n typeof value === \"object\" && value !== null && \"id\" in value && \"name\" in value\n);\nconst VIEM_CHAIN_BY_ID = new Map<number, Chain>(\n ALL_VIEM_CHAINS.map((chain) => [chain.id, chain])\n);\nconst SUPPORTED_CHAIN_IDS = new Set(\n getAllSupportedChainsAndTokensRaw().map((entry) => entry.chainId)\n);\n\nfunction parseBool(value?: string): boolean | undefined {\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n return undefined;\n}\n\nfunction resolveIncludeTestnets(explicit?: boolean): boolean {\n if (explicit !== undefined) return explicit;\n const envValue =\n parseBool(env.NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS) ??\n parseBool(env.ORCHESTRATOR_USE_TESTNETS);\n return envValue ?? false;\n}\n\nfunction applyChainFilters(chainIds: number[], options?: ChainFilterOptions): number[] {\n const includeTestnets = resolveIncludeTestnets(options?.includeTestnets);\n const allowlist = options?.chainIds;\n let filtered = chainIds;\n\n if (!includeTestnets) {\n filtered = filtered.filter((chainId) => !isTestnet(chainId));\n }\n\n if (allowlist && allowlist.length > 0) {\n const allowed = new Set(allowlist);\n filtered = filtered.filter((chainId) => allowed.has(chainId));\n }\n\n return filtered;\n}\n\nexport function getSupportedChainIds(options?: ChainFilterOptions): number[] {\n return applyChainFilters(Array.from(SUPPORTED_CHAIN_IDS), options);\n}\n\nexport function getSupportedChains(options?: ChainFilterOptions): Chain[] {\n return getSupportedChainIds(options)\n .map((chainId) => VIEM_CHAIN_BY_ID.get(chainId))\n .filter((chain): chain is Chain => Boolean(chain));\n}\n\nexport function getAllSupportedChainsAndTokens(options?: ChainFilterOptions): Array<{\n chainId: number;\n tokens: TokenConfig[];\n}> {\n const allowed = new Set(getSupportedChainIds(options));\n return getAllSupportedChainsAndTokensRaw()\n .filter((entry) => allowed.has(entry.chainId))\n .map((entry) => ({\n chainId: entry.chainId,\n tokens: entry.tokens as TokenConfig[],\n }));\n}\n\nexport function getChainById(chainId: number): Chain {\n if (!SUPPORTED_CHAIN_IDS.has(chainId)) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n const chain = VIEM_CHAIN_BY_ID.get(chainId);\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n return chain;\n}\n\nexport function getChainName(chainId: number): string {\n try {\n return getChainById(chainId).name;\n } catch {\n return `Chain ${chainId}`;\n }\n}\n\nexport function getChainExplorerUrl(chainId: number): string | undefined {\n try {\n return getChainById(chainId).blockExplorers?.default?.url;\n } catch {\n return undefined;\n }\n}\n\nexport function getChainRpcUrl(chainId: number): string | undefined {\n try {\n const chain = getChainById(chainId);\n return chain.rpcUrls?.default?.http?.[0] || chain.rpcUrls?.public?.http?.[0];\n } catch {\n return undefined;\n }\n}\n\nexport function getSupportedTokens(chainId: number): TokenConfig[] {\n return getSupportedTokensRaw(chainId) as TokenConfig[];\n}\n\nexport function getSupportedTokenSymbols(chainId: number): string[] {\n return getSupportedTokens(chainId).map((token) => token.symbol);\n}\n\nexport function resolveTokenAddress(token: string, chainId: number): Address {\n if (isAddress(token)) {\n return token;\n }\n return getTokenAddress(token.toUpperCase() as never, chainId);\n}\n\nexport function isTestnet(chainId: number): boolean {\n try {\n return getChainById(chainId).testnet ?? false;\n } catch {\n return false;\n }\n}\n\nexport function getTokenSymbol(tokenAddress: Address, chainId: number): string {\n const token = getSupportedTokens(chainId).find(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (!token) {\n throw new Error(`Unsupported token: ${tokenAddress} on chain ${chainId}`);\n }\n return token.symbol;\n}\n\nexport function isTokenAddressSupported(tokenAddress: Address, chainId: number): boolean {\n try {\n return getSupportedTokens(chainId).some(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n } catch {\n return false;\n }\n}\n\nexport { getTokenAddress, getTokenDecimals };\n","import {\n hexToString,\n isHex,\n numberToHex,\n type Address,\n type Hex,\n} from \"viem\";\nimport { PasskeyProviderClient } from \"./client\";\nimport { getSupportedChainIds, getSupportedTokens } from \"./registry\";\nimport type { IntentCall, SendIntentOptions } from \"./types\";\nimport { encodeWebAuthnSignature } from \"./walletClient/utils\";\n\ntype ProviderRequest = {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n};\n\ntype Listener = (...args: unknown[]) => void;\n\ntype StoredUser = {\n username: string;\n address: Address;\n};\n\nexport type PasskeyProvider = {\n request: (args: ProviderRequest) => Promise<unknown>;\n on: (event: string, listener: Listener) => void;\n removeListener: (event: string, listener: Listener) => void;\n disconnect: () => Promise<void>;\n};\n\nexport type PasskeyProviderOptions = {\n client: PasskeyProviderClient;\n chainId: number;\n storageKey?: string;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n};\n\nconst DEFAULT_STORAGE_KEY = \"1auth-user\";\n\nexport function createPasskeyProvider(\n options: PasskeyProviderOptions\n): PasskeyProvider {\n const { client } = options;\n let chainId = options.chainId;\n const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;\n\n const listeners = new Map<string, Set<Listener>>();\n\n const emit = (event: string, ...args: unknown[]) => {\n const set = listeners.get(event);\n if (!set) return;\n for (const listener of set) listener(...args);\n };\n\n const getStoredUser = (): StoredUser | null => {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as StoredUser;\n if (!parsed?.username || !parsed?.address) return null;\n return parsed;\n } catch {\n return null;\n }\n };\n\n const setStoredUser = (user: StoredUser) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(storageKey, JSON.stringify(user));\n };\n\n const clearStoredUser = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(storageKey);\n };\n\n const resolveAccountAddress = async (username: string): Promise<Address> => {\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(username)}/account`,\n {\n headers: {\n \"x-client-id\": client.getClientId(),\n },\n }\n );\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to resolve account address\");\n }\n\n const data = await response.json();\n return data.address as Address;\n };\n\n const connect = async (): Promise<Address[]> => {\n const stored = getStoredUser();\n if (stored) {\n return [stored.address];\n }\n\n const result = await client.authWithModal();\n if (!result.success || !result.username) {\n throw new Error(result.error?.message || \"Authentication failed\");\n }\n\n const address = await resolveAccountAddress(result.username);\n setStoredUser({ username: result.username, address });\n emit(\"accountsChanged\", [address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n return [address];\n };\n\n const disconnect = async () => {\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n };\n\n const ensureUser = async (): Promise<StoredUser> => {\n const stored = getStoredUser();\n if (stored) return stored;\n const [address] = await connect();\n const username = getStoredUser()?.username;\n if (!username || !address) {\n throw new Error(\"Failed to resolve user session\");\n }\n return { username, address };\n };\n\n const parseChainId = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) return Number.parseInt(value, 16);\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n };\n\n const normalizeValue = (value: unknown): string | undefined => {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\") return Math.trunc(value).toString();\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) {\n try {\n return BigInt(value).toString();\n } catch {\n return \"0\";\n }\n }\n return value;\n }\n return undefined;\n };\n\n const normalizeCalls = (calls: unknown[]): IntentCall[] => {\n return calls.map((call) => {\n const c = call as Record<string, unknown>;\n return {\n to: c.to as Address,\n data: (c.data as Hex | undefined) || \"0x\",\n value: normalizeValue(c.value) || \"0\",\n label: c.label as string | undefined,\n sublabel: c.sublabel as string | undefined,\n };\n });\n };\n\n const decodeMessage = (value: string) => {\n if (!isHex(value)) return value;\n try {\n return hexToString(value as Hex);\n } catch {\n return value;\n }\n };\n\n const signMessage = async (message: string) => {\n const { username } = await ensureUser();\n const result = await client.signMessage({\n username,\n 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\n const signTypedData = async (typedData: unknown) => {\n const { username } = await ensureUser();\n const data =\n typeof typedData === \"string\" ? JSON.parse(typedData) : typedData;\n const result = await client.signTypedData({\n username,\n domain: (data as any).domain,\n types: (data as any).types,\n primaryType: (data as any).primaryType,\n message: (data as any).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\n const sendIntent = async (\n payload: Pick<SendIntentOptions, \"calls\" | \"targetChain\" | \"username\">\n ) => {\n const closeOn = (options.waitForHash ?? true)\n ? \"completed\"\n : \"preconfirmed\";\n const result = await client.sendIntent({\n ...payload,\n closeOn,\n waitForHash: options.waitForHash ?? true,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n\n if (!result.success || !result.transactionHash) {\n throw new Error(result.error?.message || \"Transaction failed\");\n }\n\n return result.transactionHash;\n };\n\n const request = async ({ method, params }: ProviderRequest) => {\n switch (method) {\n case \"eth_chainId\":\n return numberToHex(chainId);\n case \"eth_accounts\": {\n const stored = getStoredUser();\n return stored ? [stored.address] : [];\n }\n case \"eth_requestAccounts\":\n return connect();\n case \"wallet_connect\":\n return connect();\n case \"wallet_disconnect\":\n await disconnect();\n return true;\n case \"wallet_switchEthereumChain\": {\n const [param] = (params as any[]) || [];\n const next = parseChainId(param?.chainId ?? param);\n if (!next) {\n throw new Error(\"Invalid chainId\");\n }\n chainId = next;\n emit(\"chainChanged\", numberToHex(chainId));\n return null;\n }\n case \"personal_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const first = paramList[0];\n const second = paramList[1];\n const message =\n typeof first === \"string\" && first.startsWith(\"0x\") && second\n ? typeof second === \"string\" && !second.startsWith(\"0x\")\n ? second\n : decodeMessage(first)\n : typeof first === \"string\"\n ? decodeMessage(first)\n : typeof second === \"string\"\n ? decodeMessage(second)\n : \"\";\n if (!message) throw new Error(\"Invalid personal_sign payload\");\n return signMessage(message);\n }\n case \"eth_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const message = typeof paramList[1] === \"string\" ? paramList[1] : \"\";\n if (!message) throw new Error(\"Invalid eth_sign payload\");\n return signMessage(decodeMessage(message));\n }\n case \"eth_signTypedData\":\n case \"eth_signTypedData_v4\": {\n const paramList = Array.isArray(params) ? params : [];\n const typedData = paramList[1] ?? paramList[0];\n return signTypedData(typedData);\n }\n case \"eth_sendTransaction\": {\n const paramList = Array.isArray(params) ? params : [];\n const tx = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(tx.chainId) ?? chainId;\n const calls = normalizeCalls([tx]);\n return sendIntent({\n username: user.username,\n targetChain,\n calls,\n });\n }\n case \"wallet_sendCalls\": {\n const paramList = Array.isArray(params) ? params : [];\n const payload = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(payload.chainId) ?? chainId;\n const calls = normalizeCalls((payload.calls as unknown[]) || []);\n if (!calls.length) throw new Error(\"No calls provided\");\n return sendIntent({\n username: user.username,\n targetChain,\n calls,\n });\n }\n case \"wallet_getCapabilities\": {\n const chainIds = getSupportedChainIds();\n const tokensByChain = Object.fromEntries(\n chainIds.map((id) => [id, getSupportedTokens(id)])\n );\n return {\n chains: chainIds,\n tokens: tokensByChain,\n };\n }\n default:\n throw new Error(`Unsupported method: ${method}`);\n }\n };\n\n return {\n request,\n on(event, listener) {\n const set = listeners.get(event) ?? new Set();\n set.add(listener);\n listeners.set(event, set);\n },\n removeListener(event, listener) {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) listeners.delete(event);\n },\n disconnect,\n };\n}\n","import { encodeAbiParameters, keccak256 } from 'viem';\nimport type { Hex } from 'viem';\nimport type { WebAuthnSignature } from '../types';\nimport type { TransactionCall } from './types';\n\n/**\n * P-256 curve order (n)\n * Used for signature malleability normalization\n */\nconst P256_N = BigInt(\n '0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551'\n);\nconst P256_N_DIV_2 = P256_N / 2n;\n\n/**\n * WebAuthnAuth struct type for ABI encoding\n */\nconst WEBAUTHN_AUTH_TYPE = {\n type: 'tuple',\n components: [\n { type: 'bytes', name: 'authenticatorData' },\n { type: 'string', name: 'clientDataJSON' },\n { type: 'uint256', name: 'challengeIndex' },\n { type: 'uint256', name: 'typeIndex' },\n { type: 'uint256', name: 'r' },\n { type: 'uint256', name: 's' },\n ],\n} as const;\n\n/**\n * Encode a WebAuthn signature for ERC-1271 verification on-chain\n *\n * @param sig - The WebAuthn signature from the passkey\n * @returns ABI-encoded signature bytes\n */\nexport function encodeWebAuthnSignature(sig: WebAuthnSignature): Hex {\n // Normalize s to prevent signature malleability\n let s = BigInt(sig.s);\n if (s > P256_N_DIV_2) {\n s = P256_N - s;\n }\n\n return encodeAbiParameters([WEBAUTHN_AUTH_TYPE], [\n {\n authenticatorData: sig.authenticatorData as Hex,\n clientDataJSON: sig.clientDataJSON,\n challengeIndex: BigInt(sig.challengeIndex),\n typeIndex: BigInt(sig.typeIndex),\n r: BigInt(sig.r),\n s,\n },\n ]);\n}\n\n/**\n * Hash an array of transaction calls for signing\n *\n * @param calls - Array of transaction calls\n * @returns keccak256 hash of the encoded calls\n */\nexport function hashCalls(calls: TransactionCall[]): Hex {\n const encoded = encodeAbiParameters(\n [\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'to' },\n { type: 'bytes', name: 'data' },\n { type: 'uint256', name: 'value' },\n ],\n },\n ],\n [\n calls.map((c) => ({\n to: c.to,\n data: c.data || '0x',\n value: c.value || 0n,\n })),\n ]\n );\n return keccak256(encoded);\n}\n\n/**\n * Build transaction review display data from calls\n *\n * @param calls - Array of transaction calls\n * @returns TransactionDetails for the signing modal\n */\nexport function buildTransactionReview(calls: TransactionCall[]) {\n return {\n actions: calls.map((call, i) => ({\n type: 'custom' as const,\n label: call.label || `Contract Call ${i + 1}`,\n sublabel: call.sublabel || `To: ${call.to.slice(0, 10)}...${call.to.slice(-8)}`,\n amount: call.value ? `${call.value} wei` : undefined,\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":["getChainName","hashMessage","import_viem","getAllSupportedChainsAndTokensRaw","getSupportedTokensRaw","import_viem","import_viem","data","import_viem","import_viem","import_accounts","getChainName","username","React","import_jsx_runtime","getChainName","import_viem","hashMessage"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/registry.ts","../src/provider.ts","../src/walletClient/utils.ts","../src/account.ts","../src/walletClient/index.ts","../src/batch/BatchQueueContext.tsx","../src/batch/BatchQueueWidget.tsx","../src/verify.ts"],"sourcesContent":["export { OneAuthClient, PasskeyProviderClient } from \"./client\";\nexport { createOneAuthProvider, createPasskeyProvider } from \"./provider\";\nexport type {\n OneAuthProvider,\n OneAuthProviderOptions,\n PasskeyProvider,\n PasskeyProviderOptions,\n} from \"./provider\";\nexport { createPasskeyAccount } from \"./account\";\nexport type { PasskeyAccount } from \"./account\";\nexport type {\n PasskeyProviderConfig,\n SigningRequestOptions,\n SigningResult,\n SigningSuccess,\n SigningError,\n SigningErrorCode,\n WebAuthnSignature,\n CreateSigningRequestResponse,\n SigningRequestStatus,\n EmbedOptions,\n PasskeyCredential,\n UserPasskeysResponse,\n RegisterOptions,\n RegisterResult,\n LoginOptions,\n LoginResult,\n // Connect modal types\n ConnectResult,\n // Authentication with challenge signing types\n AuthenticateOptions,\n AuthenticateResult,\n // Message signing types\n SignMessageOptions,\n SignMessageResult,\n // EIP-712 typed data signing types\n SignTypedDataOptions,\n SignTypedDataResult,\n EIP712Domain,\n EIP712Types,\n EIP712TypeField,\n // Transaction review types\n TransactionAction,\n TransactionFees,\n BalanceRequirement,\n TransactionDetails,\n // Intent types for Rhinestone orchestrator\n IntentCall,\n IntentTokenRequest,\n DeveloperSignedIntent,\n MerchantSignedIntent, // Deprecated alias\n IntentSigner,\n SendIntentOptions,\n IntentQuote,\n IntentStatus,\n OrchestratorStatus,\n CloseOnStatus,\n SendIntentResult,\n PrepareIntentResponse,\n ExecuteIntentResponse,\n // Intent history types\n IntentHistoryOptions,\n IntentHistoryItem,\n IntentHistoryResult,\n // Swap types\n SendSwapOptions,\n SendSwapResult,\n SwapQuote,\n // Theme configuration\n ThemeConfig,\n // Batch intent types\n BatchIntentItem,\n SendBatchIntentOptions,\n SendBatchIntentResult,\n BatchIntentItemResult,\n PreparedBatchIntent,\n PrepareBatchIntentResponse,\n} from \"./types\";\n\n// Viem WalletClient integration\nexport {\n createPasskeyWalletClient,\n encodeWebAuthnSignature,\n hashCalls,\n} from \"./walletClient\";\nexport type {\n PasskeyWalletClient,\n PasskeyWalletClientConfig,\n TransactionCall,\n SendCallsParams,\n} from \"./walletClient\";\n\n// Batch queue components\nexport {\n BatchQueueProvider,\n useBatchQueue,\n BatchQueueWidget,\n getChainName,\n} from \"./batch\";\nexport type {\n BatchedCall,\n BatchQueueContextValue,\n BatchQueueProviderProps,\n BatchQueueWidgetProps,\n} from \"./batch\";\n\n// Registry helpers for supported chains/tokens (Rhinestone)\nexport {\n getSupportedChainIds,\n getSupportedChains,\n getAllSupportedChainsAndTokens,\n getSupportedTokens,\n getSupportedTokenSymbols,\n getChainById,\n getChainExplorerUrl,\n getChainRpcUrl,\n resolveTokenAddress,\n isTestnet,\n getTokenAddress,\n getTokenSymbol,\n getTokenDecimals,\n isTokenAddressSupported,\n} from \"./registry\";\nexport type { TokenConfig, ChainFilterOptions } from \"./registry\";\n\n// Message signing verification utilities\nexport {\n hashMessage,\n verifyMessageHash,\n ETHEREUM_MESSAGE_PREFIX,\n PASSKEY_MESSAGE_PREFIX, // Deprecated alias\n} from \"./verify\";\n","import { parseUnits, hashTypedData, 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 ConnectResult,\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 IntentHistoryOptions,\n IntentHistoryResult,\n IntentTokenRequest,\n SendBatchIntentOptions,\n SendBatchIntentResult,\n PrepareBatchIntentResponse,\n BatchIntentItemResult,\n} from \"./types\";\nimport {\n getChainById,\n getSupportedTokens,\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 DEFAULT_PROVIDER_URL = \"https://passkey.1auth.box\";\n\ntype NormalizedPasskeyProviderConfig = PasskeyProviderConfig & {\n providerUrl: string;\n dialogUrl: string;\n};\n\nexport class OneAuthClient {\n private config: NormalizedPasskeyProviderConfig;\n private theme: ThemeConfig;\n\n constructor(config: PasskeyProviderConfig) {\n const providerUrl = config.providerUrl || DEFAULT_PROVIDER_URL;\n const dialogUrl = config.dialogUrl || providerUrl;\n this.config = { ...config, providerUrl, dialogUrl };\n this.theme = this.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 | undefined {\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: this.config.clientId\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 * Open the auth dialog (sign in + sign up).\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 mode: 'iframe',\n });\n if (this.config.clientId) {\n params.set('clientId', this.config.clientId);\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 * Open the connect dialog (lightweight connection without passkey auth).\n *\n * This method shows a simple connection confirmation dialog that doesn't\n * require a passkey signature. Users can optionally enable \"auto-connect\"\n * to skip this dialog in the future.\n *\n * If the user has never connected before, this will return action: \"switch\"\n * to indicate that the full auth modal should be opened instead.\n *\n * @example\n * ```typescript\n * const result = await client.connectWithModal();\n *\n * if (result.success) {\n * console.log('Connected as:', result.username);\n * } else if (result.action === 'switch') {\n * // User needs to sign in first\n * const authResult = await client.authWithModal();\n * }\n * ```\n */\n async connectWithModal(options?: {\n theme?: ThemeConfig;\n }): Promise<ConnectResult> {\n const dialogUrl = this.getDialogUrl();\n const params = new URLSearchParams({\n mode: 'iframe',\n });\n if (this.config.clientId) {\n params.set('clientId', this.config.clientId);\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/connect?${params.toString()}`;\n\n const { dialog, iframe, cleanup } = this.createModalDialog(url);\n\n const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {\n mode: \"iframe\",\n });\n if (!ready) {\n return {\n success: false,\n action: \"cancel\",\n error: { code: \"USER_CANCELLED\", message: \"Connection was cancelled\" },\n };\n }\n\n return this.waitForConnectResponse(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 mode: 'iframe',\n });\n if (this.config.clientId) {\n params.set('clientId', this.config.clientId);\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 (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 const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {\n mode: \"iframe\",\n challenge: options.challenge,\n username: options.username,\n description: options.description,\n transaction: options.transaction,\n metadata: options.metadata,\n });\n if (!ready) {\n return {\n success: false,\n error: {\n code: \"USER_REJECTED\" as SigningErrorCode,\n message: \"User closed the dialog\",\n },\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 ? {\n ...options.signedIntent,\n merchantId:\n options.signedIntent.merchantId || options.signedIntent.developerId,\n }\n : undefined;\n const username = signedIntent?.username || options.username;\n const targetChain = signedIntent?.targetChain || options.targetChain;\n const calls = signedIntent?.calls || options.calls;\n\n if (signedIntent && !signedIntent.merchantId) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\",\n error: {\n code: \"INVALID_OPTIONS\",\n message: \"Signed intent requires developerId (clientId)\",\n },\n };\n }\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 // Convert bigint amounts to strings for API serialization\n const serializedTokenRequests = options.tokenRequests?.map((r) => ({\n token: r.token,\n amount: r.amount.toString(),\n }));\n let prepareResponse: PrepareIntentResponse;\n // Define requestBody outside try block so it's accessible for quote refresh\n const requestBody = signedIntent || {\n username: options.username,\n targetChain: options.targetChain,\n calls: options.calls,\n tokenRequests: serializedTokenRequests,\n sourceAssets: options.sourceAssets,\n sourceChainId: options.sourceChainId,\n ...(this.config.clientId && { clientId: this.config.clientId }),\n };\n\n try {\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 themeParams = this.getThemeParams();\n const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ''}`;\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 const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {\n mode: \"iframe\",\n calls,\n chainId: targetChain,\n transaction: prepareResponse.transaction,\n challenge: prepareResponse.challenge,\n username,\n accountAddress: prepareResponse.accountAddress,\n originMessages: prepareResponse.originMessages,\n tokenRequests: serializedTokenRequests,\n expiresAt: prepareResponse.expiresAt,\n userId: prepareResponse.userId,\n intentOp: prepareResponse.intentOp,\n });\n if (!ready) {\n return {\n success: false,\n intentId: \"\",\n status: \"failed\" as const,\n error: { code: \"USER_CANCELLED\", message: \"User closed the dialog\" },\n };\n }\n\n // 4. Wait for signing result with auto-refresh support\n // This custom handler handles both signing results AND quote refresh requests\n const signingResult = await this.waitForSigningWithRefresh(\n dialog,\n iframe,\n cleanup,\n dialogOrigin,\n // Refresh callback - called when dialog requests a quote refresh\n async () => {\n console.log(\"[SDK] Dialog requested quote refresh, re-preparing intent\");\n try {\n const refreshResponse = await fetch(`${this.config.providerUrl}/api/intent/prepare`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(requestBody),\n credentials: \"include\",\n });\n\n if (!refreshResponse.ok) {\n console.error(\"[SDK] Quote refresh failed:\", await refreshResponse.text());\n return null;\n }\n\n const refreshedData = await refreshResponse.json();\n // Update prepareResponse with refreshed data for execute step\n prepareResponse = refreshedData;\n return {\n intentOp: refreshedData.intentOp,\n expiresAt: refreshedData.expiresAt,\n challenge: refreshedData.challenge,\n originMessages: refreshedData.originMessages,\n transaction: refreshedData.transaction,\n };\n } catch (error) {\n console.error(\"[SDK] Quote refresh error:\", error);\n return null;\n }\n }\n );\n\n if (!signingResult.success) {\n // cleanup already called if user rejected via X button\n return {\n success: false,\n intentId: \"\", // No intentId yet - signing was cancelled before execute\n status: \"failed\",\n error: signingResult.error,\n };\n }\n\n // Check if dialog already executed the intent (new secure flow)\n // In this case, signingResult contains intentId instead of signature\n const dialogExecutedIntent = \"intentId\" in signingResult && signingResult.intentId;\n\n // 5. Execute intent with signature (skip if dialog already executed)\n let executeResponse: ExecuteIntentResponse;\n\n if (dialogExecutedIntent) {\n // Dialog already executed - use the returned intentId\n executeResponse = {\n success: true,\n intentId: signingResult.intentId as string,\n status: \"pending\",\n };\n } else {\n // Legacy flow - execute with signature from dialog\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 // Data from prepare response (no intentId yet - created on execute)\n intentOp: prepareResponse.intentOp,\n userId: prepareResponse.userId,\n targetChain: prepareResponse.targetChain,\n calls: prepareResponse.calls,\n expiresAt: prepareResponse.expiresAt,\n // Signature from dialog\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: \"\", // No intentId - execute failed before creation\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: \"\", // No intentId - network error before creation\n status: \"failed\",\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Network error\",\n },\n };\n }\n }\n\n // 6. Poll for completion with status updates to dialog\n let finalStatus = executeResponse.status;\n let finalTxHash = executeResponse.transactionHash;\n\n if (finalStatus === \"pending\") {\n // Send initial pending status to dialog\n this.sendTransactionStatus(iframe, \"pending\");\n\n // Poll status endpoint for updates\n const maxAttempts = 120; // 3 minutes at 1.5s intervals\n const pollIntervalMs = 1500;\n let lastStatus = \"pending\";\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const statusResponse = await fetch(\n `${this.config.providerUrl}/api/intent/status/${executeResponse.intentId}`,\n {\n method: \"GET\",\n headers: this.config.clientId\n ? { \"x-client-id\": this.config.clientId }\n : {},\n }\n );\n\n if (statusResponse.ok) {\n const statusResult = await statusResponse.json();\n finalStatus = statusResult.status;\n finalTxHash = statusResult.transactionHash;\n\n // Send status update to dialog if changed\n if (finalStatus !== lastStatus) {\n this.sendTransactionStatus(iframe, finalStatus, finalTxHash);\n lastStatus = finalStatus;\n }\n\n // Exit if terminal status reached\n // closeOn determines when to consider the intent successful (default: preconfirmed)\n const closeOn = options.closeOn || \"preconfirmed\";\n const successStatuses: Record<string, string[]> = {\n claimed: [\"claimed\", \"preconfirmed\", \"filled\", \"completed\"],\n preconfirmed: [\"preconfirmed\", \"filled\", \"completed\"],\n filled: [\"filled\", \"completed\"],\n completed: [\"completed\"],\n };\n const isTerminal = finalStatus === \"failed\" || finalStatus === \"expired\";\n const isSuccess = successStatuses[closeOn]?.includes(finalStatus) ?? false;\n if (isTerminal || isSuccess) {\n break;\n }\n }\n } catch (pollError) {\n console.error(\"Failed to poll intent status:\", pollError);\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n }\n\n // 7. Send final status to dialog\n // Map successful statuses to \"confirmed\" based on closeOn setting\n const closeOn = options.closeOn || \"preconfirmed\";\n const successStatuses: Record<string, string[]> = {\n claimed: [\"claimed\", \"preconfirmed\", \"filled\", \"completed\"],\n preconfirmed: [\"preconfirmed\", \"filled\", \"completed\"],\n filled: [\"filled\", \"completed\"],\n completed: [\"completed\"],\n };\n const isSuccessStatus = successStatuses[closeOn]?.includes(finalStatus) ?? false;\n const displayStatus = isSuccessStatus ? \"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(executeResponse.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: executeResponse.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: isSuccessStatus,\n intentId: executeResponse.intentId,\n status: finalStatus,\n transactionHash: finalTxHash,\n operationId: executeResponse.operationId,\n error: executeResponse.error,\n };\n }\n\n /**\n * Send a batch of intents for multi-chain execution with a single passkey tap.\n *\n * This method prepares multiple intents, shows a paginated review,\n * and signs all intents with a single passkey tap via a shared merkle tree.\n *\n * @example\n * ```typescript\n * const result = await client.sendBatchIntent({\n * username: 'alice',\n * intents: [\n * {\n * targetChain: 8453, // Base\n * calls: [{ to: '0x...', data: '0x...', label: 'Swap on Base' }],\n * },\n * {\n * targetChain: 42161, // Arbitrum\n * calls: [{ to: '0x...', data: '0x...', label: 'Mint on Arbitrum' }],\n * },\n * ],\n * });\n *\n * if (result.success) {\n * console.log(`${result.successCount} intents submitted`);\n * }\n * ```\n */\n async sendBatchIntent(options: SendBatchIntentOptions): Promise<SendBatchIntentResult> {\n if (!options.username) {\n return {\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n };\n }\n\n if (!options.intents?.length) {\n return {\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n };\n }\n\n // Serialize token request amounts to strings for API\n const serializedIntents = options.intents.map((intent) => ({\n targetChain: intent.targetChain,\n calls: intent.calls,\n tokenRequests: intent.tokenRequests?.map((r) => ({\n token: r.token,\n amount: r.amount.toString(),\n })),\n sourceAssets: intent.sourceAssets,\n sourceChainId: intent.sourceChainId,\n }));\n\n const requestBody = {\n username: options.username,\n intents: serializedIntents,\n ...(this.config.clientId && { clientId: this.config.clientId }),\n };\n\n // 1. Prepare batch (get quotes for all intents, compute shared merkle root)\n let prepareResponse: PrepareBatchIntentResponse;\n try {\n const response = await fetch(`${this.config.providerUrl}/api/intent/batch-prepare`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\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 batch intent\";\n\n if (errorMessage.includes(\"User not found\")) {\n localStorage.removeItem(\"1auth-user\");\n }\n\n return {\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n };\n }\n\n prepareResponse = await response.json();\n } catch {\n return {\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n };\n }\n\n // 2. Open signing dialog\n const dialogUrl = this.getDialogUrl();\n const themeParams = this.getThemeParams();\n const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ''}`;\n const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);\n\n // 3. Wait for dialog ready, send batch data via PASSKEY_INIT\n const dialogOrigin = this.getDialogOrigin();\n const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {\n mode: \"iframe\",\n batchMode: true,\n batchIntents: prepareResponse.intents,\n challenge: prepareResponse.challenge,\n username: options.username,\n accountAddress: prepareResponse.accountAddress,\n userId: prepareResponse.userId,\n expiresAt: prepareResponse.expiresAt,\n });\n if (!ready) {\n return {\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n };\n }\n\n // 4. Wait for batch signing result with auto-refresh support\n const batchResult = await new Promise<SendBatchIntentResult>((resolve) => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const message = event.data;\n\n // Handle quote refresh request\n if (message?.type === \"PASSKEY_REFRESH_QUOTE\") {\n console.log(\"[SDK] Batch dialog requested quote refresh, re-preparing all intents\");\n try {\n const refreshResponse = await fetch(`${this.config.providerUrl}/api/intent/batch-prepare`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(requestBody),\n });\n\n if (refreshResponse.ok) {\n const refreshed: PrepareBatchIntentResponse = await refreshResponse.json();\n prepareResponse = refreshed;\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_REFRESH_COMPLETE\",\n batchIntents: refreshed.intents,\n challenge: refreshed.challenge,\n expiresAt: refreshed.expiresAt,\n }, dialogOrigin);\n } else {\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_REFRESH_ERROR\",\n error: \"Failed to refresh batch quotes\",\n }, dialogOrigin);\n }\n } catch {\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_REFRESH_ERROR\",\n error: \"Failed to refresh batch quotes\",\n }, dialogOrigin);\n }\n return;\n }\n\n // Handle signing result with batch results\n if (message?.type === \"PASSKEY_SIGNING_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n\n if (message.success && message.data?.batchResults) {\n const rawResults: Array<{\n index: number;\n operationId?: string;\n intentId?: string;\n status: string;\n error?: string;\n success?: boolean;\n }> = message.data.batchResults;\n\n const results: BatchIntentItemResult[] = rawResults.map((r) => ({\n index: r.index,\n success: r.success ?? r.status !== \"FAILED\",\n intentId: r.intentId || r.operationId || \"\",\n status: r.status === \"FAILED\" ? \"failed\" : \"pending\",\n error: r.error ? { code: \"EXECUTE_FAILED\", message: r.error } : undefined,\n }));\n\n const successCount = results.filter((r) => r.success).length;\n\n // Wait for user to close dialog\n await this.waitForDialogClose(dialog, cleanup);\n\n resolve({\n success: successCount === results.length,\n results,\n successCount,\n failureCount: results.length - successCount,\n });\n } else {\n // Signing failed or was cancelled\n cleanup();\n resolve({\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n });\n }\n }\n\n // Handle dialog close\n if (message?.type === \"PASSKEY_CLOSE\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n resolve({\n success: false,\n results: [],\n successCount: 0,\n failureCount: 0,\n });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n });\n\n return batchResult;\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; intentId?: string } | undefined;\n\n if (message?.type === \"PASSKEY_SIGNING_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n\n // Check if dialog already executed the intent (new secure flow)\n if (message.success && payload?.intentId) {\n resolve({\n success: true,\n intentId: payload.intentId,\n } as SigningResult & { signedHash?: string; intentId?: string });\n } else if (message.success && payload?.signature) {\n // Legacy flow - dialog returns signature for SDK to execute\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 signing result with auto-refresh support\n * This method handles both signing results and quote refresh requests from the dialog\n */\n private waitForSigningWithRefresh(\n dialog: HTMLDialogElement,\n iframe: HTMLIFrameElement,\n cleanup: () => void,\n dialogOrigin: string,\n onRefresh: () => Promise<{\n intentOp: string;\n expiresAt: string;\n challenge: string;\n originMessages?: Array<{ chainId: number; hash: string }>;\n transaction?: unknown;\n } | null>\n ): Promise<SigningResult & { signedHash?: string }> {\n console.log(\"[SDK] waitForSigningWithRefresh, expecting origin:\", dialogOrigin);\n\n return new Promise((resolve) => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const message = event.data;\n\n // Handle quote refresh request from dialog\n if (message?.type === \"PASSKEY_REFRESH_QUOTE\") {\n console.log(\"[SDK] Received quote refresh request from dialog\");\n const refreshedData = await onRefresh();\n\n if (refreshedData) {\n // Send refreshed quote data to dialog\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_REFRESH_COMPLETE\",\n ...refreshedData,\n }, dialogOrigin);\n } else {\n // Send error if refresh failed\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_REFRESH_ERROR\",\n error: \"Failed to refresh quote\",\n }, dialogOrigin);\n }\n return;\n }\n\n const payload = message?.data as {\n signature?: WebAuthnSignature;\n passkey?: { credentialId: string; publicKeyX: string; publicKeyY: string };\n signedHash?: string;\n intentId?: string;\n } | undefined;\n\n if (message?.type === \"PASSKEY_SIGNING_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n\n // Check if dialog already executed the intent (new secure flow)\n if (message.success && payload?.intentId) {\n resolve({\n success: true,\n intentId: payload.intentId,\n } as SigningResult & { signedHash?: string; intentId?: string });\n } else if (message.success && payload?.signature) {\n // Legacy flow - dialog returns signature for SDK to execute\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: this.config.clientId\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 * Get the history of intents for the authenticated user.\n *\n * Requires an active session (user must be logged in).\n *\n * @example\n * ```typescript\n * // Get recent intents\n * const history = await client.getIntentHistory({ limit: 10 });\n *\n * // Filter by status\n * const pending = await client.getIntentHistory({ status: 'pending' });\n *\n * // Filter by date range\n * const lastWeek = await client.getIntentHistory({\n * from: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n * });\n * ```\n */\n async getIntentHistory(\n options?: IntentHistoryOptions\n ): Promise<IntentHistoryResult> {\n const queryParams = new URLSearchParams();\n if (options?.limit) queryParams.set(\"limit\", String(options.limit));\n if (options?.offset) queryParams.set(\"offset\", String(options.offset));\n if (options?.status) queryParams.set(\"status\", options.status);\n if (options?.from) queryParams.set(\"from\", options.from);\n if (options?.to) queryParams.set(\"to\", options.to);\n\n const url = `${this.config.providerUrl}/api/intent/history${\n queryParams.toString() ? `?${queryParams}` : \"\"\n }`;\n\n const response = await fetch(url, {\n headers: this.config.clientId\n ? { \"x-client-id\": this.config.clientId }\n : {},\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || \"Failed to get intent history\");\n }\n\n return response.json();\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 // Resolve fromToken (optional - omit to let orchestrator pick)\n let fromTokenAddress: Address | undefined;\n if (options.fromToken) {\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 fromTokenAddress = fromTokenResult.address;\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 toTokenAddress = toTokenResult.address;\n\n // Debug: log token resolution\n console.log(\"[SDK sendSwap] Token resolution:\", {\n fromToken: options.fromToken ?? \"Any\",\n fromTokenAddress: fromTokenAddress ?? \"orchestrator picks\",\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;\n }\n try {\n return getTokenSymbol(token as Address, options.targetChain);\n } catch {\n return fallback;\n }\n };\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 = fromTokenAddress\n ? fromTokenAddress === \"0x0000000000000000000000000000000000000000\"\n : false;\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 try {\n // Case-insensitive lookup from registry (symbols like \"MockUSD\" are case-sensitive in upstream SDK)\n const match = getSupportedTokens(chainId).find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase()\n );\n if (match) {\n console.log(`[SDK] getTokenDecimals(${match.symbol}, ${chainId}) = ${match.decimals}`);\n return match.decimals;\n }\n const decimals = getTokenDecimals(symbol as never, chainId);\n console.log(`[SDK] getTokenDecimals(${symbol}, ${chainId}) = ${decimals}`);\n return decimals;\n } catch (e) {\n const upperSymbol = symbol.toUpperCase();\n console.warn(`[SDK] getTokenDecimals failed for ${symbol}, using fallback`, e);\n return KNOWN_DECIMALS[upperSymbol] ?? 18;\n }\n };\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\n ? options.fromToken.toUpperCase() === options.toToken.toUpperCase()\n : false;\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 // Always specify tokenRequests so the orchestrator knows the desired output and we can show \"Buying\" in UI\n const tokenRequests: IntentTokenRequest[] = [{\n token: toTokenAddress,\n amount: parseUnits(options.amount, toDecimals),\n }];\n\n console.log(\"[SDK sendSwap] Building intent:\", {\n isBridge,\n isFromNativeEth,\n isToNativeEth,\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 // The label/sublabel tell the dialog what to display (instead of \"Send\" with unknown address)\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 // SDK provides labels so dialog shows \"Buy ETH\" not \"Send ETH / To: 0x000...\"\n label: `Buy ${toSymbol}`,\n sublabel: `${options.amount} ${toSymbol}`,\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 // Use canonical symbol casing from registry (e.g. \"MockUSD\" not \"MOCKUSD\")\n sourceAssets: options.sourceAssets || (options.fromToken ? [options.fromToken] : undefined),\n // Pass source chain ID so orchestrator knows which chain to look for tokens on\n sourceChainId: options.sourceChainId,\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 ?? options.fromToken,\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 const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {\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 });\n if (!ready) {\n return {\n success: false,\n error: {\n code: \"USER_REJECTED\" as SigningErrorCode,\n message: \"User closed the dialog\",\n },\n };\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 const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {\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 });\n if (!ready) {\n return {\n success: false,\n error: {\n code: \"USER_REJECTED\" as SigningErrorCode,\n message: \"User closed the dialog\",\n },\n };\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: this.config.clientId\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 ...(this.config.clientId && { 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 * Wait for the dialog iframe to signal ready, then send init data.\n * Also handles early close (X button, escape, backdrop) during the ready phase.\n * Returns true if dialog is ready, false if it was closed before becoming ready.\n */\n private waitForDialogReady(\n dialog: HTMLDialogElement,\n iframe: HTMLIFrameElement,\n cleanup: () => void,\n initMessage: Record<string, unknown>,\n ): Promise<boolean> {\n const dialogOrigin = this.getDialogOrigin();\n return new Promise((resolve) => {\n let settled = false;\n\n const teardown = () => {\n if (settled) return;\n settled = true;\n window.removeEventListener(\"message\", handleMessage);\n dialog.removeEventListener(\"close\", handleClose);\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n if (event.data?.type === \"PASSKEY_READY\") {\n teardown();\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_INIT\",\n ...initMessage,\n }, dialogOrigin);\n resolve(true);\n } else if (event.data?.type === \"PASSKEY_CLOSE\") {\n teardown();\n cleanup();\n resolve(false);\n }\n };\n\n // Handle escape key / backdrop click which call cleanup() -> dialog.close()\n const handleClose = () => {\n teardown();\n resolve(false);\n };\n\n window.addEventListener(\"message\", handleMessage);\n dialog.addEventListener(\"close\", handleClose);\n });\n }\n\n /**\n * Create a modal dialog with an iframe inside.\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 const dialog = document.createElement(\"dialog\");\n dialog.dataset.passkey = \"\";\n document.body.appendChild(dialog);\n\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 // Track whether the dialog has signaled ready\n // This prevents stale PASSKEY_CLOSE messages from previous dialogs\n let dialogReady = false;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== dialogOrigin) return;\n\n const data = event.data;\n\n // Wait for dialog to signal ready before processing other messages\n if (data?.type === \"PASSKEY_READY\") {\n dialogReady = true;\n // Send init message to the auth dialog\n iframe.contentWindow?.postMessage({\n type: \"PASSKEY_INIT\",\n mode: \"iframe\",\n }, dialogOrigin);\n return;\n }\n\n // Ignore messages until dialog is ready (prevents stale CLOSE from previous dialogs)\n if (!dialogReady && data?.type === \"PASSKEY_CLOSE\") {\n return;\n }\n\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_RETRY_POPUP\") {\n // Password manager (e.g. Bitwarden) interfered with WebAuthn in iframe\n // Retry in popup mode where WebAuthn works without cross-origin restrictions\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n\n // Get the current dialog URL and switch to popup mode\n const popupUrl = data.data?.url?.replace(\"mode=iframe\", \"mode=popup\")\n || `${this.getDialogUrl()}/dialog/auth?mode=popup${this.config.clientId ? `&clientId=${this.config.clientId}` : ''}`;\n\n // Open popup and wait for result\n this.waitForPopupAuthResponse(popupUrl).then(resolve);\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 /**\n * Open a popup for auth and wait for the result.\n * Used when iframe mode fails (e.g., due to password manager interference).\n */\n private waitForPopupAuthResponse(url: string): Promise<LoginResult | RegisterResult> {\n const dialogOrigin = this.getDialogOrigin();\n const popup = this.openPopup(url);\n\n return new Promise((resolve) => {\n // Poll to check if popup was closed\n const pollTimer = setInterval(() => {\n if (popup?.closed) {\n clearInterval(pollTimer);\n window.removeEventListener(\"message\", handleMessage);\n resolve({\n success: false,\n error: {\n code: \"USER_CANCELLED\",\n message: \"Authentication was cancelled\",\n },\n });\n }\n }, 500);\n\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 clearInterval(pollTimer);\n window.removeEventListener(\"message\", handleMessage);\n popup?.close();\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 clearInterval(pollTimer);\n window.removeEventListener(\"message\", handleMessage);\n popup?.close();\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 clearInterval(pollTimer);\n window.removeEventListener(\"message\", handleMessage);\n popup?.close();\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 waitForConnectResponse(\n _dialog: HTMLDialogElement,\n _iframe: HTMLIFrameElement,\n cleanup: () => void\n ): Promise<ConnectResult> {\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_CONNECT_RESULT\") {\n window.removeEventListener(\"message\", handleMessage);\n cleanup();\n\n if (data.success) {\n resolve({\n success: true,\n username: data.data?.username,\n autoConnected: data.data?.autoConnected,\n });\n } else {\n resolve({\n success: false,\n action: data.data?.action,\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 action: \"cancel\",\n error: {\n code: \"USER_CANCELLED\",\n message: \"Connection 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: this.config.clientId\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\nexport { OneAuthClient as PasskeyProviderClient };\n","import type { Address, Chain } from \"viem\";\nimport { isAddress } from \"viem\";\nimport * as viemChains from \"viem/chains\";\nimport {\n getAllSupportedChainsAndTokens as getAllSupportedChainsAndTokensRaw,\n getSupportedTokens as getSupportedTokensRaw,\n getTokenAddress,\n getTokenDecimals,\n} from \"@rhinestone/sdk\";\n\nexport type TokenConfig = {\n symbol: string;\n address: Address;\n decimals: number;\n supportsMultichain?: boolean;\n [key: string]: unknown;\n};\n\nexport type ChainFilterOptions = {\n includeTestnets?: boolean;\n chainIds?: number[];\n};\n\nconst env: Record<string, string | undefined> =\n typeof process !== \"undefined\" ? process.env : {};\n\nconst ALL_VIEM_CHAINS = (Object.values(viemChains) as unknown[]).filter(\n (value): value is Chain =>\n typeof value === \"object\" && value !== null && \"id\" in value && \"name\" in value\n);\nconst VIEM_CHAIN_BY_ID = new Map<number, Chain>(\n ALL_VIEM_CHAINS.map((chain) => [chain.id, chain])\n);\nconst SUPPORTED_CHAIN_IDS = new Set(\n getAllSupportedChainsAndTokensRaw().map((entry) => entry.chainId)\n);\n\nfunction parseBool(value?: string): boolean | undefined {\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n return undefined;\n}\n\nfunction resolveIncludeTestnets(explicit?: boolean): boolean {\n if (explicit !== undefined) return explicit;\n const envValue =\n parseBool(env.NEXT_PUBLIC_ORCHESTRATOR_USE_TESTNETS) ??\n parseBool(env.ORCHESTRATOR_USE_TESTNETS);\n return envValue ?? false;\n}\n\nfunction applyChainFilters(chainIds: number[], options?: ChainFilterOptions): number[] {\n const includeTestnets = resolveIncludeTestnets(options?.includeTestnets);\n const allowlist = options?.chainIds;\n let filtered = chainIds;\n\n if (!includeTestnets) {\n filtered = filtered.filter((chainId) => !isTestnet(chainId));\n }\n\n if (allowlist && allowlist.length > 0) {\n const allowed = new Set(allowlist);\n filtered = filtered.filter((chainId) => allowed.has(chainId));\n }\n\n return filtered;\n}\n\nexport function getSupportedChainIds(options?: ChainFilterOptions): number[] {\n return applyChainFilters(Array.from(SUPPORTED_CHAIN_IDS), options);\n}\n\nexport function getSupportedChains(options?: ChainFilterOptions): Chain[] {\n return getSupportedChainIds(options)\n .map((chainId) => VIEM_CHAIN_BY_ID.get(chainId))\n .filter((chain): chain is Chain => Boolean(chain));\n}\n\nexport function getAllSupportedChainsAndTokens(options?: ChainFilterOptions): Array<{\n chainId: number;\n tokens: TokenConfig[];\n}> {\n const allowed = new Set(getSupportedChainIds(options));\n return getAllSupportedChainsAndTokensRaw()\n .filter((entry) => allowed.has(entry.chainId))\n .map((entry) => ({\n chainId: entry.chainId,\n tokens: entry.tokens as TokenConfig[],\n }));\n}\n\nexport function getChainById(chainId: number): Chain {\n if (!SUPPORTED_CHAIN_IDS.has(chainId)) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n const chain = VIEM_CHAIN_BY_ID.get(chainId);\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n return chain;\n}\n\nexport function getChainName(chainId: number): string {\n try {\n return getChainById(chainId).name;\n } catch {\n return `Chain ${chainId}`;\n }\n}\n\nexport function getChainExplorerUrl(chainId: number): string | undefined {\n try {\n return getChainById(chainId).blockExplorers?.default?.url;\n } catch {\n return undefined;\n }\n}\n\nexport function getChainRpcUrl(chainId: number): string | undefined {\n try {\n const chain = getChainById(chainId);\n return chain.rpcUrls?.default?.http?.[0] || chain.rpcUrls?.public?.http?.[0];\n } catch {\n return undefined;\n }\n}\n\nexport function getSupportedTokens(chainId: number): TokenConfig[] {\n return getSupportedTokensRaw(chainId) as TokenConfig[];\n}\n\nexport function getSupportedTokenSymbols(chainId: number): string[] {\n return getSupportedTokens(chainId).map((token) => token.symbol);\n}\n\nexport function resolveTokenAddress(token: string, chainId: number): Address {\n if (isAddress(token)) {\n return token;\n }\n // Case-insensitive lookup: find canonical symbol from registry, then resolve\n const match = getSupportedTokens(chainId).find(\n (t) => t.symbol.toUpperCase() === token.toUpperCase()\n );\n if (!match) {\n return getTokenAddress(token as never, chainId);\n }\n return match.address;\n}\n\nexport function isTestnet(chainId: number): boolean {\n try {\n return getChainById(chainId).testnet ?? false;\n } catch {\n return false;\n }\n}\n\nexport function getTokenSymbol(tokenAddress: Address, chainId: number): string {\n const token = getSupportedTokens(chainId).find(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (!token) {\n throw new Error(`Unsupported token: ${tokenAddress} on chain ${chainId}`);\n }\n return token.symbol;\n}\n\nexport function isTokenAddressSupported(tokenAddress: Address, chainId: number): boolean {\n try {\n return getSupportedTokens(chainId).some(\n (entry) => entry.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n } catch {\n return false;\n }\n}\n\nexport { getTokenAddress, getTokenDecimals };\n","import {\n hexToString,\n isHex,\n numberToHex,\n type Address,\n type Hex,\n} from \"viem\";\nimport { OneAuthClient } from \"./client\";\nimport { getSupportedChainIds } from \"./registry\";\nimport type { CloseOnStatus, IntentCall, IntentSigner, IntentTokenRequest } from \"./types\";\nimport { encodeWebAuthnSignature } from \"./walletClient/utils\";\n\ntype ProviderRequest = {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n};\n\ntype Listener = (...args: unknown[]) => void;\n\ntype StoredUser = {\n username: string;\n address: Address;\n};\n\nexport type OneAuthProvider = {\n request: (args: ProviderRequest) => Promise<unknown>;\n on: (event: string, listener: Listener) => void;\n removeListener: (event: string, listener: Listener) => void;\n disconnect: () => Promise<void>;\n};\n\n/** @deprecated Use OneAuthProvider instead */\nexport type PasskeyProvider = OneAuthProvider;\n\nexport type OneAuthProviderOptions = {\n client: OneAuthClient;\n chainId: number;\n storageKey?: string;\n /** When to close the dialog and return success. Defaults to \"preconfirmed\" */\n closeOn?: CloseOnStatus;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n signIntent?: IntentSigner;\n};\n\n/** @deprecated Use OneAuthProviderOptions instead */\nexport type PasskeyProviderOptions = OneAuthProviderOptions;\n\nconst DEFAULT_STORAGE_KEY = \"1auth-user\";\n\nexport function createOneAuthProvider(\n options: OneAuthProviderOptions\n): OneAuthProvider {\n const { client } = options;\n let chainId = options.chainId;\n const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;\n\n const listeners = new Map<string, Set<Listener>>();\n\n const emit = (event: string, ...args: unknown[]) => {\n const set = listeners.get(event);\n if (!set) return;\n for (const listener of set) listener(...args);\n };\n\n const getStoredUser = (): StoredUser | null => {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as StoredUser;\n if (!parsed?.username || !parsed?.address) return null;\n return parsed;\n } catch {\n return null;\n }\n };\n\n const setStoredUser = (user: StoredUser) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(storageKey, JSON.stringify(user));\n };\n\n const clearStoredUser = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(storageKey);\n };\n\n const resolveAccountAddress = async (username: string): Promise<Address> => {\n const clientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(username)}/account`,\n {\n headers: clientId ? { \"x-client-id\": clientId } : {},\n }\n );\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to resolve account address\");\n }\n\n const data = await response.json();\n return data.address as Address;\n };\n\n const connect = async (): Promise<Address[]> => {\n const stored = getStoredUser();\n if (stored) {\n return [stored.address];\n }\n\n // First try the lightweight connect modal\n const connectResult = await client.connectWithModal();\n\n let username: string | undefined;\n\n if (connectResult.success && connectResult.username) {\n // Connection successful (user confirmed or auto-connected)\n username = connectResult.username;\n } else if (connectResult.action === \"switch\") {\n // User wants to switch account or no previous user - show auth modal\n const authResult = await client.authWithModal();\n if (!authResult.success || !authResult.username) {\n throw new Error(authResult.error?.message || \"Authentication failed\");\n }\n username = authResult.username;\n } else {\n // Connection was cancelled\n throw new Error(connectResult.error?.message || \"Connection cancelled\");\n }\n\n const address = await resolveAccountAddress(username);\n setStoredUser({ username, address });\n emit(\"accountsChanged\", [address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n return [address];\n };\n\n const disconnect = async () => {\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n };\n\n const ensureUser = async (): Promise<StoredUser> => {\n const stored = getStoredUser();\n if (stored) return stored;\n const [address] = await connect();\n const username = getStoredUser()?.username;\n if (!username || !address) {\n throw new Error(\"Failed to resolve user session\");\n }\n return { username, address };\n };\n\n const parseChainId = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) return Number.parseInt(value, 16);\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n };\n\n const normalizeValue = (value: unknown): string | undefined => {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\") return Math.trunc(value).toString();\n if (typeof value === \"string\") {\n if (value.startsWith(\"0x\")) {\n try {\n return BigInt(value).toString();\n } catch {\n return \"0\";\n }\n }\n return value;\n }\n return undefined;\n };\n\n const normalizeCalls = (calls: unknown[]): IntentCall[] => {\n return calls.map((call) => {\n const c = call as Record<string, unknown>;\n return {\n to: c.to as Address,\n data: (c.data as Hex | undefined) || \"0x\",\n value: normalizeValue(c.value) || \"0\",\n label: c.label as string | undefined,\n sublabel: c.sublabel as string | undefined,\n };\n });\n };\n\n const normalizeTokenRequests = (\n requests: unknown\n ): IntentTokenRequest[] | undefined => {\n if (!Array.isArray(requests)) return undefined;\n return requests.map((r) => {\n const req = r as Record<string, unknown>;\n return {\n token: req.token as string,\n amount:\n typeof req.amount === \"bigint\"\n ? req.amount\n : BigInt(String(req.amount || \"0\")),\n };\n });\n };\n\n const decodeMessage = (value: string) => {\n if (!isHex(value)) return value;\n try {\n return hexToString(value as Hex);\n } catch {\n return value;\n }\n };\n\n const signMessage = async (message: string) => {\n const { username } = await ensureUser();\n const result = await client.signMessage({\n username,\n 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\n const signTypedData = async (typedData: unknown) => {\n const { username } = await ensureUser();\n const data =\n typeof typedData === \"string\" ? JSON.parse(typedData) : typedData;\n const result = await client.signTypedData({\n username,\n domain: (data as any).domain,\n types: (data as any).types,\n primaryType: (data as any).primaryType,\n message: (data as any).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\n const resolveIntentPayload = async (payload: {\n username: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n }) => {\n if (!options.signIntent) {\n return {\n username: payload.username,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n };\n }\n const signedIntent = await options.signIntent({\n username: payload.username,\n accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n });\n return { signedIntent };\n };\n\n const sendIntent = async (payload: {\n username: string;\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n sourceChainId?: number;\n }) => {\n // Use explicit closeOn if provided, otherwise default based on waitForHash\n const closeOn = options.closeOn ?? ((options.waitForHash ?? true) ? \"completed\" : \"preconfirmed\");\n const intentPayload = await resolveIntentPayload(payload);\n const result = await client.sendIntent({\n ...intentPayload,\n tokenRequests: payload.tokenRequests,\n sourceChainId: payload.sourceChainId,\n closeOn,\n waitForHash: options.waitForHash ?? true,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n\n if (!result.success) {\n throw new Error(result.error?.message || \"Transaction failed\");\n }\n\n // Return intentId as callsId for EIP-5792 compatibility\n return result.intentId;\n };\n\n const request = async ({ method, params }: ProviderRequest) => {\n switch (method) {\n case \"eth_chainId\":\n return numberToHex(chainId);\n case \"eth_accounts\": {\n const stored = getStoredUser();\n return stored ? [stored.address] : [];\n }\n case \"eth_requestAccounts\":\n return connect();\n case \"wallet_connect\":\n return connect();\n case \"wallet_disconnect\":\n await disconnect();\n return true;\n case \"wallet_switchEthereumChain\": {\n const [param] = (params as any[]) || [];\n const next = parseChainId(param?.chainId ?? param);\n if (!next) {\n throw new Error(\"Invalid chainId\");\n }\n chainId = next;\n emit(\"chainChanged\", numberToHex(chainId));\n return null;\n }\n case \"personal_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const first = paramList[0];\n const second = paramList[1];\n const message =\n typeof first === \"string\" && first.startsWith(\"0x\") && second\n ? typeof second === \"string\" && !second.startsWith(\"0x\")\n ? second\n : decodeMessage(first)\n : typeof first === \"string\"\n ? decodeMessage(first)\n : typeof second === \"string\"\n ? decodeMessage(second)\n : \"\";\n if (!message) throw new Error(\"Invalid personal_sign payload\");\n return signMessage(message);\n }\n case \"eth_sign\": {\n const paramList = Array.isArray(params) ? params : [];\n const message = typeof paramList[1] === \"string\" ? paramList[1] : \"\";\n if (!message) throw new Error(\"Invalid eth_sign payload\");\n return signMessage(decodeMessage(message));\n }\n case \"eth_signTypedData\":\n case \"eth_signTypedData_v4\": {\n const paramList = Array.isArray(params) ? params : [];\n const typedData = paramList[1] ?? paramList[0];\n return signTypedData(typedData);\n }\n case \"eth_sendTransaction\": {\n const paramList = Array.isArray(params) ? params : [];\n const tx = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(tx.chainId) ?? chainId;\n const calls = normalizeCalls([tx]);\n const tokenRequests = normalizeTokenRequests(tx.tokenRequests);\n const txSourceChainId = parseChainId(tx.sourceChainId);\n return sendIntent({\n username: user.username,\n accountAddress: user.address,\n targetChain,\n calls,\n tokenRequests,\n sourceChainId: txSourceChainId,\n });\n }\n case \"wallet_sendCalls\": {\n const paramList = Array.isArray(params) ? params : [];\n const payload = (paramList[0] || {}) as Record<string, unknown>;\n const user = await ensureUser();\n const targetChain = parseChainId(payload.chainId) ?? chainId;\n const calls = normalizeCalls((payload.calls as unknown[]) || []);\n const tokenRequests = normalizeTokenRequests(payload.tokenRequests);\n const sourceChainId = parseChainId(payload.sourceChainId);\n if (!calls.length) throw new Error(\"No calls provided\");\n return sendIntent({\n username: user.username,\n accountAddress: user.address,\n targetChain,\n calls,\n tokenRequests,\n sourceChainId,\n });\n }\n case \"wallet_getCapabilities\": {\n const paramList = Array.isArray(params) ? params : [];\n // walletAddress is params[0] - we ignore since all accounts have same capabilities\n const requestedChains = paramList[1] as `0x${string}`[] | undefined;\n\n const chainIds = getSupportedChainIds();\n const capabilities: Record<`0x${string}`, Record<string, unknown>> = {};\n\n for (const chainId of chainIds) {\n const hexChainId = `0x${chainId.toString(16)}` as `0x${string}`;\n\n // Filter if specific chains requested\n if (requestedChains && !requestedChains.includes(hexChainId)) {\n continue;\n }\n\n capabilities[hexChainId] = {\n atomic: { status: \"supported\" },\n paymasterService: { supported: true },\n auxiliaryFunds: { supported: true },\n };\n }\n\n return capabilities;\n }\n case \"wallet_getAssets\": {\n const { username } = await ensureUser();\n const clientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(username)}/portfolio`,\n {\n headers: clientId ? { \"x-client-id\": clientId } : {},\n }\n );\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to get assets\");\n }\n return response.json();\n }\n case \"wallet_getCallsStatus\": {\n const paramList = Array.isArray(params) ? params : [];\n const callsId = paramList[0] as string;\n if (!callsId) {\n throw new Error(\"callsId is required\");\n }\n const statusClientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/intent/status/${encodeURIComponent(callsId)}`,\n {\n headers: statusClientId ? { \"x-client-id\": statusClientId } : {},\n }\n );\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to get calls status\");\n }\n const data = await response.json();\n // Map intent status to EIP-5792 format\n const statusMap: Record<string, string> = {\n pending: \"PENDING\",\n preconfirmed: \"PENDING\",\n completed: \"CONFIRMED\",\n failed: \"CONFIRMED\",\n expired: \"CONFIRMED\",\n };\n return {\n status: statusMap[data.status] || \"PENDING\",\n receipts: data.transactionHash\n ? [\n {\n logs: [],\n status: data.status === \"completed\" ? \"0x1\" : \"0x0\",\n blockHash: data.blockHash,\n blockNumber: data.blockNumber,\n transactionHash: data.transactionHash,\n },\n ]\n : [],\n };\n }\n case \"wallet_getCallsHistory\": {\n const paramList = Array.isArray(params) ? params : [];\n const options = (paramList[0] || {}) as {\n limit?: number;\n offset?: number;\n status?: string;\n from?: string;\n to?: string;\n };\n\n const queryParams = new URLSearchParams();\n if (options.limit) queryParams.set(\"limit\", String(options.limit));\n if (options.offset) queryParams.set(\"offset\", String(options.offset));\n if (options.status) queryParams.set(\"status\", options.status);\n if (options.from) queryParams.set(\"from\", options.from);\n if (options.to) queryParams.set(\"to\", options.to);\n\n const url = `${client.getProviderUrl()}/api/intent/history${\n queryParams.toString() ? `?${queryParams}` : \"\"\n }`;\n\n const historyClientId = client.getClientId();\n const response = await fetch(url, {\n headers: historyClientId ? { \"x-client-id\": historyClientId } : {},\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || \"Failed to get calls history\");\n }\n\n const data = await response.json();\n\n // Map intent status to EIP-5792 format\n const statusMap: Record<string, string> = {\n pending: \"PENDING\",\n preconfirmed: \"PENDING\",\n completed: \"CONFIRMED\",\n failed: \"CONFIRMED\",\n expired: \"CONFIRMED\",\n };\n\n // intentId IS the orchestrator's ID (used as callsId in EIP-5792)\n return {\n calls: data.intents.map(\n (intent: {\n intentId: string;\n status: string;\n transactionHash?: string;\n targetChain: number;\n }) => ({\n callsId: intent.intentId, // intentId is the orchestrator's ID\n status: statusMap[intent.status] || \"PENDING\",\n receipts: intent.transactionHash\n ? [{ transactionHash: intent.transactionHash }]\n : [],\n chainId: `0x${intent.targetChain.toString(16)}`,\n })\n ),\n total: data.total,\n hasMore: data.hasMore,\n };\n }\n default:\n throw new Error(`Unsupported method: ${method}`);\n }\n };\n\n return {\n request,\n on(event, listener) {\n const set = listeners.get(event) ?? new Set();\n set.add(listener);\n listeners.set(event, set);\n },\n removeListener(event, listener) {\n const set = listeners.get(event);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) listeners.delete(event);\n },\n disconnect,\n };\n}\n\n/** @deprecated Use createOneAuthProvider instead */\nexport const createPasskeyProvider = createOneAuthProvider;\n","import { encodeAbiParameters, keccak256 } from 'viem';\nimport type { Hex } from 'viem';\nimport type { WebAuthnSignature } from '../types';\nimport type { TransactionCall } from './types';\n\n/**\n * P-256 curve order (n)\n * Used for signature malleability normalization\n */\nconst P256_N = BigInt(\n '0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551'\n);\nconst P256_N_DIV_2 = P256_N / 2n;\n\n/**\n * WebAuthnAuth struct type for ABI encoding\n */\nconst WEBAUTHN_AUTH_TYPE = {\n type: 'tuple',\n components: [\n { type: 'bytes', name: 'authenticatorData' },\n { type: 'string', name: 'clientDataJSON' },\n { type: 'uint256', name: 'challengeIndex' },\n { type: 'uint256', name: 'typeIndex' },\n { type: 'uint256', name: 'r' },\n { type: 'uint256', name: 's' },\n ],\n} as const;\n\n/**\n * Encode a WebAuthn signature for ERC-1271 verification on-chain\n *\n * @param sig - The WebAuthn signature from the passkey\n * @returns ABI-encoded signature bytes\n */\nexport function encodeWebAuthnSignature(sig: WebAuthnSignature): Hex {\n // Normalize s to prevent signature malleability\n let s = BigInt(sig.s);\n if (s > P256_N_DIV_2) {\n s = P256_N - s;\n }\n\n return encodeAbiParameters([WEBAUTHN_AUTH_TYPE], [\n {\n authenticatorData: sig.authenticatorData as Hex,\n clientDataJSON: sig.clientDataJSON,\n challengeIndex: BigInt(sig.challengeIndex),\n typeIndex: BigInt(sig.typeIndex),\n r: BigInt(sig.r),\n s,\n },\n ]);\n}\n\n/**\n * Hash an array of transaction calls for signing\n *\n * @param calls - Array of transaction calls\n * @returns keccak256 hash of the encoded calls\n */\nexport function hashCalls(calls: TransactionCall[]): Hex {\n const encoded = encodeAbiParameters(\n [\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'to' },\n { type: 'bytes', name: 'data' },\n { type: 'uint256', name: 'value' },\n ],\n },\n ],\n [\n calls.map((c) => ({\n to: c.to,\n data: c.data || '0x',\n value: c.value || 0n,\n })),\n ]\n );\n return keccak256(encoded);\n}\n\n/**\n * Build transaction review display data from calls\n *\n * @param calls - Array of transaction calls\n * @returns TransactionDetails for the signing modal\n */\nexport function buildTransactionReview(calls: TransactionCall[]) {\n return {\n actions: calls.map((call, i) => ({\n type: 'custom' as const,\n label: call.label || `Contract Call ${i + 1}`,\n sublabel: call.sublabel || `To: ${call.to.slice(0, 10)}...${call.to.slice(-8)}`,\n amount: call.value ? `${call.value} wei` : undefined,\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 { OneAuthClient } 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: OneAuthClient,\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 { OneAuthClient } from '../client';\nimport type { IntentCall } from '../types';\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://passkey.1auth.box',\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 OneAuthClient({\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 if (!result.signature) {\n throw new Error('No signature received');\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 if (!result.signature) {\n throw new Error('No signature received');\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 if (!result.signature) {\n throw new Error('No signature received');\n }\n\n return encodeWebAuthnSignature(result.signature);\n };\n\n const buildIntentPayload = async (\n calls: TransactionCall[],\n targetChainOverride?: number\n ) => {\n const targetChain = targetChainOverride ?? config.chain.id;\n const intentCalls: IntentCall[] = calls.map((call) => ({\n to: call.to,\n data: call.data || \"0x\",\n value: call.value !== undefined ? call.value.toString() : \"0\",\n label: call.label,\n sublabel: call.sublabel,\n }));\n\n if (config.signIntent) {\n const signedIntent = await config.signIntent({\n username: config.username,\n accountAddress: config.accountAddress,\n targetChain,\n calls: intentCalls,\n });\n return { signedIntent };\n }\n\n return {\n username: config.username,\n targetChain,\n calls: intentCalls,\n };\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 targetChain =\n typeof transaction.chainId === \"number\"\n ? transaction.chainId\n : transaction.chain?.id;\n const calls: TransactionCall[] = [\n {\n to: transaction.to!,\n data: transaction.data || \"0x\",\n value: transaction.value,\n },\n ];\n const closeOn = (config.waitForHash ?? true)\n ? \"completed\"\n : \"preconfirmed\";\n\n const intentPayload = await buildIntentPayload(calls, targetChain);\n const result = await provider.sendIntent({\n ...intentPayload,\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, chainId: targetChain, tokenRequests } = params;\n const closeOn = (config.waitForHash ?? true)\n ? \"completed\"\n : \"preconfirmed\";\n const intentPayload = await buildIntentPayload(calls, targetChain);\n const result = await provider.sendIntent({\n ...intentPayload,\n tokenRequests,\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 { OneAuthClient } 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 OneAuthClient instance */\n client: OneAuthClient;\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 EIP-191 prefix used for personal message signing.\n * This is the standard Ethereum message prefix for `personal_sign`.\n */\nexport const ETHEREUM_MESSAGE_PREFIX = \"\\x19Ethereum Signed Message:\\n\";\n\n/**\n * @deprecated Use ETHEREUM_MESSAGE_PREFIX instead. Kept for backwards compatibility.\n */\nexport const PASSKEY_MESSAGE_PREFIX = ETHEREUM_MESSAGE_PREFIX;\n\n/**\n * Hash a message with the EIP-191 Ethereum prefix.\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(\"\\x19Ethereum 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 = ETHEREUM_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":["getChainName","hashMessage","import_viem","getAllSupportedChainsAndTokensRaw","getSupportedTokensRaw","closeOn","successStatuses","import_viem","import_viem","data","chainId","options","import_viem","import_viem","import_accounts","getChainName","username","React","import_jsx_runtime","getChainName","import_viem","hashMessage"]}
|