@rhinestone/1auth 0.7.5 → 0.7.6

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.
@@ -17,12 +17,14 @@ function createOneAuthProvider(options) {
17
17
  let chainId = options.chainId;
18
18
  const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;
19
19
  const listeners = /* @__PURE__ */ new Map();
20
+ let sessionOverride;
20
21
  const emit = (event, ...args) => {
21
22
  const set = listeners.get(event);
22
23
  if (!set) return;
23
24
  for (const listener of set) listener(...args);
24
25
  };
25
26
  const getStoredUser = () => {
27
+ if (sessionOverride !== void 0) return sessionOverride;
26
28
  if (typeof window === "undefined") return null;
27
29
  try {
28
30
  const raw = localStorage.getItem(storageKey);
@@ -62,10 +64,28 @@ function createOneAuthProvider(options) {
62
64
  return [address];
63
65
  };
64
66
  const disconnect = async () => {
67
+ sessionOverride = void 0;
65
68
  clearStoredUser();
66
69
  emit("accountsChanged", []);
67
70
  emit("disconnect");
68
71
  };
72
+ const setSession = (session) => {
73
+ if (!session) {
74
+ sessionOverride = void 0;
75
+ clearStoredUser();
76
+ emit("accountsChanged", []);
77
+ emit("disconnect");
78
+ return;
79
+ }
80
+ sessionOverride = {
81
+ address: session.address,
82
+ signerType: session.signerType,
83
+ connectorId: session.connectorId
84
+ };
85
+ setStoredUser(sessionOverride);
86
+ emit("accountsChanged", [session.address]);
87
+ emit("connect", { chainId: numberToHex(chainId) });
88
+ };
69
89
  const ensureUser = async () => {
70
90
  const stored = getStoredUser();
71
91
  if (stored) return stored;
@@ -275,10 +295,49 @@ function createOneAuthProvider(options) {
275
295
  }
276
296
  return list;
277
297
  };
298
+ const eoaBatches = /* @__PURE__ */ new Map();
299
+ const sendCallsEoa = async (params, address) => {
300
+ const validated = injectEoaSigner("wallet_sendCalls", params, address);
301
+ const payload = Array.isArray(validated) ? validated[0] : {};
302
+ const calls = Array.isArray(payload.calls) ? payload.calls : [];
303
+ if (!calls.length) throw new Error("No calls provided");
304
+ const batchChainId = payload.chainId;
305
+ const hashes = [];
306
+ for (const raw of calls) {
307
+ const call = raw || {};
308
+ const tx = { from: address, to: call.to };
309
+ if (call.data !== void 0) tx.data = call.data;
310
+ if (call.value !== void 0) tx.value = call.value;
311
+ const callChain = call.chainId ?? batchChainId;
312
+ if (callChain !== void 0) tx.chainId = callChain;
313
+ const hash = await forwardToWallet("eth_sendTransaction", [tx], address);
314
+ hashes.push(String(hash));
315
+ }
316
+ const id = hashes[hashes.length - 1];
317
+ eoaBatches.set(id, hashes);
318
+ return id;
319
+ };
320
+ const getCallsStatusEoa = (callsId) => {
321
+ if (!callsId || typeof callsId !== "string") {
322
+ throw new Error("callsId is required");
323
+ }
324
+ const hashes = eoaBatches.get(callsId) ?? [callsId];
325
+ return {
326
+ status: "CONFIRMED",
327
+ receipts: hashes.map((transactionHash) => ({ transactionHash }))
328
+ };
329
+ };
278
330
  const request = async ({ method, params }) => {
279
331
  if (EOA_FORWARDED_METHODS.has(method)) {
280
332
  const user = await ensureUser();
281
333
  if (user.signerType === "eoa") {
334
+ if (method === "wallet_sendCalls") {
335
+ return sendCallsEoa(params, user.address);
336
+ }
337
+ if (method === "wallet_getCallsStatus") {
338
+ const list = Array.isArray(params) ? params : [];
339
+ return getCallsStatusEoa(list[0]);
340
+ }
282
341
  return forwardToWallet(
283
342
  method,
284
343
  injectEoaSigner(method, params, user.address),
@@ -495,11 +554,12 @@ function createOneAuthProvider(options) {
495
554
  set.delete(listener);
496
555
  if (set.size === 0) listeners.delete(event);
497
556
  },
498
- disconnect
557
+ disconnect,
558
+ setSession
499
559
  };
500
560
  }
501
561
 
502
562
  export {
503
563
  createOneAuthProvider
504
564
  };
505
- //# sourceMappingURL=chunk-6MUQKHAT.mjs.map
565
+ //# sourceMappingURL=chunk-E4YZS7FZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider.ts"],"sourcesContent":["/**\n * EIP-1193 JSON-RPC provider factory for the 1auth passkey authentication system.\n *\n * Creates a browser-side provider object that implements the EIP-1193 standard so any\n * Ethereum library (ethers, viem, wagmi) can use 1auth passkey signing and cross-chain\n * intent execution without modification. All transaction signing is delegated to the\n * passkey service rather than holding private keys in the browser.\n *\n * Supported RPC methods:\n * - eth_chainId, eth_accounts, eth_requestAccounts\n * - personal_sign, eth_sign, eth_signTypedData, eth_signTypedData_v4\n * - eth_sendTransaction\n * - wallet_connect, wallet_disconnect, wallet_switchEthereumChain\n * - wallet_sendCalls, wallet_getCallsStatus, wallet_getCallsHistory (EIP-5792)\n * - wallet_getCapabilities, wallet_getAssets\n *\n * @module\n */\n\nimport {\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, IntentTokenRequest, SignerType } 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 address: Address;\n /** Absent = legacy passkey user; populated on new sessions. */\n signerType?: SignerType;\n /** Wagmi connector id for EOA sessions. Iframe-side lookup uses this. */\n connectorId?: string;\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 * Bind the active session in-memory and persist it to `localStorage`.\n *\n * Used by {@link createOneAuthConnection} to hand a freshly connected session\n * to the provider the instant `connect()` resolves — before the app has\n * written `1auth-user` itself. This closes a race where a provider built right\n * after connect would read stale/empty storage and default an EOA session to\n * passkey intents. Passing `null` clears the session (same effect as\n * `disconnect()` minus the events).\n *\n * Existing `createOneAuthProvider` consumers never call this, so their\n * behavior is unchanged: `getStoredUser` falls back to the localStorage read.\n */\n setSession: (\n session:\n | { address: Address; signerType?: SignerType; connectorId?: string }\n | null,\n ) => 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};\n\nconst DEFAULT_STORAGE_KEY = \"1auth-user\";\n\n/**\n * Creates an EIP-1193 compatible JSON-RPC provider backed by 1auth passkey authentication.\n *\n * The returned provider object can be used anywhere a standard Ethereum provider is\n * accepted (e.g. passed to `createWalletClient` in viem, used as `window.ethereum`, or\n * supplied to ethers.js `BrowserProvider`). Connection state (the account address) is\n * persisted in `localStorage` under the configured `storageKey`.\n *\n * @param options - Provider configuration\n * @param options.client - Configured `OneAuthClient` instance used to open auth/sign dialogs\n * @param options.chainId - Default chain ID the provider reports via `eth_chainId`\n * @param options.storageKey - localStorage key for persisting the connected user.\n * Defaults to `\"1auth-user\"`. Override to support multiple concurrent connections.\n * @param options.closeOn - Controls when the signing dialog closes and shows the \"Done\" button.\n * `\"preconfirmed\"` (default) closes as soon as the intent is confirmed by the orchestrator.\n * The `waitForHash` option independently controls whether the SDK continues polling for\n * a transaction hash after the dialog closes.\n * @param options.waitForHash - When true, polls the intent status until a transaction hash\n * is available before resolving `eth_sendTransaction` / `wallet_sendCalls`. Defaults to true.\n * @param options.hashTimeoutMs - Maximum milliseconds to wait for a transaction hash.\n * Passed directly to the passkey service intent submission.\n * @param options.hashIntervalMs - Polling interval in milliseconds when waiting for a hash.\n * Passed directly to the passkey service intent submission.\n * @returns An EIP-1193 provider with `request`, `on`, `removeListener`, and `disconnect`.\n *\n * @example\n * ```typescript\n * import { OneAuthClient } from \"@rhinestone/1auth\";\n * import { createOneAuthProvider } from \"@rhinestone/1auth\";\n *\n * const client = new OneAuthClient({ clientId: \"my-app\" });\n * const provider = createOneAuthProvider({ client, chainId: 8453 }); // Base\n *\n * // Use with viem\n * import { createWalletClient, custom } from \"viem\";\n * import { base } from \"viem/chains\";\n * const walletClient = createWalletClient({ chain: base, transport: custom(provider) });\n *\n * // Standard EIP-1193 usage\n * const accounts = await provider.request({ method: \"eth_requestAccounts\" });\n * provider.on(\"accountsChanged\", (accounts) => console.log(accounts));\n * ```\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 // In-memory session override. When set (via setSession), it takes precedence\n // over the localStorage read so a just-connected provider immediately knows\n // whether it's driving an EOA (forward to wallet, no intents) or a passkey\n // (intents). `undefined` = not bound → fall back to localStorage.\n //\n // Cleared to `undefined` (never pinned to a \"signed out\" sentinel) on\n // disconnect/setSession(null): those also wipe localStorage, so falling back\n // to the (now empty) storage yields null anyway — and it lets the built-in\n // connect() path repopulate via setStoredUser without a stale override\n // shadowing it. Pinning it null here would break reconnect for plain\n // createOneAuthProvider consumers.\n let sessionOverride: StoredUser | undefined;\n\n /**\n * Dispatches an event to all registered listeners for the given event name.\n *\n * @param event - EIP-1193 event name (e.g. \"accountsChanged\", \"chainChanged\")\n * @param args - Arguments forwarded to each listener callback\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 /**\n * Reads the connected user from localStorage.\n *\n * Returns null in non-browser environments (SSR) and when no user has been\n * persisted yet, or when the stored value is malformed.\n *\n * @returns The stored user object, or null if unavailable\n */\n const getStoredUser = (): StoredUser | null => {\n // A set in-memory binding wins over storage (so a just-connected session\n // routes correctly before the app persists it). `undefined` = unbound, so\n // read from storage — this is also the state after disconnect, letting the\n // built-in connect() repopulate storage and be seen on the next call.\n if (sessionOverride !== undefined) return sessionOverride;\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 /**\n * Persists the connected user to localStorage.\n *\n * No-ops in non-browser (SSR) environments.\n *\n * @param user - User object with at minimum an `address` field\n */\n const setStoredUser = (user: StoredUser) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(storageKey, JSON.stringify(user));\n };\n\n /**\n * Removes the connected user from localStorage, effectively logging them out\n * from the provider's perspective.\n *\n * No-ops in non-browser (SSR) environments.\n */\n const clearStoredUser = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(storageKey);\n };\n\n /**\n * Connects the user by returning a cached address or opening the auth flow.\n *\n * Returns the dapp-side cached address immediately when present. Otherwise\n * opens the auth modal (`/dialog/auth`) directly — the iframe-side\n * returning-user UX lives inside that flow now. On success the address is\n * stored in localStorage and `accountsChanged` / `connect` events are emitted.\n *\n * @returns Array containing the single connected account address\n * @throws If the user cancels or authentication fails\n */\n const connect = async (): Promise<Address[]> => {\n const stored = getStoredUser();\n if (stored) {\n return [stored.address];\n }\n\n const authResult = await client.authWithModal();\n if (!authResult.success) {\n throw new Error(authResult.error?.message || \"Authentication failed\");\n }\n const address = authResult.user?.address;\n const signerType = authResult.signerType;\n\n if (!address) {\n throw new Error(\"No account address available\");\n }\n\n setStoredUser({ address, signerType });\n emit(\"accountsChanged\", [address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n return [address];\n };\n\n /**\n * Disconnects the current user by clearing persisted state and emitting events.\n *\n * Emits `accountsChanged` with an empty array and `disconnect` so that consumers\n * (e.g. wagmi) can update their state accordingly.\n */\n const disconnect = async () => {\n sessionOverride = undefined;\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n };\n\n /**\n * Bind (or clear) the active session in memory and mirror it to localStorage.\n * See {@link OneAuthProvider.setSession}.\n */\n const setSession = (\n session:\n | { address: Address; signerType?: SignerType; connectorId?: string }\n | null,\n ) => {\n if (!session) {\n sessionOverride = undefined;\n clearStoredUser();\n emit(\"accountsChanged\", []);\n emit(\"disconnect\");\n return;\n }\n sessionOverride = {\n address: session.address,\n signerType: session.signerType,\n connectorId: session.connectorId,\n };\n setStoredUser(sessionOverride);\n emit(\"accountsChanged\", [session.address]);\n emit(\"connect\", { chainId: numberToHex(chainId) });\n };\n\n /**\n * Returns the currently connected user, triggering the connect flow if needed.\n *\n * Used internally by methods that require an authenticated session (e.g. signing,\n * sending transactions) to guarantee a user is available before proceeding.\n *\n * @returns The stored user object with at minimum an `address` field\n * @throws If connecting fails and no address can be resolved\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 /**\n * Read an optional wallet_getAssets account address override from RPC params.\n */\n const getAssetsAccountAddress = (\n assetsParams?: unknown[] | Record<string, unknown>,\n ): string | undefined => {\n const raw = Array.isArray(assetsParams) ? assetsParams[0] : assetsParams;\n if (typeof raw === \"string\" && raw.trim()) return raw.trim();\n if (!raw || typeof raw !== \"object\") return undefined;\n\n const request = raw as Record<string, unknown>;\n const candidates = [\n request.accountAddress,\n request.address,\n ];\n for (const candidate of candidates) {\n if (typeof candidate === \"string\" && candidate.trim()) {\n return candidate.trim();\n }\n }\n return undefined;\n };\n\n /**\n * Parses a chain ID value that may arrive as a hex string, decimal string, or number.\n *\n * Handles both `\"0x1\"` (hex) and `\"1\"` / `1` (decimal) representations that are\n * commonly mixed across different wallet_switchEthereumChain implementations.\n *\n * @param value - The raw chain ID value from RPC params\n * @returns The numeric chain ID, or undefined if the value cannot be parsed\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 /**\n * Normalizes a transaction value to a decimal string expected by the intent service.\n *\n * Handles the various formats callers may provide: `bigint`, `number`, hex strings\n * (e.g. `\"0x38d7ea4c68000\"`), or plain decimal strings. Returns undefined for null\n * or unsupported types, allowing callers to fall back to `\"0\"`.\n *\n * @param value - Raw value from an RPC transaction param\n * @returns Decimal string representation, or undefined if the input is not usable\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 /**\n * Converts raw EIP-1193 call objects into the strongly-typed `IntentCall` format\n * expected by the passkey service.\n *\n * Fills in missing `data` with `\"0x\"` and missing `value` with `\"0\"` so the\n * intent service never receives undefined fields.\n *\n * @param calls - Raw call objects from `wallet_sendCalls` or `eth_sendTransaction` params\n * @returns Array of normalized `IntentCall` objects\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 icon: c.icon as string | undefined,\n abi: c.abi as readonly unknown[] | undefined,\n };\n });\n };\n\n /**\n * Converts raw token request objects into the typed `IntentTokenRequest` format.\n *\n * Token requests allow callers to specify which tokens and amounts should be sourced\n * when funding a cross-chain intent (e.g. \"bridge 10 USDC from Optimism to Base\").\n * Accepts bigint or string/numeric amounts and normalizes them to bigint.\n *\n * @param requests - Raw token request array from RPC params, or a non-array value\n * @returns Array of typed token requests, or undefined if input is not an array\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 /**\n * Decodes a message that may be hex-encoded into a human-readable string.\n *\n * Some signers (e.g. MetaMask) encode plain-text messages as hex before passing them\n * to `personal_sign`. This helper reverses that encoding so users see the original\n * text in the signing dialog rather than a raw hex string.\n *\n * @param value - A plain string or hex-encoded string (`\"0x...\"`)\n * @returns The decoded UTF-8 string, or the original value if decoding fails\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 /**\n * Forwards a raw EIP-1193 request to the iframe at `/dialog/sign-eoa`, which\n * delegates to the active wagmi connector. The wallet's own prompt is the\n * review screen — no in-dialog review step for EOA sessions.\n */\n const forwardToWallet = async (\n method: string,\n params?: unknown[] | Record<string, unknown>,\n expectedAddress?: Address,\n ): Promise<unknown> => {\n const result = await client.requestWithWallet({\n method,\n params,\n expectedAddress,\n });\n if (!result.success) {\n const err = new Error(result.error.message);\n (err as Error & { code?: string }).code = result.error.code;\n throw err;\n }\n return result.result;\n };\n\n /**\n * EIP-1193 methods forwarded verbatim to the EOA connector. All other methods\n * (eth_accounts, eth_chainId, wallet_connect, wallet_disconnect,\n * wallet_switchEthereumChain, wallet_getCapabilities/Assets) are handled\n * locally against the stored session even for EOA sessions.\n */\n const EOA_FORWARDED_METHODS = new Set([\n \"personal_sign\",\n \"eth_sign\",\n \"eth_signTypedData\",\n \"eth_signTypedData_v3\",\n \"eth_signTypedData_v4\",\n \"eth_sendTransaction\",\n \"wallet_sendCalls\",\n \"wallet_getCallsStatus\",\n ]);\n\n /**\n * Signs an arbitrary string message via the passkey service.\n *\n * Ensures a user session exists before delegating to `OneAuthClient.signMessage`.\n * The raw WebAuthn signature components are ABI-encoded for ERC-1271 on-chain\n * verification before being returned.\n *\n * @param message - Plain-text message to sign\n * @returns ABI-encoded WebAuthn signature as a hex string\n * @throws If no user session is available or the signing dialog is cancelled\n */\n const signMessage = async (message: string) => {\n const user = await ensureUser();\n if (!user.address) {\n throw new Error(\"Account address required for signing.\");\n }\n const result = await client.signMessage({\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 /**\n * Signs EIP-712 typed data via the passkey service.\n *\n * Accepts either a parsed typed-data object or a JSON string (as some libraries\n * serialize the payload before passing it through the provider). The raw WebAuthn\n * signature is ABI-encoded for ERC-1271 on-chain verification.\n *\n * @param typedData - EIP-712 typed data object or its JSON string representation\n * @returns ABI-encoded WebAuthn signature as a hex string\n * @throws If no user session is available or the signing dialog is cancelled\n */\n const signTypedData = async (typedData: unknown) => {\n const user = await ensureUser();\n if (!user.address) {\n throw new Error(\"Account address required for signing.\");\n }\n const data =\n typeof typedData === \"string\" ? JSON.parse(typedData) : typedData;\n const result = await client.signTypedData({\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 /**\n * Extracts the fields required by `OneAuthClient.sendIntent` from a richer payload.\n *\n * This thin wrapper makes it explicit which fields travel to the intent service and\n * which are local concerns (e.g. `sourceChainId` is handled at the call site).\n *\n * @param payload - Full intent payload including user identity and transaction data\n * @returns Subset of fields forwarded to the intent service\n */\n const resolveIntentPayload = (payload: {\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n }) => ({\n accountAddress: payload.accountAddress,\n targetChain: payload.targetChain,\n calls: payload.calls,\n tokenRequests: payload.tokenRequests,\n });\n\n /**\n * Submits a cross-chain intent through the passkey service and returns the intent ID.\n *\n * Opens the signing dialog, waits for user confirmation, then polls the orchestrator\n * until a transaction hash is available (controlled by `waitForHash` and the timeout\n * options). The returned intent ID is used as the `callsId` in EIP-5792 responses.\n *\n * The dialog closes based on `closeOn` (defaults to `\"preconfirmed\"`). The `waitForHash`\n * option independently polls for a transaction hash after the dialog closes.\n *\n * @param payload - Intent details including target chain, calls, token requests, and\n * an optional `sourceChainId` for cross-chain bridging\n * @returns The orchestrator intent ID string\n * @throws If the user rejects the signing dialog or the intent fails\n */\n const sendIntent = async (payload: {\n accountAddress: Address;\n targetChain: number;\n calls: IntentCall[];\n tokenRequests?: IntentTokenRequest[];\n sourceChainId?: number;\n }) => {\n const intentPayload = resolveIntentPayload(payload);\n const result = await client.sendIntent({\n ...intentPayload,\n tokenRequests: payload.tokenRequests,\n sourceChainId: payload.sourceChainId,\n closeOn: options.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 accountMismatchError = (): Error & { code?: string } => {\n const err = new Error(\n \"Requested signer does not match the active wallet connection.\",\n ) as Error & { code?: string };\n err.code = \"ACCOUNT_MISMATCH\";\n return err;\n };\n\n const sameAddress = (a: unknown, b: string): boolean =>\n typeof a === \"string\" && a.toLowerCase() === b.toLowerCase();\n\n /**\n * Some wallets (MetaMask, Rabby) reject `eth_sendTransaction` /\n * `wallet_sendCalls` / `personal_sign` / `eth_signTypedData_v4` when the\n * signer address is missing. The dapp doesn't know the EOA address, so the\n * SDK fills it in from the stored session.\n *\n * If the caller supplies a `from` (or address arg) that differs from the\n * connected EOA, we throw `ACCOUNT_MISMATCH` rather than letting the\n * caller's value win. A dapp asking the wallet to sign on behalf of a\n * different account than the user connected is a trust-boundary violation\n * — the user reviewed and approved exactly one address, not whatever the\n * dapp later substitutes.\n */\n const injectEoaSigner = (\n method: string,\n params: unknown[] | Record<string, unknown> | undefined,\n address: Address,\n ): unknown[] | Record<string, unknown> | undefined => {\n const list = Array.isArray(params) ? params.slice() : params;\n if (!Array.isArray(list)) return params;\n\n if (method === \"eth_sendTransaction\") {\n const first = (list[0] || {}) as Record<string, unknown>;\n if (first.from !== undefined && !sameAddress(first.from, address)) {\n throw accountMismatchError();\n }\n list[0] = { ...first, from: address };\n return list;\n }\n if (method === \"wallet_sendCalls\") {\n const first = (list[0] || {}) as Record<string, unknown>;\n if (first.from !== undefined && !sameAddress(first.from, address)) {\n throw accountMismatchError();\n }\n // EIP-5792 lets each call carry its own `from`. Validate every one —\n // a single mismatched call would otherwise sneak through unchecked.\n const calls = first.calls;\n if (Array.isArray(calls)) {\n for (const call of calls) {\n if (!call || typeof call !== \"object\") continue;\n const callFrom = (call as Record<string, unknown>).from;\n if (callFrom !== undefined && !sameAddress(callFrom, address)) {\n throw accountMismatchError();\n }\n }\n }\n list[0] = { ...first, from: address };\n return list;\n }\n if (method === \"personal_sign\") {\n // personal_sign(message, address) — fill address if absent.\n if (list[1] !== undefined && !sameAddress(list[1], address)) {\n throw accountMismatchError();\n }\n if (list[0] && list[1] === undefined) list[1] = address;\n return list;\n }\n if (\n method === \"eth_sign\" ||\n method === \"eth_signTypedData\" ||\n method === \"eth_signTypedData_v3\" ||\n method === \"eth_signTypedData_v4\"\n ) {\n // signTypedData(address, typedData) — fill address if absent.\n if (list[0] !== undefined && !sameAddress(list[0], address)) {\n throw accountMismatchError();\n }\n if (list[0] === undefined && list[1] !== undefined) list[0] = address;\n return list;\n }\n return list;\n };\n\n // EIP-5792 batches submitted on EOA sessions, keyed by the returned id so\n // wallet_getCallsStatus can answer without hitting the wallet (most EOA\n // wallets don't implement 5792). Lost on reload — getCallsStatus tolerates a\n // miss. ponytail: in-memory is fine; the id IS the last tx hash, so a caller\n // that lost the map can still fetch the receipt itself.\n const eoaBatches = new Map<string, string[]>();\n\n /**\n * EOA `wallet_sendCalls`: most EOA wallets don't implement EIP-5792, and an\n * EOA can't batch atomically anyway, so send each call as a sequential\n * `eth_sendTransaction` (the standard wagmi/RainbowKit fallback). Returns the\n * last tx hash as the batch id — matching the string-id shape the passkey\n * path returns.\n */\n const sendCallsEoa = async (\n params: unknown[] | Record<string, unknown> | undefined,\n address: Address,\n ): Promise<string> => {\n // Reuse injectEoaSigner for the account-mismatch validation, then decompose.\n const validated = injectEoaSigner(\"wallet_sendCalls\", params, address);\n const payload = (Array.isArray(validated) ? validated[0] : {}) as Record<string, unknown>;\n const calls = Array.isArray(payload.calls) ? payload.calls : [];\n if (!calls.length) throw new Error(\"No calls provided\");\n const batchChainId = payload.chainId;\n const hashes: string[] = [];\n for (const raw of calls) {\n const call = (raw || {}) as Record<string, unknown>;\n const tx: Record<string, unknown> = { from: address, to: call.to };\n if (call.data !== undefined) tx.data = call.data;\n if (call.value !== undefined) tx.value = call.value;\n const callChain = call.chainId ?? batchChainId;\n if (callChain !== undefined) tx.chainId = callChain;\n const hash = await forwardToWallet(\"eth_sendTransaction\", [tx], address);\n hashes.push(String(hash));\n }\n const id = hashes[hashes.length - 1];\n eoaBatches.set(id, hashes);\n return id;\n };\n\n /** EOA `wallet_getCallsStatus`: answer from the submitted hashes. */\n const getCallsStatusEoa = (callsId: unknown) => {\n if (!callsId || typeof callsId !== \"string\") {\n throw new Error(\"callsId is required\");\n }\n const hashes = eoaBatches.get(callsId) ?? [callsId];\n // CONFIRMED is submission-optimistic — eth_sendTransaction resolves on\n // submission, and we don't re-poll the chain here. Receipts carry the real\n // hashes; a caller wanting finality can watch them. ponytail: no receipt\n // watcher — the EOA's own wallet already showed the confirmation UI.\n return {\n status: \"CONFIRMED\",\n receipts: hashes.map((transactionHash) => ({ transactionHash })),\n };\n };\n\n const request = async ({ method, params }: ProviderRequest) => {\n // For sign/tx methods, resolve the user first — this opens the auth modal\n // on the very first call so we know the signerType before deciding\n // between the passkey path and forwarding to the wagmi connector. Local-\n // only methods (eth_accounts, eth_chainId, wallet_switchEthereumChain,\n // etc.) fall through to the switch below and read stored state directly.\n if (EOA_FORWARDED_METHODS.has(method)) {\n const user = await ensureUser();\n if (user.signerType === \"eoa\") {\n // EIP-5792 isn't universally supported by EOA wallets — handle the\n // batch methods locally instead of forwarding them blindly.\n if (method === \"wallet_sendCalls\") {\n return sendCallsEoa(params, user.address);\n }\n if (method === \"wallet_getCallsStatus\") {\n const list = Array.isArray(params) ? params : [];\n return getCallsStatusEoa(list[0]);\n }\n return forwardToWallet(\n method,\n injectEoaSigner(method, params, user.address),\n user.address,\n );\n }\n }\n\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 const stored = getStoredUser();\n if (stored?.signerType === \"eoa\") {\n await forwardToWallet(method, params, stored.address);\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 // personal_sign param order varies: some callers send [message, address],\n // others send [hexEncodedMessage, address]. When the first param is hex and\n // the second is a non-hex string we treat the second as the plain message\n // (MetaMask-style). Otherwise we always decode the first param.\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 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 accountAddress: user.address,\n targetChain,\n calls,\n tokenRequests,\n sourceChainId,\n });\n }\n case \"wallet_getCapabilities\": {\n const stored = getStoredUser();\n if (stored?.signerType === \"eoa\") {\n return {};\n }\n\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 // All supported chains advertise atomic batching, gasless transactions via\n // paymasters, and cross-chain auxiliary funds (EIP-5792 capability keys).\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 explicitAccountAddress = getAssetsAccountAddress(params);\n const user = explicitAccountAddress ? null : await ensureUser();\n // The portfolio endpoint resolves identifiers via resolveUserWhere,\n // and the current SDK account model is address-first. Explicit params\n // let app-level verified sessions query balances without relying on\n // the provider's localStorage cache, while connected EIP-1193 consumers\n // still work with no params.\n const accountAddress = explicitAccountAddress || user?.address;\n if (!accountAddress) {\n throw new Error(\"wallet_getAssets requires accountAddress or a connected account\");\n }\n return client.getAssets({ accountAddress: accountAddress as Address });\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 status strings.\n // Both \"failed\" and \"expired\" map to \"CONFIRMED\" because EIP-5792 uses receipts\n // (and a 0x0 status code) to communicate failure — there is no \"FAILED\" state.\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 // 0x1 = success, 0x0 = reverted/failed — mirrors EVM receipt status\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 setSession,\n };\n}\n"],"mappings":"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","names":["request","chainId","data","options"]}
@@ -1,4 +1,4 @@
1
- import { P as PasskeyProviderConfig, S as SponsorshipConfig, aa as ThemeConfig, a6 as GetAssetsOptions, a9 as AssetsResponse, v as AuthWithModalOptions, A as AuthResult, L as LoginWithModalOptions, w as CreateAccountWithModalOptions, y as ConnectResult, ad as CheckConsentOptions, ae as CheckConsentResult, af as RequestConsentOptions, ag as RequestConsentResult, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, z as AuthenticateOptions, B as AuthenticateResult, m as SigningRequestOptions, n as SigningResult, Y as SendIntentOptions, i as SendIntentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, a3 as IntentHistoryOptions, a5 as IntentHistoryResult, F as SignMessageOptions, G as SignMessageResult, J as SignTypedDataOptions, K as SignTypedDataResult, E as EmbedOptions, t as PasskeyCredential } from './types-CbhPRY5s.js';
1
+ import { P as PasskeyProviderConfig, S as SponsorshipConfig, T as ThemeConfig, a7 as GetAssetsOptions, aa as AssetsResponse, x as AuthWithModalOptions, A as AuthResult, L as LoginWithModalOptions, y as CreateAccountWithModalOptions, z as ConnectResult, ad as CheckConsentOptions, ae as CheckConsentResult, af as RequestConsentOptions, ag as RequestConsentResult, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, B as AuthenticateOptions, D as AuthenticateResult, o as SigningRequestOptions, p as SigningResult, _ as SendIntentOptions, j as SendIntentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, a4 as IntentHistoryOptions, a6 as IntentHistoryResult, G as SignMessageOptions, J as SignMessageResult, K as SignTypedDataOptions, M as SignTypedDataResult, E as EmbedOptions, v as PasskeyCredential } from './types-Dzm5lZK-.mjs';
2
2
 
3
3
  declare class OneAuthClient {
4
4
  private config;
@@ -301,6 +301,11 @@ declare class OneAuthClient {
301
301
  connect(options?: {
302
302
  theme?: ThemeConfig;
303
303
  oauthEnabled?: boolean;
304
+ /**
305
+ * Opt into "wallet as signer" mode for the auth-modal fallback — see
306
+ * {@link AuthWithModalOptions.eoaConnect}. Set by {@link createOneAuthConnection}.
307
+ */
308
+ eoaConnect?: boolean;
304
309
  }): Promise<ConnectResult>;
305
310
  /**
306
311
  * Open the account management dialog.
@@ -1,4 +1,4 @@
1
- import { P as PasskeyProviderConfig, S as SponsorshipConfig, aa as ThemeConfig, a6 as GetAssetsOptions, a9 as AssetsResponse, v as AuthWithModalOptions, A as AuthResult, L as LoginWithModalOptions, w as CreateAccountWithModalOptions, y as ConnectResult, ad as CheckConsentOptions, ae as CheckConsentResult, af as RequestConsentOptions, ag as RequestConsentResult, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, z as AuthenticateOptions, B as AuthenticateResult, m as SigningRequestOptions, n as SigningResult, Y as SendIntentOptions, i as SendIntentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, a3 as IntentHistoryOptions, a5 as IntentHistoryResult, F as SignMessageOptions, G as SignMessageResult, J as SignTypedDataOptions, K as SignTypedDataResult, E as EmbedOptions, t as PasskeyCredential } from './types-CbhPRY5s.mjs';
1
+ import { P as PasskeyProviderConfig, S as SponsorshipConfig, T as ThemeConfig, a7 as GetAssetsOptions, aa as AssetsResponse, x as AuthWithModalOptions, A as AuthResult, L as LoginWithModalOptions, y as CreateAccountWithModalOptions, z as ConnectResult, ad as CheckConsentOptions, ae as CheckConsentResult, af as RequestConsentOptions, ag as RequestConsentResult, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, B as AuthenticateOptions, D as AuthenticateResult, o as SigningRequestOptions, p as SigningResult, _ as SendIntentOptions, j as SendIntentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, a4 as IntentHistoryOptions, a6 as IntentHistoryResult, G as SignMessageOptions, J as SignMessageResult, K as SignTypedDataOptions, M as SignTypedDataResult, E as EmbedOptions, v as PasskeyCredential } from './types-Dzm5lZK-.js';
2
2
 
3
3
  declare class OneAuthClient {
4
4
  private config;
@@ -301,6 +301,11 @@ declare class OneAuthClient {
301
301
  connect(options?: {
302
302
  theme?: ThemeConfig;
303
303
  oauthEnabled?: boolean;
304
+ /**
305
+ * Opt into "wallet as signer" mode for the auth-modal fallback — see
306
+ * {@link AuthWithModalOptions.eoaConnect}. Set by {@link createOneAuthConnection}.
307
+ */
308
+ eoaConnect?: boolean;
304
309
  }): Promise<ConnectResult>;
305
310
  /**
306
311
  * Open the account management dialog.
@@ -1,5 +1,5 @@
1
- import { P as PasskeyProviderConfig, S as SponsorshipConfig, H as HeadlessIntentOptions, a as HeadlessPrepareResult, b as HeadlessSubmitOptions, c as HeadlessSubmitResult, d as HeadlessIntentStatusResult, I as InstallSmartSessionOptions, e as InstallSmartSessionResult, f as SessionKeyHandle } from './types-CbhPRY5s.mjs';
2
- export { g as SmartSessionEnableRequest } from './types-CbhPRY5s.mjs';
1
+ import { P as PasskeyProviderConfig, S as SponsorshipConfig, H as HeadlessIntentOptions, a as HeadlessPrepareResult, b as HeadlessSubmitOptions, c as HeadlessSubmitResult, d as HeadlessIntentStatusResult, I as InstallSmartSessionOptions, e as InstallSmartSessionResult, f as SessionKeyHandle } from './types-Dzm5lZK-.mjs';
2
+ export { g as SmartSessionEnableRequest } from './types-Dzm5lZK-.mjs';
3
3
  import * as _rhinestone_sdk from '@rhinestone/sdk';
4
4
  import { Hex, Address } from 'viem';
5
5
 
@@ -1,5 +1,5 @@
1
- import { P as PasskeyProviderConfig, S as SponsorshipConfig, H as HeadlessIntentOptions, a as HeadlessPrepareResult, b as HeadlessSubmitOptions, c as HeadlessSubmitResult, d as HeadlessIntentStatusResult, I as InstallSmartSessionOptions, e as InstallSmartSessionResult, f as SessionKeyHandle } from './types-CbhPRY5s.js';
2
- export { g as SmartSessionEnableRequest } from './types-CbhPRY5s.js';
1
+ import { P as PasskeyProviderConfig, S as SponsorshipConfig, H as HeadlessIntentOptions, a as HeadlessPrepareResult, b as HeadlessSubmitOptions, c as HeadlessSubmitResult, d as HeadlessIntentStatusResult, I as InstallSmartSessionOptions, e as InstallSmartSessionResult, f as SessionKeyHandle } from './types-Dzm5lZK-.js';
2
+ export { g as SmartSessionEnableRequest } from './types-Dzm5lZK-.js';
3
3
  import * as _rhinestone_sdk from '@rhinestone/sdk';
4
4
  import { Hex, Address } from 'viem';
5
5
 
package/dist/index.d.mts CHANGED
@@ -1,12 +1,13 @@
1
- import { O as OneAuthClient } from './client-BqKAd2RZ.mjs';
1
+ import { O as OneAuthClient } from './client-C8QSA1th.mjs';
2
2
  import { Abi, Address, LocalAccount, WalletClient, Hash } from 'viem';
3
3
  import { Permission } from '@rhinestone/sdk';
4
4
  export { Permission } from '@rhinestone/sdk';
5
- import { h as IntentCall, i as SendIntentResult } from './types-CbhPRY5s.mjs';
6
- export { a7 as AssetBalance, a8 as AssetBalanceBucket, a9 as AssetsResponse, u as AuthFlow, A as AuthResult, v as AuthWithModalOptions, z as AuthenticateOptions, B as AuthenticateResult, R as BalanceRequirement, ap as BatchIntentItem, as as BatchIntentItemResult, ad as CheckConsentOptions, ae as CheckConsentResult, a0 as CloseOnStatus, y as ConnectResult, ac as ConsentData, ab as ConsentField, w as CreateAccountWithModalOptions, C as CreateCrossChainPermissionInput, r as CreateSigningRequestResponse, k as CrossChainPermit, l as CrossChainSettlementLayer, M as EIP712Domain, O as EIP712TypeField, N as EIP712Types, E as EmbedOptions, a2 as ExecuteIntentResponse, a6 as GetAssetsOptions, an as GrantPermissionContractMetadata, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, a4 as IntentHistoryItem, a3 as IntentHistoryOptions, a5 as IntentHistoryResult, Z as IntentQuote, _ as IntentStatus, X as IntentTokenRequest, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, L as LoginWithModalOptions, ax as OneAuthTelemetryAttributeValue, ay as OneAuthTelemetryAttributes, az as OneAuthTelemetryConfig, aA as OneAuthTelemetryEvent, aB as OneAuthTelemetryEventName, aC as OneAuthTelemetryFlow, aD as OneAuthTelemetryTraceContext, $ as OrchestratorStatus, t as PasskeyCredential, P as PasskeyProviderConfig, au as PrepareBatchIntentResponse, a1 as PrepareIntentResponse, at as PreparedBatchIntent, af as RequestConsentOptions, ag as RequestConsentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, Y as SendIntentOptions, am as SessionGrantChain, al as SessionGrantRecord, F as SignMessageOptions, G as SignMessageResult, J as SignTypedDataOptions, K as SignTypedDataResult, x as SignerType, p as SigningError, q as SigningErrorCode, m as SigningRequestOptions, s as SigningRequestStatus, n as SigningResult, D as SigningResultBase, o as SigningSuccess, ao as SmartSessionPolicy, av as SponsorshipCallbackConfig, S as SponsorshipConfig, aw as SponsorshipUrlConfig, aa as ThemeConfig, T as TransactionAction, V as TransactionDetails, Q as TransactionFees, U as UserPasskeysResponse, W as WebAuthnSignature, j as createCrossChainPermission } from './types-CbhPRY5s.mjs';
7
- export { O as OneAuthProvider, a as OneAuthProviderOptions, c as createOneAuthProvider } from './provider-CRhZVLg8.mjs';
8
- import { P as PasskeyWalletClientConfig, S as SendCallsParams } from './verify-DVYDJgOS.mjs';
9
- export { C as ChainFilterOptions, E as ETHEREUM_MESSAGE_PREFIX, p as TokenConfig, T as TransactionCall, e as encodeWebAuthnSignature, b as getAllSupportedChainsAndTokens, f as getChainById, i as getChainExplorerUrl, j as getChainRpcUrl, g as getSupportedChainIds, a as getSupportedChains, d as getSupportedTokenSymbols, c as getSupportedTokens, l as getTokenAddress, n as getTokenDecimals, m as getTokenSymbol, h as hashCalls, q as hashMessage, k as isTestnet, o as isTokenAddressSupported, r as resolveTokenAddress, v as verifyMessageHash } from './verify-DVYDJgOS.mjs';
5
+ import { P as PasskeyProviderConfig, C as CloseOnStatus, T as ThemeConfig, h as SignerType, i as IntentCall, j as SendIntentResult } from './types-Dzm5lZK-.mjs';
6
+ export { a8 as AssetBalance, a9 as AssetBalanceBucket, aa as AssetsResponse, w as AuthFlow, A as AuthResult, x as AuthWithModalOptions, B as AuthenticateOptions, D as AuthenticateResult, X as BalanceRequirement, ap as BatchIntentItem, as as BatchIntentItemResult, ad as CheckConsentOptions, ae as CheckConsentResult, z as ConnectResult, ac as ConsentData, ab as ConsentField, y as CreateAccountWithModalOptions, l as CreateCrossChainPermissionInput, t as CreateSigningRequestResponse, m as CrossChainPermit, n as CrossChainSettlementLayer, N as EIP712Domain, Q as EIP712TypeField, O as EIP712Types, E as EmbedOptions, a3 as ExecuteIntentResponse, a7 as GetAssetsOptions, an as GrantPermissionContractMetadata, ah as GrantPermissionsOptions, ai as GrantPermissionsResult, a5 as IntentHistoryItem, a4 as IntentHistoryOptions, a6 as IntentHistoryResult, $ as IntentQuote, a0 as IntentStatus, Z as IntentTokenRequest, aj as ListSessionGrantsOptions, ak as ListSessionGrantsResult, L as LoginWithModalOptions, ax as OneAuthTelemetryAttributeValue, ay as OneAuthTelemetryAttributes, az as OneAuthTelemetryConfig, aA as OneAuthTelemetryEvent, aB as OneAuthTelemetryEventName, aC as OneAuthTelemetryFlow, aD as OneAuthTelemetryTraceContext, a1 as OrchestratorStatus, v as PasskeyCredential, au as PrepareBatchIntentResponse, a2 as PrepareIntentResponse, at as PreparedBatchIntent, af as RequestConsentOptions, ag as RequestConsentResult, aq as SendBatchIntentOptions, ar as SendBatchIntentResult, _ as SendIntentOptions, am as SessionGrantChain, al as SessionGrantRecord, G as SignMessageOptions, J as SignMessageResult, K as SignTypedDataOptions, M as SignTypedDataResult, r as SigningError, s as SigningErrorCode, o as SigningRequestOptions, u as SigningRequestStatus, p as SigningResult, F as SigningResultBase, q as SigningSuccess, ao as SmartSessionPolicy, av as SponsorshipCallbackConfig, S as SponsorshipConfig, aw as SponsorshipUrlConfig, R as TransactionAction, Y as TransactionDetails, V as TransactionFees, U as UserPasskeysResponse, W as WebAuthnSignature, k as createCrossChainPermission } from './types-Dzm5lZK-.mjs';
7
+ import { O as OneAuthProvider } from './provider-CJv38fIK.mjs';
8
+ export { a as OneAuthProviderOptions, c as createOneAuthProvider } from './provider-CJv38fIK.mjs';
9
+ import { P as PasskeyWalletClientConfig, S as SendCallsParams } from './verify-0VXQpQBJ.mjs';
10
+ export { C as ChainFilterOptions, E as ETHEREUM_MESSAGE_PREFIX, p as TokenConfig, T as TransactionCall, e as encodeWebAuthnSignature, b as getAllSupportedChainsAndTokens, f as getChainById, i as getChainExplorerUrl, j as getChainRpcUrl, g as getSupportedChainIds, a as getSupportedChains, d as getSupportedTokenSymbols, c as getSupportedTokens, l as getTokenAddress, n as getTokenDecimals, m as getTokenSymbol, h as hashCalls, q as hashMessage, k as isTestnet, o as isTokenAddressSupported, r as resolveTokenAddress, v as verifyMessageHash } from './verify-0VXQpQBJ.mjs';
10
11
  import * as react_jsx_runtime from 'react/jsx-runtime';
11
12
  import * as React from 'react';
12
13
 
@@ -67,6 +68,155 @@ interface DefinedPermissions<TAbi extends Abi = Abi> {
67
68
  */
68
69
  declare function definePermissions<const TAbi extends Abi>(config: DefinePermissionsConfig<TAbi>): DefinedPermissions<TAbi>;
69
70
 
71
+ /**
72
+ * One-call connect entry point for 1auth.
73
+ *
74
+ * `createOneAuthConnection` is the ergonomic front door for integrators who
75
+ * want a single function that:
76
+ * 1. opens the 1auth dialog so the user picks **1auth passkey** *or* a
77
+ * **traditional wallet** (WalletConnect / injected), and
78
+ * 2. hands back a ready-to-use EIP-1193 provider plus the connected
79
+ * `{ address, signerType }`.
80
+ *
81
+ * When the user picks a traditional wallet (an EOA), the returned provider
82
+ * forwards `eth_sendTransaction` / `personal_sign` / `signTypedData` /
83
+ * `wallet_sendCalls` straight to that wallet's native RPC — **no Rhinestone
84
+ * intents**. When they pick a passkey, transactions route through 1auth intents
85
+ * exactly as before. The app writes one downstream code path either way.
86
+ *
87
+ * This is purely additive: `OneAuthClient.connect()` and
88
+ * `createOneAuthProvider()` are unchanged and remain the lower-level building
89
+ * blocks this factory composes.
90
+ *
91
+ * @module
92
+ */
93
+
94
+ /**
95
+ * Provider-shaping options that apply on top of the passkey client config.
96
+ * Mirrors the relevant {@link createOneAuthProvider} options.
97
+ */
98
+ interface OneAuthConnectionOptions {
99
+ /**
100
+ * Chain the returned provider reports via `eth_chainId` and uses as the
101
+ * default intent target. Defaults to `8453` (Base). Ignored for EOA sessions
102
+ * beyond the reported chain id — an EOA transacts on whatever chain its
103
+ * wallet is on.
104
+ */
105
+ defaultChainId?: number;
106
+ /**
107
+ * localStorage key the session is persisted under. Defaults to `"1auth-user"`.
108
+ * Override only to run multiple independent connections on one origin.
109
+ */
110
+ storageKey?: string;
111
+ /** Forwarded to the provider for passkey intent sends. */
112
+ closeOn?: CloseOnStatus;
113
+ waitForHash?: boolean;
114
+ hashTimeoutMs?: number;
115
+ hashIntervalMs?: number;
116
+ /**
117
+ * Opt in to offering a **traditional wallet as the account signer**. When
118
+ * `true`, the dialog's wallet path connects the chosen EOA as the signer (a
119
+ * `signerType: "eoa"` session whose transactions bypass Rhinestone intents).
120
+ *
121
+ * **Defaults to `false`** — by default the app gets 1auth smart accounts +
122
+ * intents, and the wallet path (if the user picks it) still bootstraps a
123
+ * passkey account. Passkey selection is unaffected either way. Can be
124
+ * overridden per call via {@link OneAuthConnectOptions.eoaConnect}.
125
+ */
126
+ eoaConnect?: boolean;
127
+ }
128
+ /** Full config form: constructs the client for you. Only `clientId` is practically required. */
129
+ type OneAuthConnectionConfig = PasskeyProviderConfig & OneAuthConnectionOptions;
130
+ /** Reuse form: bring your own configured {@link OneAuthClient}. */
131
+ type OneAuthConnectionConfigWithClient = {
132
+ client: OneAuthClient;
133
+ } & OneAuthConnectionOptions;
134
+ /** Options accepted by {@link OneAuthConnection.connect}. */
135
+ interface OneAuthConnectOptions {
136
+ theme?: ThemeConfig;
137
+ /** Applies only to the auth-modal fallback path (email/OAuth entry). */
138
+ oauthEnabled?: boolean;
139
+ /**
140
+ * Per-call override of {@link OneAuthConnectionOptions.eoaConnect}. Defaults
141
+ * to the connection's config value (which itself defaults to `false`).
142
+ */
143
+ eoaConnect?: boolean;
144
+ }
145
+ /**
146
+ * The resolved session. Discriminated on `signerType` so callers can branch on
147
+ * EOA vs passkey with full type safety.
148
+ */
149
+ interface OneAuthSession {
150
+ /** `"eoa"` = traditional wallet (plain tx, no intents). `"passkey"` = 1auth smart account (intents). */
151
+ signerType: SignerType;
152
+ address: `0x${string}`;
153
+ /** The same {@link OneAuthProvider} instance exposed on the connection. */
154
+ provider: OneAuthProvider;
155
+ /** Chain id the provider reports (see {@link OneAuthConnectionOptions.defaultChainId}). */
156
+ chainId: number;
157
+ /** True when a returning user was reconnected with no visible UI. */
158
+ autoConnected: boolean;
159
+ }
160
+ /** Error thrown by {@link OneAuthConnection.connect} when the user cancels or auth fails. */
161
+ interface OneAuthConnectError {
162
+ code: string;
163
+ message: string;
164
+ }
165
+ /** The handle returned by {@link createOneAuthConnection}. */
166
+ interface OneAuthConnection {
167
+ /** The underlying client — escape hatch for `signMessage`, history, the account dialog, etc. */
168
+ client: OneAuthClient;
169
+ /** Ready-to-use EIP-1193 provider. Stable across reconnects. */
170
+ provider: OneAuthProvider;
171
+ /**
172
+ * Open the 1auth dialog so the user picks passkey OR a traditional wallet.
173
+ * Binds the resulting session to {@link OneAuthConnection.provider} before it
174
+ * resolves, so a send issued immediately after routes correctly.
175
+ *
176
+ * @throws {@link OneAuthConnectError} shape (`{ code, message }`) on cancel/failure.
177
+ */
178
+ connect: (options?: OneAuthConnectOptions) => Promise<OneAuthSession>;
179
+ /** Current session read from persisted state, or `null`. Never opens a dialog. */
180
+ getSession: () => OneAuthSession | null;
181
+ /** Clear the session and emit `accountsChanged([])` / `disconnect`. */
182
+ disconnect: () => Promise<void>;
183
+ /**
184
+ * Subscribe to session changes (connect/disconnect). Returns an unsubscribe
185
+ * function. Sugar over `provider.on("accountsChanged", …)`.
186
+ */
187
+ subscribe: (listener: (session: OneAuthSession | null) => void) => () => void;
188
+ }
189
+ /**
190
+ * Create a one-call 1auth connection.
191
+ *
192
+ * @example Zero-boilerplate
193
+ * ```typescript
194
+ * import { createOneAuthConnection } from "@rhinestone/1auth";
195
+ * import { createWalletClient, custom } from "viem";
196
+ * import { base } from "viem/chains";
197
+ *
198
+ * const conn = createOneAuthConnection({ clientId: "my-app" });
199
+ * const session = await conn.connect(); // user picks passkey OR wallet
200
+ *
201
+ * const walletClient = createWalletClient({
202
+ * account: session.address,
203
+ * chain: base,
204
+ * transport: custom(session.provider),
205
+ * });
206
+ * // Same call for both signer types; EOA bypasses intents, passkey uses them.
207
+ * await walletClient.sendTransaction({ to: "0x…", value: 1n });
208
+ * ```
209
+ *
210
+ * @example Reuse an existing client
211
+ * ```typescript
212
+ * const client = new OneAuthClient({ clientId: "my-app", sponsorship });
213
+ * const conn = createOneAuthConnection({ client, defaultChainId: 8453 });
214
+ * const { address, signerType, provider } = await conn.connect();
215
+ * ```
216
+ */
217
+ declare function createOneAuthConnection(config: OneAuthConnectionConfig): OneAuthConnection;
218
+ declare function createOneAuthConnection(config: OneAuthConnectionConfigWithClient): OneAuthConnection;
219
+
70
220
  /**
71
221
  * viem LocalAccount adapter for 1auth passkey-controlled smart accounts.
72
222
  *
@@ -280,4 +430,4 @@ interface BatchQueueWidgetProps {
280
430
  */
281
431
  declare function BatchQueueWidget({ onSignAll }: BatchQueueWidgetProps): react_jsx_runtime.JSX.Element | null;
282
432
 
283
- export { type BatchQueueContextValue, type BatchQueueIdentity, BatchQueueProvider, type BatchQueueProviderProps, BatchQueueWidget, type BatchQueueWidgetProps, type BatchedCall, type DefinePermissionsConfig, type DefinedPermissions, IntentCall, OneAuthClient, type PasskeyAccount, type PasskeyWalletClient, PasskeyWalletClientConfig, SendCallsParams, SendIntentResult, createPasskeyAccount, createPasskeyWalletClient, definePermissions, getChainName, useBatchQueue };
433
+ export { type BatchQueueContextValue, type BatchQueueIdentity, BatchQueueProvider, type BatchQueueProviderProps, BatchQueueWidget, type BatchQueueWidgetProps, type BatchedCall, CloseOnStatus, type DefinePermissionsConfig, type DefinedPermissions, IntentCall, OneAuthClient, type OneAuthConnectError, type OneAuthConnectOptions, type OneAuthConnection, type OneAuthConnectionConfig, type OneAuthConnectionConfigWithClient, type OneAuthConnectionOptions, OneAuthProvider, type OneAuthSession, type PasskeyAccount, PasskeyProviderConfig, type PasskeyWalletClient, PasskeyWalletClientConfig, SendCallsParams, SendIntentResult, SignerType, ThemeConfig, createOneAuthConnection, createPasskeyAccount, createPasskeyWalletClient, definePermissions, getChainName, useBatchQueue };