@rhinestone/1auth 0.6.1 → 0.6.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.
@@ -37,7 +37,7 @@ function applyChainFilters(chainIds, options) {
37
37
  if (!includeTestnets) {
38
38
  filtered = filtered.filter((chainId) => !isTestnet(chainId));
39
39
  }
40
- if (allowlist && allowlist.length > 0) {
40
+ if (allowlist) {
41
41
  const allowed = new Set(allowlist);
42
42
  filtered = filtered.filter((chainId) => allowed.has(chainId));
43
43
  }
@@ -312,11 +312,7 @@ function createOneAuthProvider(options) {
312
312
  if (typeof value === "number") return Math.trunc(value).toString();
313
313
  if (typeof value === "string") {
314
314
  if (value.startsWith("0x")) {
315
- try {
316
- return BigInt(value).toString();
317
- } catch {
318
- return "0";
319
- }
315
+ return BigInt(value).toString();
320
316
  }
321
317
  return value;
322
318
  }
@@ -662,4 +658,4 @@ export {
662
658
  buildTransactionReview,
663
659
  createOneAuthProvider
664
660
  };
665
- //# sourceMappingURL=chunk-N4BLW5UR.mjs.map
661
+ //# sourceMappingURL=chunk-IP2FG4WQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry.ts","../src/walletClient/utils.ts","../src/provider.ts"],"sourcesContent":["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\n// Build a chain-ID-to-Chain map from viem, resolving collisions by\n// preferring non-testnet (mainnet) definitions. Viem has duplicate IDs\n// (e.g. zoraTestnet and hyperEvm both use 999) and Map last-write-wins\n// can pick the wrong one.\nconst VIEM_CHAIN_BY_ID = new Map<number, Chain>();\nfor (const value of Object.values(viemChains)) {\n if (typeof value !== \"object\" || value === null || !(\"id\" in value) || !(\"name\" in value)) continue;\n const chain = value as Chain;\n const existing = VIEM_CHAIN_BY_ID.get(chain.id);\n if (!existing || (existing.testnet && !chain.testnet)) {\n VIEM_CHAIN_BY_ID.set(chain.id, chain);\n }\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) {\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 { 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 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\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\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?.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 let address: Address | undefined;\n\n if (connectResult.success) {\n // Connection successful (user confirmed or auto-connected)\n username = connectResult.user?.username;\n address = connectResult.user?.address;\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) {\n throw new Error(authResult.error?.message || \"Authentication failed\");\n }\n username = authResult.user?.username;\n address = authResult.user?.address;\n } else {\n // Connection was cancelled\n throw new Error(connectResult.error?.message || \"Connection cancelled\");\n }\n\n // Use address from result directly, or resolve from username\n if (!address && username) {\n address = await resolveAccountAddress(username);\n }\n if (!address) {\n throw new Error(\"No account address available\");\n }\n\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 if (!address) {\n throw new Error(\"Failed to resolve user session\");\n }\n const user = getStoredUser();\n return user || { 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 return BigInt(value).toString();\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 user = await ensureUser();\n if (!user.username && !user.address) {\n throw new Error(\"Username or address required for signing.\");\n }\n const result = await client.signMessage({\n username: user.username,\n accountAddress: user.address,\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 user = await ensureUser();\n if (!user.username && !user.address) {\n throw new Error(\"Username or address required for signing.\");\n }\n const data =\n typeof typedData === \"string\" ? JSON.parse(typedData) : typedData;\n const result = await client.signTypedData({\n username: user.username,\n accountAddress: user.address,\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 accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n };\n }\n if (!payload.username) {\n throw new Error(\"Username required for signed intents. Set a username first.\");\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 user = await ensureUser();\n if (!user.username) {\n throw new Error(\"Username required to fetch assets. Set a username first.\");\n }\n const clientId = client.getClientId();\n const response = await fetch(\n `${client.getProviderUrl()}/api/users/${encodeURIComponent(user.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"],"mappings":"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","names":["data","chainId","options"]}
@@ -874,6 +874,21 @@ declare class OneAuthClient {
874
874
  connectWithModal(options?: {
875
875
  theme?: ThemeConfig;
876
876
  }): Promise<ConnectResult>;
877
+ /**
878
+ * Open the account management dialog.
879
+ *
880
+ * Shows the account overview with guardian status and recovery setup
881
+ * options. The dialog closes when the user clicks the X button or
882
+ * completes their action.
883
+ *
884
+ * @example
885
+ * ```typescript
886
+ * await client.openAccountDialog();
887
+ * ```
888
+ */
889
+ openAccountDialog(options?: {
890
+ theme?: ThemeConfig;
891
+ }): Promise<void>;
877
892
  /**
878
893
  * Check if a user has already granted consent for the requested fields.
879
894
  * This is a read-only check — no dialog is shown.
@@ -874,6 +874,21 @@ declare class OneAuthClient {
874
874
  connectWithModal(options?: {
875
875
  theme?: ThemeConfig;
876
876
  }): Promise<ConnectResult>;
877
+ /**
878
+ * Open the account management dialog.
879
+ *
880
+ * Shows the account overview with guardian status and recovery setup
881
+ * options. The dialog closes when the user clicks the X button or
882
+ * completes their action.
883
+ *
884
+ * @example
885
+ * ```typescript
886
+ * await client.openAccountDialog();
887
+ * ```
888
+ */
889
+ openAccountDialog(options?: {
890
+ theme?: ThemeConfig;
891
+ }): Promise<void>;
877
892
  /**
878
893
  * Check if a user has already granted consent for the requested fields.
879
894
  * This is a read-only check — no dialog is shown.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { O as OneAuthClient, I as IntentSigner, W as WebAuthnSignature, a as IntentCall, S as SendIntentResult } from './client-CHCVV9H3.mjs';
2
- export { A as AuthResult, j as AuthenticateOptions, k as AuthenticateResult, B as BalanceRequirement, a0 as BatchIntentItem, a3 as BatchIntentItemResult, Y as CheckConsentOptions, Z as CheckConsentResult, F as CloseOnStatus, i as ConnectResult, X as ConsentData, V as ConsentField, C as CreateSigningRequestResponse, D as DeveloperSignedIntent, q as EIP712Domain, s as EIP712TypeField, r as EIP712Types, E as EmbedOptions, H as ExecuteIntentResponse, K as IntentHistoryItem, J as IntentHistoryOptions, L as IntentHistoryResult, x as IntentQuote, y as IntentStatus, v as IntentTokenRequest, z as OrchestratorStatus, h as PasskeyCredential, P as PasskeyProviderConfig, a5 as PrepareBatchIntentResponse, G as PrepareIntentResponse, a4 as PreparedBatchIntent, _ as RequestConsentOptions, $ as RequestConsentResult, a1 as SendBatchIntentOptions, a2 as SendBatchIntentResult, w as SendIntentOptions, M as SendSwapOptions, N as SendSwapResult, m as SignMessageOptions, n as SignMessageResult, o as SignTypedDataOptions, p as SignTypedDataResult, e as SigningError, f as SigningErrorCode, b as SigningRequestOptions, g as SigningRequestStatus, c as SigningResult, l as SigningResultBase, d as SigningSuccess, Q as SwapQuote, R as ThemeConfig, T as TransactionAction, u as TransactionDetails, t as TransactionFees, U as UserPasskeysResponse } from './client-CHCVV9H3.mjs';
3
- export { O as OneAuthProvider, a as OneAuthProviderOptions, c as createOneAuthProvider } from './provider-B5pLvKo_.mjs';
1
+ import { O as OneAuthClient, I as IntentSigner, W as WebAuthnSignature, a as IntentCall, S as SendIntentResult } from './client-hZxAAhcl.mjs';
2
+ export { A as AuthResult, j as AuthenticateOptions, k as AuthenticateResult, B as BalanceRequirement, a0 as BatchIntentItem, a3 as BatchIntentItemResult, Y as CheckConsentOptions, Z as CheckConsentResult, F as CloseOnStatus, i as ConnectResult, X as ConsentData, V as ConsentField, C as CreateSigningRequestResponse, D as DeveloperSignedIntent, q as EIP712Domain, s as EIP712TypeField, r as EIP712Types, E as EmbedOptions, H as ExecuteIntentResponse, K as IntentHistoryItem, J as IntentHistoryOptions, L as IntentHistoryResult, x as IntentQuote, y as IntentStatus, v as IntentTokenRequest, z as OrchestratorStatus, h as PasskeyCredential, P as PasskeyProviderConfig, a5 as PrepareBatchIntentResponse, G as PrepareIntentResponse, a4 as PreparedBatchIntent, _ as RequestConsentOptions, $ as RequestConsentResult, a1 as SendBatchIntentOptions, a2 as SendBatchIntentResult, w as SendIntentOptions, M as SendSwapOptions, N as SendSwapResult, m as SignMessageOptions, n as SignMessageResult, o as SignTypedDataOptions, p as SignTypedDataResult, e as SigningError, f as SigningErrorCode, b as SigningRequestOptions, g as SigningRequestStatus, c as SigningResult, l as SigningResultBase, d as SigningSuccess, Q as SwapQuote, R as ThemeConfig, T as TransactionAction, u as TransactionDetails, t as TransactionFees, U as UserPasskeysResponse } from './client-hZxAAhcl.mjs';
3
+ export { O as OneAuthProvider, a as OneAuthProviderOptions, c as createOneAuthProvider } from './provider-B9GKBMC5.mjs';
4
4
  import { Address, LocalAccount, Chain, Transport, Hex, WalletClient, Hash } from 'viem';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import * as React from 'react';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { O as OneAuthClient, I as IntentSigner, W as WebAuthnSignature, a as IntentCall, S as SendIntentResult } from './client-CHCVV9H3.js';
2
- export { A as AuthResult, j as AuthenticateOptions, k as AuthenticateResult, B as BalanceRequirement, a0 as BatchIntentItem, a3 as BatchIntentItemResult, Y as CheckConsentOptions, Z as CheckConsentResult, F as CloseOnStatus, i as ConnectResult, X as ConsentData, V as ConsentField, C as CreateSigningRequestResponse, D as DeveloperSignedIntent, q as EIP712Domain, s as EIP712TypeField, r as EIP712Types, E as EmbedOptions, H as ExecuteIntentResponse, K as IntentHistoryItem, J as IntentHistoryOptions, L as IntentHistoryResult, x as IntentQuote, y as IntentStatus, v as IntentTokenRequest, z as OrchestratorStatus, h as PasskeyCredential, P as PasskeyProviderConfig, a5 as PrepareBatchIntentResponse, G as PrepareIntentResponse, a4 as PreparedBatchIntent, _ as RequestConsentOptions, $ as RequestConsentResult, a1 as SendBatchIntentOptions, a2 as SendBatchIntentResult, w as SendIntentOptions, M as SendSwapOptions, N as SendSwapResult, m as SignMessageOptions, n as SignMessageResult, o as SignTypedDataOptions, p as SignTypedDataResult, e as SigningError, f as SigningErrorCode, b as SigningRequestOptions, g as SigningRequestStatus, c as SigningResult, l as SigningResultBase, d as SigningSuccess, Q as SwapQuote, R as ThemeConfig, T as TransactionAction, u as TransactionDetails, t as TransactionFees, U as UserPasskeysResponse } from './client-CHCVV9H3.js';
3
- export { O as OneAuthProvider, a as OneAuthProviderOptions, c as createOneAuthProvider } from './provider-DzxXGyV8.js';
1
+ import { O as OneAuthClient, I as IntentSigner, W as WebAuthnSignature, a as IntentCall, S as SendIntentResult } from './client-hZxAAhcl.js';
2
+ export { A as AuthResult, j as AuthenticateOptions, k as AuthenticateResult, B as BalanceRequirement, a0 as BatchIntentItem, a3 as BatchIntentItemResult, Y as CheckConsentOptions, Z as CheckConsentResult, F as CloseOnStatus, i as ConnectResult, X as ConsentData, V as ConsentField, C as CreateSigningRequestResponse, D as DeveloperSignedIntent, q as EIP712Domain, s as EIP712TypeField, r as EIP712Types, E as EmbedOptions, H as ExecuteIntentResponse, K as IntentHistoryItem, J as IntentHistoryOptions, L as IntentHistoryResult, x as IntentQuote, y as IntentStatus, v as IntentTokenRequest, z as OrchestratorStatus, h as PasskeyCredential, P as PasskeyProviderConfig, a5 as PrepareBatchIntentResponse, G as PrepareIntentResponse, a4 as PreparedBatchIntent, _ as RequestConsentOptions, $ as RequestConsentResult, a1 as SendBatchIntentOptions, a2 as SendBatchIntentResult, w as SendIntentOptions, M as SendSwapOptions, N as SendSwapResult, m as SignMessageOptions, n as SignMessageResult, o as SignTypedDataOptions, p as SignTypedDataResult, e as SigningError, f as SigningErrorCode, b as SigningRequestOptions, g as SigningRequestStatus, c as SigningResult, l as SigningResultBase, d as SigningSuccess, Q as SwapQuote, R as ThemeConfig, T as TransactionAction, u as TransactionDetails, t as TransactionFees, U as UserPasskeysResponse } from './client-hZxAAhcl.js';
3
+ export { O as OneAuthProvider, a as OneAuthProviderOptions, c as createOneAuthProvider } from './provider-A89sCgGr.js';
4
4
  import { Address, LocalAccount, Chain, Transport, Hex, WalletClient, Hash } from 'viem';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import * as React from 'react';
package/dist/index.js CHANGED
@@ -97,7 +97,7 @@ function applyChainFilters(chainIds, options) {
97
97
  if (!includeTestnets) {
98
98
  filtered = filtered.filter((chainId) => !isTestnet(chainId));
99
99
  }
100
- if (allowlist && allowlist.length > 0) {
100
+ if (allowlist) {
101
101
  const allowed = new Set(allowlist);
102
102
  filtered = filtered.filter((chainId) => allowed.has(chainId));
103
103
  }
@@ -385,6 +385,53 @@ var OneAuthClient = class {
385
385
  }
386
386
  return this.waitForConnectResponse(dialog, iframe, cleanup);
387
387
  }
388
+ /**
389
+ * Open the account management dialog.
390
+ *
391
+ * Shows the account overview with guardian status and recovery setup
392
+ * options. The dialog closes when the user clicks the X button or
393
+ * completes their action.
394
+ *
395
+ * @example
396
+ * ```typescript
397
+ * await client.openAccountDialog();
398
+ * ```
399
+ */
400
+ async openAccountDialog(options) {
401
+ const dialogUrl = this.getDialogUrl();
402
+ const params = new URLSearchParams({
403
+ mode: "iframe"
404
+ });
405
+ const themeParams = this.getThemeParams(options?.theme);
406
+ if (themeParams) {
407
+ const themeParsed = new URLSearchParams(themeParams);
408
+ themeParsed.forEach((value, key) => params.set(key, value));
409
+ }
410
+ const url = `${dialogUrl}/dialog/account?${params.toString()}`;
411
+ const { dialog, iframe, cleanup } = this.createModalDialog(url);
412
+ const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {
413
+ mode: "iframe"
414
+ });
415
+ if (!ready) return;
416
+ const dialogOrigin = this.getDialogOrigin();
417
+ return new Promise((resolve) => {
418
+ const handleMessage = (event) => {
419
+ if (event.origin !== dialogOrigin) return;
420
+ if (event.data?.type === "PASSKEY_CLOSE" || event.data?.type === "PASSKEY_DISCONNECT") {
421
+ window.removeEventListener("message", handleMessage);
422
+ dialog.removeEventListener("close", handleClose);
423
+ cleanup();
424
+ resolve();
425
+ }
426
+ };
427
+ const handleClose = () => {
428
+ window.removeEventListener("message", handleMessage);
429
+ resolve();
430
+ };
431
+ window.addEventListener("message", handleMessage);
432
+ dialog.addEventListener("close", handleClose);
433
+ });
434
+ }
388
435
  /**
389
436
  * Check if a user has already granted consent for the requested fields.
390
437
  * This is a read-only check — no dialog is shown.
@@ -680,10 +727,13 @@ var OneAuthClient = class {
680
727
  const themeParams = this.getThemeParams();
681
728
  const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ""}`;
682
729
  const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);
683
- const [prepareResult, dialogResult] = await Promise.all([
684
- this.prepareIntent(requestBody),
685
- this.waitForDialogReadyDeferred(dialog, iframe, cleanup)
686
- ]);
730
+ const dialogOrigin = this.getDialogOrigin();
731
+ let earlyPrepareResult = null;
732
+ const preparePromise = this.prepareIntent(requestBody).then((r) => {
733
+ earlyPrepareResult = r;
734
+ return r;
735
+ });
736
+ const dialogResult = await this.waitForDialogReadyDeferred(dialog, iframe, cleanup);
687
737
  if (!dialogResult.ready) {
688
738
  return {
689
739
  success: false,
@@ -692,40 +742,85 @@ var OneAuthClient = class {
692
742
  error: { code: "USER_CANCELLED", message: "User closed the dialog" }
693
743
  };
694
744
  }
695
- if (!prepareResult.success) {
696
- this.sendPrepareError(iframe, prepareResult.error.message);
697
- await this.waitForDialogClose(dialog, cleanup);
698
- return {
699
- success: false,
700
- intentId: "",
701
- status: "failed",
702
- error: prepareResult.error
745
+ let currentInitPayload;
746
+ if (earlyPrepareResult) {
747
+ const prepareResult = earlyPrepareResult;
748
+ if (!prepareResult.success) {
749
+ this.sendPrepareError(iframe, prepareResult.error.message);
750
+ await this.waitForDialogClose(dialog, cleanup);
751
+ return {
752
+ success: false,
753
+ intentId: "",
754
+ status: "failed",
755
+ error: prepareResult.error
756
+ };
757
+ }
758
+ prepareResponse = prepareResult.data;
759
+ currentInitPayload = {
760
+ mode: "iframe",
761
+ calls,
762
+ chainId: targetChain,
763
+ transaction: prepareResponse.transaction,
764
+ challenge: prepareResponse.challenge,
765
+ username,
766
+ accountAddress: prepareResponse.accountAddress,
767
+ originMessages: prepareResponse.originMessages,
768
+ tokenRequests: serializedTokenRequests,
769
+ expiresAt: prepareResponse.expiresAt,
770
+ userId: prepareResponse.userId,
771
+ intentOp: prepareResponse.intentOp,
772
+ digestResult: prepareResponse.digestResult,
773
+ tier: prepareResult.tier
774
+ };
775
+ dialogResult.sendInit(currentInitPayload);
776
+ } else {
777
+ currentInitPayload = {
778
+ mode: "iframe",
779
+ calls,
780
+ chainId: targetChain,
781
+ username,
782
+ accountAddress: options.accountAddress,
783
+ tokenRequests: serializedTokenRequests
784
+ };
785
+ dialogResult.sendInit(currentInitPayload);
786
+ const prepareResult = await preparePromise;
787
+ if (!prepareResult.success) {
788
+ this.sendPrepareError(iframe, prepareResult.error.message);
789
+ await this.waitForDialogClose(dialog, cleanup);
790
+ return {
791
+ success: false,
792
+ intentId: "",
793
+ status: "failed",
794
+ error: prepareResult.error
795
+ };
796
+ }
797
+ prepareResponse = prepareResult.data;
798
+ currentInitPayload = {
799
+ mode: "iframe",
800
+ calls,
801
+ chainId: targetChain,
802
+ transaction: prepareResponse.transaction,
803
+ challenge: prepareResponse.challenge,
804
+ username,
805
+ accountAddress: prepareResponse.accountAddress,
806
+ originMessages: prepareResponse.originMessages,
807
+ tokenRequests: serializedTokenRequests,
808
+ expiresAt: prepareResponse.expiresAt,
809
+ userId: prepareResponse.userId,
810
+ intentOp: prepareResponse.intentOp,
811
+ digestResult: prepareResponse.digestResult,
812
+ tier: prepareResult.tier
703
813
  };
814
+ iframe.contentWindow?.postMessage(
815
+ { type: "PASSKEY_INIT", ...currentInitPayload, fullViewport: true },
816
+ dialogOrigin
817
+ );
704
818
  }
705
- prepareResponse = prepareResult.data;
706
- const dialogOrigin = this.getDialogOrigin();
707
- const initPayload = {
708
- mode: "iframe",
709
- calls,
710
- chainId: targetChain,
711
- transaction: prepareResponse.transaction,
712
- challenge: prepareResponse.challenge,
713
- username,
714
- accountAddress: prepareResponse.accountAddress,
715
- originMessages: prepareResponse.originMessages,
716
- tokenRequests: serializedTokenRequests,
717
- expiresAt: prepareResponse.expiresAt,
718
- userId: prepareResponse.userId,
719
- intentOp: prepareResponse.intentOp,
720
- digestResult: prepareResponse.digestResult,
721
- tier: prepareResult.tier
722
- };
723
- dialogResult.sendInit(initPayload);
724
819
  const handleReReady = (event) => {
725
820
  if (event.origin !== dialogOrigin) return;
726
821
  if (event.data?.type === "PASSKEY_READY") {
727
822
  iframe.contentWindow?.postMessage(
728
- { type: "PASSKEY_INIT", ...initPayload, fullViewport: true },
823
+ { type: "PASSKEY_INIT", ...currentInitPayload, fullViewport: true },
729
824
  dialogOrigin
730
825
  );
731
826
  }
@@ -1014,10 +1109,13 @@ var OneAuthClient = class {
1014
1109
  const themeParams = this.getThemeParams();
1015
1110
  const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ""}`;
1016
1111
  const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);
1017
- const [prepareResult, dialogResult] = await Promise.all([
1018
- this.prepareBatchIntent(requestBody),
1019
- this.waitForDialogReadyDeferred(dialog, iframe, cleanup)
1020
- ]);
1112
+ const dialogOrigin = this.getDialogOrigin();
1113
+ let earlyBatchResult = null;
1114
+ const preparePromise = this.prepareBatchIntent(requestBody).then((r) => {
1115
+ earlyBatchResult = r;
1116
+ return r;
1117
+ });
1118
+ const dialogResult = await this.waitForDialogReadyDeferred(dialog, iframe, cleanup);
1021
1119
  if (!dialogResult.ready) {
1022
1120
  return {
1023
1121
  success: false,
@@ -1026,7 +1124,8 @@ var OneAuthClient = class {
1026
1124
  failureCount: 0
1027
1125
  };
1028
1126
  }
1029
- if (!prepareResult.success) {
1127
+ let currentBatchPayload;
1128
+ const handleBatchPrepareFailure = async (prepareResult) => {
1030
1129
  const failedIntents = prepareResult.failedIntents;
1031
1130
  const failureResults = failedIntents?.map((f) => ({
1032
1131
  index: f.index,
@@ -1044,27 +1143,68 @@ var OneAuthClient = class {
1044
1143
  failureCount: failureResults.length,
1045
1144
  error: prepareResult.error
1046
1145
  };
1047
- }
1048
- let prepareResponse = prepareResult.data;
1049
- const dialogOrigin = this.getDialogOrigin();
1050
- const batchInitPayload = {
1051
- mode: "iframe",
1052
- batchMode: true,
1053
- batchIntents: prepareResponse.intents,
1054
- batchFailedIntents: prepareResponse.failedIntents,
1055
- challenge: prepareResponse.challenge,
1056
- username: options.username,
1057
- accountAddress: prepareResponse.accountAddress,
1058
- userId: prepareResponse.userId,
1059
- expiresAt: prepareResponse.expiresAt,
1060
- tier: prepareResult.tier
1061
1146
  };
1062
- dialogResult.sendInit(batchInitPayload);
1147
+ let prepareResponse;
1148
+ if (earlyBatchResult) {
1149
+ const prepareResult = earlyBatchResult;
1150
+ if (!prepareResult.success) {
1151
+ return handleBatchPrepareFailure(prepareResult);
1152
+ }
1153
+ prepareResponse = prepareResult.data;
1154
+ currentBatchPayload = {
1155
+ mode: "iframe",
1156
+ batchMode: true,
1157
+ batchIntents: prepareResponse.intents,
1158
+ batchFailedIntents: prepareResponse.failedIntents,
1159
+ challenge: prepareResponse.challenge,
1160
+ username: options.username,
1161
+ accountAddress: prepareResponse.accountAddress,
1162
+ userId: prepareResponse.userId,
1163
+ expiresAt: prepareResponse.expiresAt,
1164
+ tier: prepareResult.tier
1165
+ };
1166
+ dialogResult.sendInit(currentBatchPayload);
1167
+ } else {
1168
+ currentBatchPayload = {
1169
+ mode: "iframe",
1170
+ batchMode: true,
1171
+ batchIntents: serializedIntents.map((intent, idx) => ({
1172
+ index: idx,
1173
+ targetChain: intent.targetChain,
1174
+ calls: JSON.stringify(intent.calls)
1175
+ // No: transaction, intentOp, expiresAt, originMessages
1176
+ })),
1177
+ username: options.username,
1178
+ accountAddress: options.accountAddress
1179
+ };
1180
+ dialogResult.sendInit(currentBatchPayload);
1181
+ const prepareResult = await preparePromise;
1182
+ if (!prepareResult.success) {
1183
+ return handleBatchPrepareFailure(prepareResult);
1184
+ }
1185
+ prepareResponse = prepareResult.data;
1186
+ currentBatchPayload = {
1187
+ mode: "iframe",
1188
+ batchMode: true,
1189
+ batchIntents: prepareResponse.intents,
1190
+ batchFailedIntents: prepareResponse.failedIntents,
1191
+ challenge: prepareResponse.challenge,
1192
+ username: options.username,
1193
+ accountAddress: prepareResponse.accountAddress,
1194
+ userId: prepareResponse.userId,
1195
+ expiresAt: prepareResponse.expiresAt,
1196
+ tier: prepareResult.tier
1197
+ };
1198
+ iframe.contentWindow?.postMessage(
1199
+ { type: "PASSKEY_INIT", ...currentBatchPayload, fullViewport: true },
1200
+ dialogOrigin
1201
+ );
1202
+ }
1063
1203
  const handleBatchReReady = (event) => {
1064
1204
  if (event.origin !== dialogOrigin) return;
1065
1205
  if (event.data?.type === "PASSKEY_READY") {
1066
1206
  iframe.contentWindow?.postMessage(
1067
- { type: "PASSKEY_INIT", ...batchInitPayload, fullViewport: true },
1207
+ { type: "PASSKEY_INIT", ...currentBatchPayload, fullViewport: true },
1068
1208
  dialogOrigin
1069
1209
  );
1070
1210
  }
@@ -1802,16 +1942,8 @@ var OneAuthClient = class {
1802
1942
  const themeParams = this.getThemeParams(options?.theme);
1803
1943
  const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ""}`;
1804
1944
  const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);
1805
- const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {
1806
- mode: "iframe",
1807
- message: options.message,
1808
- challenge: options.challenge || options.message,
1809
- username: options.username,
1810
- accountAddress: options.accountAddress,
1811
- description: options.description,
1812
- metadata: options.metadata
1813
- });
1814
- if (!ready) {
1945
+ const dialogResult = await this.waitForDialogReadyDeferred(dialog, iframe, cleanup);
1946
+ if (!dialogResult.ready) {
1815
1947
  return {
1816
1948
  success: false,
1817
1949
  error: {
@@ -1820,7 +1952,29 @@ var OneAuthClient = class {
1820
1952
  }
1821
1953
  };
1822
1954
  }
1955
+ const initPayload = {
1956
+ mode: "iframe",
1957
+ message: options.message,
1958
+ challenge: options.challenge || options.message,
1959
+ username: options.username,
1960
+ accountAddress: options.accountAddress,
1961
+ description: options.description,
1962
+ metadata: options.metadata
1963
+ };
1964
+ dialogResult.sendInit(initPayload);
1965
+ const dialogOrigin = this.getDialogOrigin();
1966
+ const handleReReady = (event) => {
1967
+ if (event.origin !== dialogOrigin) return;
1968
+ if (event.data?.type === "PASSKEY_READY") {
1969
+ iframe.contentWindow?.postMessage(
1970
+ { type: "PASSKEY_INIT", ...initPayload, fullViewport: true },
1971
+ dialogOrigin
1972
+ );
1973
+ }
1974
+ };
1975
+ window.addEventListener("message", handleReReady);
1823
1976
  const signingResult = await this.waitForSigningResponse(dialog, iframe, cleanup);
1977
+ window.removeEventListener("message", handleReReady);
1824
1978
  cleanup();
1825
1979
  if (signingResult.success) {
1826
1980
  return {
@@ -1888,7 +2042,17 @@ var OneAuthClient = class {
1888
2042
  const themeParams = this.getThemeParams(options?.theme);
1889
2043
  const signingUrl = `${dialogUrl}/dialog/sign?mode=iframe${themeParams ? `&${themeParams}` : ""}`;
1890
2044
  const { dialog, iframe, cleanup } = this.createModalDialog(signingUrl);
1891
- const ready = await this.waitForDialogReady(dialog, iframe, cleanup, {
2045
+ const dialogResult = await this.waitForDialogReadyDeferred(dialog, iframe, cleanup);
2046
+ if (!dialogResult.ready) {
2047
+ return {
2048
+ success: false,
2049
+ error: {
2050
+ code: "USER_REJECTED",
2051
+ message: "User closed the dialog"
2052
+ }
2053
+ };
2054
+ }
2055
+ const initPayload = {
1892
2056
  mode: "iframe",
1893
2057
  signingMode: "typedData",
1894
2058
  typedData: {
@@ -1901,17 +2065,21 @@ var OneAuthClient = class {
1901
2065
  username: options.username,
1902
2066
  accountAddress: options.accountAddress,
1903
2067
  description: options.description
1904
- });
1905
- if (!ready) {
1906
- return {
1907
- success: false,
1908
- error: {
1909
- code: "USER_REJECTED",
1910
- message: "User closed the dialog"
1911
- }
1912
- };
1913
- }
2068
+ };
2069
+ dialogResult.sendInit(initPayload);
2070
+ const dialogOrigin = this.getDialogOrigin();
2071
+ const handleReReady = (event) => {
2072
+ if (event.origin !== dialogOrigin) return;
2073
+ if (event.data?.type === "PASSKEY_READY") {
2074
+ iframe.contentWindow?.postMessage(
2075
+ { type: "PASSKEY_INIT", ...initPayload, fullViewport: true },
2076
+ dialogOrigin
2077
+ );
2078
+ }
2079
+ };
2080
+ window.addEventListener("message", handleReReady);
1914
2081
  const signingResult = await this.waitForSigningResponse(dialog, iframe, cleanup);
2082
+ window.removeEventListener("message", handleReReady);
1915
2083
  cleanup();
1916
2084
  if (signingResult.success) {
1917
2085
  return {
@@ -2315,8 +2483,10 @@ var OneAuthClient = class {
2315
2483
  const hideOverlay = () => {
2316
2484
  if (overlayHidden) return;
2317
2485
  overlayHidden = true;
2318
- overlay.style.display = "none";
2319
2486
  iframe.style.opacity = "1";
2487
+ requestAnimationFrame(() => {
2488
+ overlay.style.display = "none";
2489
+ });
2320
2490
  };
2321
2491
  const handleMessage = (event) => {
2322
2492
  if (event.origin !== hostUrl.origin) return;
@@ -2892,11 +3062,7 @@ function createOneAuthProvider(options) {
2892
3062
  if (typeof value === "number") return Math.trunc(value).toString();
2893
3063
  if (typeof value === "string") {
2894
3064
  if (value.startsWith("0x")) {
2895
- try {
2896
- return BigInt(value).toString();
2897
- } catch {
2898
- return "0";
2899
- }
3065
+ return BigInt(value).toString();
2900
3066
  }
2901
3067
  return value;
2902
3068
  }
@@ -3891,7 +4057,8 @@ function BatchQueueWidget({ onSignAll }) {
3891
4057
  var import_viem7 = require("viem");
3892
4058
  var ETHEREUM_MESSAGE_PREFIX = "Ethereum Signed Message:\n";
3893
4059
  function hashMessage2(message) {
3894
- const prefixed = ETHEREUM_MESSAGE_PREFIX + message.length.toString() + message;
4060
+ const messageBytes = (0, import_viem7.toBytes)(message);
4061
+ const prefixed = ETHEREUM_MESSAGE_PREFIX + messageBytes.length.toString() + message;
3895
4062
  return (0, import_viem7.keccak256)((0, import_viem7.toBytes)(prefixed));
3896
4063
  }
3897
4064
  function verifyMessageHash(message, signedHash) {