@rhinestone/1auth 0.7.8-dev.0 → 0.8.1

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.
Files changed (43) hide show
  1. package/dist/chunk-IX45E5LE.mjs +6135 -0
  2. package/dist/chunk-IX45E5LE.mjs.map +1 -0
  3. package/dist/chunk-ZDW2LY6H.mjs +116 -0
  4. package/dist/chunk-ZDW2LY6H.mjs.map +1 -0
  5. package/dist/{client-Dn6mL7BZ.d.ts → client-B0vb_deA.d.mts} +26 -14
  6. package/dist/{client-C8QSA1th.d.mts → client-CPt1hn4_.d.ts} +26 -14
  7. package/dist/errors-Blx9IVF_.d.mts +16 -0
  8. package/dist/errors-Cg605N0t.d.ts +16 -0
  9. package/dist/headless.d.mts +5 -10
  10. package/dist/headless.d.ts +5 -10
  11. package/dist/headless.js +74 -24
  12. package/dist/headless.js.map +1 -1
  13. package/dist/headless.mjs +74 -24
  14. package/dist/headless.mjs.map +1 -1
  15. package/dist/index.d.mts +8 -7
  16. package/dist/index.d.ts +8 -7
  17. package/dist/index.js +678 -220
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +68 -5271
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/{provider-CJv38fIK.d.mts → provider-CNDrBzGs.d.mts} +2 -2
  22. package/dist/{provider-BsVmPgkQ.d.ts → provider-DwZPA2N1.d.ts} +2 -2
  23. package/dist/react.d.mts +3 -2
  24. package/dist/react.d.ts +3 -2
  25. package/dist/react.js +61 -1
  26. package/dist/react.js.map +1 -1
  27. package/dist/react.mjs +6 -1
  28. package/dist/react.mjs.map +1 -1
  29. package/dist/server.d.mts +2 -2
  30. package/dist/server.d.ts +2 -2
  31. package/dist/{types-Dzm5lZK-.d.mts → types-BN6cCuAd.d.mts} +88 -69
  32. package/dist/{types-Dzm5lZK-.d.ts → types-BN6cCuAd.d.ts} +88 -69
  33. package/dist/{verify-0VXQpQBJ.d.mts → verify-CEzkfM92.d.mts} +1 -1
  34. package/dist/{verify-9UgxLSdo.d.ts → verify-DhEkGnym.d.ts} +1 -1
  35. package/dist/wagmi.d.mts +3 -3
  36. package/dist/wagmi.d.ts +3 -3
  37. package/dist/wagmi.js +116 -26
  38. package/dist/wagmi.js.map +1 -1
  39. package/dist/wagmi.mjs +3 -1
  40. package/dist/wagmi.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/chunk-E4YZS7FZ.mjs +0 -565
  43. package/dist/chunk-E4YZS7FZ.mjs.map +0 -1
package/dist/wagmi.mjs CHANGED
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  createOneAuthProvider
3
- } from "./chunk-E4YZS7FZ.mjs";
3
+ } from "./chunk-IX45E5LE.mjs";
4
+ import "./chunk-ZDW2LY6H.mjs";
5
+ import "./chunk-IIACVHR3.mjs";
4
6
  import "./chunk-N6KE5CII.mjs";
5
7
  import "./chunk-GUAI55LL.mjs";
6
8
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wagmi.ts"],"sourcesContent":["/**\n * Wagmi connector factory for 1auth passkey authentication.\n *\n * Wraps `createOneAuthProvider` in a wagmi-compatible connector so that\n * passkey-based accounts can participate in the full wagmi ecosystem:\n * `useAccount`, `useConnect`, `useSendTransaction`, hooks, and so on.\n *\n * Import path: `@rhinestone/1auth/wagmi`\n *\n * @module\n */\n\nimport { createConnector, type Connector } from \"@wagmi/core\";\nimport {\n numberToHex,\n type Address,\n type Chain,\n type ProviderConnectInfo,\n} from \"viem\";\nimport { createOneAuthProvider, type OneAuthProvider } from \"./provider\";\nimport type { OneAuthClient } from \"./client\";\n\nexport type OneAuthConnectorOptions = {\n client: OneAuthClient;\n chainId?: number;\n storageKey?: string;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n};\n\n/**\n * Creates a wagmi connector backed by 1auth passkey authentication.\n *\n * The connector lazily instantiates a single `OneAuthProvider` on the first call to\n * `getProvider()` and reuses it for the lifetime of the wagmi config. Event listeners\n * (`accountsChanged`, `chainChanged`, `disconnect`) are attached on connect and torn\n * down on disconnect to prevent memory leaks.\n *\n * @param options - Connector configuration\n * @param options.client - Configured `OneAuthClient` instance\n * @param options.chainId - Override the initial chain ID. When omitted the first chain\n * in the wagmi config's `chains` array is used.\n * @param options.storageKey - localStorage key for persisting the connected user.\n * Forwarded to `createOneAuthProvider`. Defaults to `\"1auth-user\"`.\n * @param options.waitForHash - When true, `sendTransaction` waits for a tx hash before\n * resolving. Forwarded to `createOneAuthProvider`. Defaults to true.\n * @param options.hashTimeoutMs - Maximum milliseconds to wait for a transaction hash.\n * @param options.hashIntervalMs - Polling interval when waiting for a hash.\n * @returns A wagmi connector factory function (pass directly to wagmi `createConfig`)\n *\n * @example\n * ```typescript\n * import { createConfig } from \"wagmi\";\n * import { base, optimism } from \"viem/chains\";\n * import { oneAuth } from \"@rhinestone/1auth/wagmi\";\n * import { OneAuthClient } from \"@rhinestone/1auth\";\n *\n * const client = new OneAuthClient({ clientId: \"my-app\" });\n *\n * export const wagmiConfig = createConfig({\n * chains: [base, optimism],\n * connectors: [\n * oneAuth({ client }),\n * ],\n * });\n * ```\n */\nexport function oneAuth(options: OneAuthConnectorOptions) {\n type Provider = OneAuthProvider;\n\n return createConnector<Provider>((wagmiConfig) => {\n const chains = (wagmiConfig.chains ?? []) as readonly [Chain, ...Chain[]];\n const initialChainId = options.chainId ?? chains[0]?.id;\n\n let provider: Provider | null = null;\n // Bound listener references held so they can be removed by name during disconnect\n let accountsChanged: Connector[\"onAccountsChanged\"] | undefined;\n let chainChanged: Connector[\"onChainChanged\"] | undefined;\n let connect: Connector[\"onConnect\"] | undefined;\n let disconnect: Connector[\"onDisconnect\"] | undefined;\n\n return {\n id: \"1auth\",\n name: \"1auth Passkey\",\n type: \"wallet\",\n\n /**\n * Connects the user and registers provider event listeners.\n *\n * On reconnect (`isReconnecting: true`) attempts to restore accounts from\n * localStorage silently before falling back to the connect modal. Switches to\n * the requested `chainId` if it differs from the provider's current chain.\n * Removes the one-time `connect` listener after the first connection so it is\n * not triggered again on subsequent reconnects.\n *\n * @param params.chainId - Optional chain to switch to after connecting\n * @param params.isReconnecting - True when wagmi is restoring a previous session\n * @param params.withCapabilities - When true, returns accounts with capability maps\n * @returns Connected accounts and the active chain ID\n * @throws If no chain is configured or the user cancels the auth flow\n */\n async connect<withCapabilities extends boolean = false>(\n { chainId, isReconnecting, withCapabilities }:\n | {\n chainId?: number;\n isReconnecting?: boolean;\n withCapabilities?: withCapabilities | boolean;\n }\n | undefined = {}\n ): Promise<{\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n }> {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n\n const provider = await this.getProvider({ chainId });\n let accounts: readonly Address[] = [];\n let currentChainId = await this.getChainId();\n\n if (isReconnecting) {\n accounts = await this.getAccounts().catch(() => []);\n }\n\n if (!accounts.length) {\n accounts = (await provider.request({\n method: \"wallet_connect\",\n })) as Address[];\n currentChainId = await this.getChainId();\n }\n\n if (chainId && currentChainId !== chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n currentChainId = await this.getChainId();\n }\n\n // Remove the one-time connect listener now that connection is established\n if (connect) {\n provider.removeListener(\"connect\", connect as never);\n connect = undefined;\n }\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n provider.on(\"accountsChanged\", accountsChanged as never);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n provider.on(\"chainChanged\", chainChanged as never);\n }\n if (!disconnect) {\n disconnect = this.onDisconnect.bind(this);\n provider.on(\"disconnect\", disconnect as never);\n }\n\n const response = withCapabilities\n ? {\n accounts: accounts.map((account) => ({\n address: account,\n capabilities: {},\n })),\n chainId: currentChainId,\n }\n : {\n accounts,\n chainId: currentChainId,\n };\n\n return response as unknown as {\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n };\n },\n\n /**\n * Disconnects the user and removes `chainChanged` / `disconnect` event listeners.\n *\n * The `accountsChanged` listener is intentionally left attached so that wagmi\n * receives the empty-accounts event emitted by the underlying provider's\n * `clearStoredUser` path.\n */\n async disconnect() {\n const provider = await this.getProvider();\n await provider.disconnect();\n if (chainChanged) {\n provider.removeListener(\"chainChanged\", chainChanged as never);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider.removeListener(\"disconnect\", disconnect as never);\n disconnect = undefined;\n }\n },\n\n /**\n * Returns the list of currently connected account addresses.\n *\n * Delegates to `eth_accounts` on the underlying provider, which reads from\n * localStorage without opening any dialogs.\n *\n * @returns Array of connected addresses (empty if not connected)\n */\n async getAccounts() {\n const provider = await this.getProvider();\n return (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n },\n\n /**\n * Returns the current chain ID as a number.\n *\n * Calls `eth_chainId` on the underlying provider and converts the hex result.\n *\n * @returns The numeric chain ID\n */\n async getChainId() {\n const provider = await this.getProvider();\n const hexChainId = (await provider.request({\n method: \"eth_chainId\",\n })) as string;\n return Number.parseInt(hexChainId, 16);\n },\n\n /**\n * Returns (and lazily creates) the underlying `OneAuthProvider` instance.\n *\n * The provider is a singleton per connector instance — created once and reused.\n * If a `chainId` argument is provided the provider switches to that chain before\n * returning.\n *\n * @param params.chainId - Optional chain ID to switch to before returning\n * @returns The singleton `OneAuthProvider`\n * @throws If no initial chain ID is configured\n */\n async getProvider({ chainId } = {}) {\n if (!provider) {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n provider = createOneAuthProvider({\n client: options.client,\n chainId: initialChainId,\n storageKey: options.storageKey,\n waitForHash: options.waitForHash,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n }\n if (chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n }\n return provider;\n },\n\n /**\n * Registers the one-time `connect` event listener used during initial setup.\n *\n * Called by wagmi during config initialization. Attaches `onConnect` to the\n * provider's `connect` event so that wagmi is notified if the user's session\n * is restored from localStorage before an explicit `connect()` call.\n */\n async setup() {\n const provider = await this.getProvider();\n if (!connect) {\n const onConnect = this.onConnect?.bind(this);\n if (onConnect) {\n connect = onConnect;\n provider.on(\"connect\", connect as never);\n }\n }\n },\n\n /**\n * Returns whether the connector has a valid stored session.\n *\n * Used by wagmi on startup to decide whether to attempt auto-reconnect.\n * Returns false (rather than throwing) if account resolution fails.\n *\n * @returns True if at least one account address is available\n */\n async isAuthorized() {\n try {\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n } catch {\n return false;\n }\n },\n\n /**\n * Switches the active chain on the underlying provider.\n *\n * Validates that the requested chain is present in the wagmi config before\n * issuing `wallet_switchEthereumChain` so that an informative error is thrown\n * rather than a silent failure.\n *\n * @param params.chainId - The numeric ID of the chain to switch to\n * @returns The `Chain` object from wagmi config for the new chain\n * @throws If the chain is not in the wagmi config's `chains` array\n */\n async switchChain({ chainId }) {\n const chain = chains.find((chain) => chain.id === chainId);\n if (!chain) {\n throw new Error(\"Chain not configured\");\n }\n const provider = await this.getProvider();\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n return chain;\n },\n\n /**\n * Handles the provider `connect` event and forwards it to wagmi's emitter.\n *\n * Called once during the initial connection handshake. Resolves the current\n * accounts and emits a wagmi `connect` event with both accounts and chain ID.\n *\n * @param connectInfo - EIP-1193 connect info containing the hex chain ID\n */\n async onConnect(connectInfo: ProviderConnectInfo) {\n const accounts = await this.getAccounts();\n if (!accounts.length) return;\n const chainId = Number(connectInfo.chainId);\n wagmiConfig.emitter.emit(\"connect\", { accounts, chainId });\n },\n\n /**\n * Handles the provider `accountsChanged` event and forwards it to wagmi.\n *\n * @param accounts - Updated list of account address strings\n */\n onAccountsChanged(accounts: string[]) {\n wagmiConfig.emitter.emit(\"change\", {\n accounts: accounts as Address[],\n });\n },\n\n /**\n * Handles the provider `chainChanged` event and forwards it to wagmi.\n *\n * @param chainId - The new chain ID as a hex string or decimal string\n */\n onChainChanged(chainId: string) {\n wagmiConfig.emitter.emit(\"change\", {\n chainId: Number(chainId),\n });\n },\n\n /**\n * Handles the provider `disconnect` event and forwards it to wagmi.\n *\n * @param _error - Optional error that caused the disconnection (unused)\n */\n onDisconnect(_error?: Error) {\n wagmiConfig.emitter.emit(\"disconnect\");\n },\n };\n });\n}\n"],"mappings":";;;;;;;AAYA,SAAS,uBAAuC;AAChD;AAAA,EACE;AAAA,OAIK;AAkDA,SAAS,QAAQ,SAAkC;AAGxD,SAAO,gBAA0B,CAAC,gBAAgB;AAChD,UAAM,SAAU,YAAY,UAAU,CAAC;AACvC,UAAM,iBAAiB,QAAQ,WAAW,OAAO,CAAC,GAAG;AAErD,QAAI,WAA4B;AAEhC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiBN,MAAM,QACJ,EAAE,SAAS,gBAAgB,iBAAiB,IAM5B,CAAC,GAMhB;AACD,YAAI,CAAC,gBAAgB;AACnB,gBAAM,IAAI,MAAM,yCAAyC;AAAA,QAC3D;AAEA,cAAMA,YAAW,MAAM,KAAK,YAAY,EAAE,QAAQ,CAAC;AACnD,YAAI,WAA+B,CAAC;AACpC,YAAI,iBAAiB,MAAM,KAAK,WAAW;AAE3C,YAAI,gBAAgB;AAClB,qBAAW,MAAM,KAAK,YAAY,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,QACpD;AAEA,YAAI,CAAC,SAAS,QAAQ;AACpB,qBAAY,MAAMA,UAAS,QAAQ;AAAA,YACjC,QAAQ;AAAA,UACV,CAAC;AACD,2BAAiB,MAAM,KAAK,WAAW;AAAA,QACzC;AAEA,YAAI,WAAW,mBAAmB,SAAS;AACzC,gBAAMA,UAAS,QAAQ;AAAA,YACrB,QAAQ;AAAA,YACR,QAAQ,CAAC,EAAE,SAAS,YAAY,OAAO,EAAE,CAAC;AAAA,UAC5C,CAAC;AACD,2BAAiB,MAAM,KAAK,WAAW;AAAA,QACzC;AAGA,YAAI,SAAS;AACX,UAAAA,UAAS,eAAe,WAAW,OAAgB;AACnD,oBAAU;AAAA,QACZ;AACA,YAAI,CAAC,iBAAiB;AACpB,4BAAkB,KAAK,kBAAkB,KAAK,IAAI;AAClD,UAAAA,UAAS,GAAG,mBAAmB,eAAwB;AAAA,QACzD;AACA,YAAI,CAAC,cAAc;AACjB,yBAAe,KAAK,eAAe,KAAK,IAAI;AAC5C,UAAAA,UAAS,GAAG,gBAAgB,YAAqB;AAAA,QACnD;AACA,YAAI,CAAC,YAAY;AACf,uBAAa,KAAK,aAAa,KAAK,IAAI;AACxC,UAAAA,UAAS,GAAG,cAAc,UAAmB;AAAA,QAC/C;AAEA,cAAM,WAAW,mBACb;AAAA,UACE,UAAU,SAAS,IAAI,CAAC,aAAa;AAAA,YACnC,SAAS;AAAA,YACT,cAAc,CAAC;AAAA,UACjB,EAAE;AAAA,UACF,SAAS;AAAA,QACX,IACA;AAAA,UACE;AAAA,UACA,SAAS;AAAA,QACX;AAEJ,eAAO;AAAA,MAMT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,aAAa;AACjB,cAAMA,YAAW,MAAM,KAAK,YAAY;AACxC,cAAMA,UAAS,WAAW;AAC1B,YAAI,cAAc;AAChB,UAAAA,UAAS,eAAe,gBAAgB,YAAqB;AAC7D,yBAAe;AAAA,QACjB;AACA,YAAI,YAAY;AACd,UAAAA,UAAS,eAAe,cAAc,UAAmB;AACzD,uBAAa;AAAA,QACf;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,cAAc;AAClB,cAAMA,YAAW,MAAM,KAAK,YAAY;AACxC,eAAQ,MAAMA,UAAS,QAAQ;AAAA,UAC7B,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,aAAa;AACjB,cAAMA,YAAW,MAAM,KAAK,YAAY;AACxC,cAAM,aAAc,MAAMA,UAAS,QAAQ;AAAA,UACzC,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,OAAO,SAAS,YAAY,EAAE;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,MAAM,YAAY,EAAE,QAAQ,IAAI,CAAC,GAAG;AAClC,YAAI,CAAC,UAAU;AACb,cAAI,CAAC,gBAAgB;AACnB,kBAAM,IAAI,MAAM,yCAAyC;AAAA,UAC3D;AACA,qBAAW,sBAAsB;AAAA,YAC/B,QAAQ,QAAQ;AAAA,YAChB,SAAS;AAAA,YACT,YAAY,QAAQ;AAAA,YACpB,aAAa,QAAQ;AAAA,YACrB,eAAe,QAAQ;AAAA,YACvB,gBAAgB,QAAQ;AAAA,UAC1B,CAAC;AAAA,QACH;AACA,YAAI,SAAS;AACX,gBAAM,SAAS,QAAQ;AAAA,YACrB,QAAQ;AAAA,YACR,QAAQ,CAAC,EAAE,SAAS,YAAY,OAAO,EAAE,CAAC;AAAA,UAC5C,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,QAAQ;AACZ,cAAMA,YAAW,MAAM,KAAK,YAAY;AACxC,YAAI,CAAC,SAAS;AACZ,gBAAM,YAAY,KAAK,WAAW,KAAK,IAAI;AAC3C,cAAI,WAAW;AACb,sBAAU;AACV,YAAAA,UAAS,GAAG,WAAW,OAAgB;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,eAAe;AACnB,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,YAAY;AACxC,iBAAO,SAAS,SAAS;AAAA,QAC3B,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,MAAM,YAAY,EAAE,QAAQ,GAAG;AAC7B,cAAM,QAAQ,OAAO,KAAK,CAACC,WAAUA,OAAM,OAAO,OAAO;AACzD,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AACA,cAAMD,YAAW,MAAM,KAAK,YAAY;AACxC,cAAMA,UAAS,QAAQ;AAAA,UACrB,QAAQ;AAAA,UACR,QAAQ,CAAC,EAAE,SAAS,YAAY,OAAO,EAAE,CAAC;AAAA,QAC5C,CAAC;AACD,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,UAAU,aAAkC;AAChD,cAAM,WAAW,MAAM,KAAK,YAAY;AACxC,YAAI,CAAC,SAAS,OAAQ;AACtB,cAAM,UAAU,OAAO,YAAY,OAAO;AAC1C,oBAAY,QAAQ,KAAK,WAAW,EAAE,UAAU,QAAQ,CAAC;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,kBAAkB,UAAoB;AACpC,oBAAY,QAAQ,KAAK,UAAU;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,eAAe,SAAiB;AAC9B,oBAAY,QAAQ,KAAK,UAAU;AAAA,UACjC,SAAS,OAAO,OAAO;AAAA,QACzB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAa,QAAgB;AAC3B,oBAAY,QAAQ,KAAK,YAAY;AAAA,MACvC;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["provider","chain"]}
1
+ {"version":3,"sources":["../src/wagmi.ts"],"sourcesContent":["/**\n * Wagmi connector factory for 1auth passkey authentication.\n *\n * Wraps `createOneAuthProvider` in a wagmi-compatible connector so that\n * passkey-based accounts can participate in the full wagmi ecosystem:\n * `useAccount`, `useConnect`, `useSendTransaction`, hooks, and so on.\n *\n * Import path: `@rhinestone/1auth/wagmi`\n *\n * @module\n */\n\nimport { createConnector, type Connector } from \"@wagmi/core\";\nimport {\n numberToHex,\n type Address,\n type Chain,\n type ProviderConnectInfo,\n} from \"viem\";\nimport { createOneAuthProvider, type OneAuthProvider } from \"./provider\";\nimport type { OneAuthClient } from \"./client\";\n\nexport type OneAuthConnectorOptions = {\n client: OneAuthClient;\n chainId?: number;\n storageKey?: string;\n waitForHash?: boolean;\n hashTimeoutMs?: number;\n hashIntervalMs?: number;\n};\n\n/**\n * Creates a wagmi connector backed by 1auth passkey authentication.\n *\n * The connector lazily instantiates a single `OneAuthProvider` on the first call to\n * `getProvider()` and reuses it for the lifetime of the wagmi config. Event listeners\n * (`accountsChanged`, `chainChanged`, `disconnect`) are attached on connect and torn\n * down on disconnect to prevent memory leaks.\n *\n * @param options - Connector configuration\n * @param options.client - Configured `OneAuthClient` instance\n * @param options.chainId - Override the initial chain ID. When omitted the first chain\n * in the wagmi config's `chains` array is used.\n * @param options.storageKey - localStorage key for persisting the connected user.\n * Forwarded to `createOneAuthProvider`. Defaults to `\"1auth-user\"`.\n * @param options.waitForHash - When true, `sendTransaction` waits for a tx hash before\n * resolving. Forwarded to `createOneAuthProvider`. Defaults to true.\n * @param options.hashTimeoutMs - Maximum milliseconds to wait for a transaction hash.\n * @param options.hashIntervalMs - Polling interval when waiting for a hash.\n * @returns A wagmi connector factory function (pass directly to wagmi `createConfig`)\n *\n * @example\n * ```typescript\n * import { createConfig } from \"wagmi\";\n * import { base, optimism } from \"viem/chains\";\n * import { oneAuth } from \"@rhinestone/1auth/wagmi\";\n * import { OneAuthClient } from \"@rhinestone/1auth\";\n *\n * const client = new OneAuthClient({ clientId: \"my-app\" });\n *\n * export const wagmiConfig = createConfig({\n * chains: [base, optimism],\n * connectors: [\n * oneAuth({ client }),\n * ],\n * });\n * ```\n */\nexport function oneAuth(options: OneAuthConnectorOptions) {\n type Provider = OneAuthProvider;\n\n return createConnector<Provider>((wagmiConfig) => {\n const chains = (wagmiConfig.chains ?? []) as readonly [Chain, ...Chain[]];\n const initialChainId = options.chainId ?? chains[0]?.id;\n\n let provider: Provider | null = null;\n // Bound listener references held so they can be removed by name during disconnect\n let accountsChanged: Connector[\"onAccountsChanged\"] | undefined;\n let chainChanged: Connector[\"onChainChanged\"] | undefined;\n let connect: Connector[\"onConnect\"] | undefined;\n let disconnect: Connector[\"onDisconnect\"] | undefined;\n\n return {\n id: \"1auth\",\n name: \"1auth Passkey\",\n type: \"wallet\",\n\n /**\n * Connects the user and registers provider event listeners.\n *\n * On reconnect (`isReconnecting: true`) attempts to restore accounts from\n * localStorage silently before falling back to the connect modal. Switches to\n * the requested `chainId` if it differs from the provider's current chain.\n * Removes the one-time `connect` listener after the first connection so it is\n * not triggered again on subsequent reconnects.\n *\n * @param params.chainId - Optional chain to switch to after connecting\n * @param params.isReconnecting - True when wagmi is restoring a previous session\n * @param params.withCapabilities - When true, returns accounts with capability maps\n * @returns Connected accounts and the active chain ID\n * @throws If no chain is configured or the user cancels the auth flow\n */\n async connect<withCapabilities extends boolean = false>(\n { chainId, isReconnecting, withCapabilities }:\n | {\n chainId?: number;\n isReconnecting?: boolean;\n withCapabilities?: withCapabilities | boolean;\n }\n | undefined = {}\n ): Promise<{\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n }> {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n\n const provider = await this.getProvider({ chainId });\n let accounts: readonly Address[] = [];\n let currentChainId = await this.getChainId();\n\n if (isReconnecting) {\n accounts = await this.getAccounts().catch(() => []);\n }\n\n if (!accounts.length) {\n accounts = (await provider.request({\n method: \"wallet_connect\",\n })) as Address[];\n currentChainId = await this.getChainId();\n }\n\n if (chainId && currentChainId !== chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n currentChainId = await this.getChainId();\n }\n\n // Remove the one-time connect listener now that connection is established\n if (connect) {\n provider.removeListener(\"connect\", connect as never);\n connect = undefined;\n }\n if (!accountsChanged) {\n accountsChanged = this.onAccountsChanged.bind(this);\n provider.on(\"accountsChanged\", accountsChanged as never);\n }\n if (!chainChanged) {\n chainChanged = this.onChainChanged.bind(this);\n provider.on(\"chainChanged\", chainChanged as never);\n }\n if (!disconnect) {\n disconnect = this.onDisconnect.bind(this);\n provider.on(\"disconnect\", disconnect as never);\n }\n\n const response = withCapabilities\n ? {\n accounts: accounts.map((account) => ({\n address: account,\n capabilities: {},\n })),\n chainId: currentChainId,\n }\n : {\n accounts,\n chainId: currentChainId,\n };\n\n return response as unknown as {\n accounts: withCapabilities extends true\n ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n : readonly Address[];\n chainId: number;\n };\n },\n\n /**\n * Disconnects the user and removes `chainChanged` / `disconnect` event listeners.\n *\n * The `accountsChanged` listener is intentionally left attached so that wagmi\n * receives the empty-accounts event emitted by the underlying provider's\n * `clearStoredUser` path.\n */\n async disconnect() {\n const provider = await this.getProvider();\n await provider.disconnect();\n if (chainChanged) {\n provider.removeListener(\"chainChanged\", chainChanged as never);\n chainChanged = undefined;\n }\n if (disconnect) {\n provider.removeListener(\"disconnect\", disconnect as never);\n disconnect = undefined;\n }\n },\n\n /**\n * Returns the list of currently connected account addresses.\n *\n * Delegates to `eth_accounts` on the underlying provider, which reads from\n * localStorage without opening any dialogs.\n *\n * @returns Array of connected addresses (empty if not connected)\n */\n async getAccounts() {\n const provider = await this.getProvider();\n return (await provider.request({\n method: \"eth_accounts\",\n })) as Address[];\n },\n\n /**\n * Returns the current chain ID as a number.\n *\n * Calls `eth_chainId` on the underlying provider and converts the hex result.\n *\n * @returns The numeric chain ID\n */\n async getChainId() {\n const provider = await this.getProvider();\n const hexChainId = (await provider.request({\n method: \"eth_chainId\",\n })) as string;\n return Number.parseInt(hexChainId, 16);\n },\n\n /**\n * Returns (and lazily creates) the underlying `OneAuthProvider` instance.\n *\n * The provider is a singleton per connector instance — created once and reused.\n * If a `chainId` argument is provided the provider switches to that chain before\n * returning.\n *\n * @param params.chainId - Optional chain ID to switch to before returning\n * @returns The singleton `OneAuthProvider`\n * @throws If no initial chain ID is configured\n */\n async getProvider({ chainId } = {}) {\n if (!provider) {\n if (!initialChainId) {\n throw new Error(\"No chain configured for 1auth connector\");\n }\n provider = createOneAuthProvider({\n client: options.client,\n chainId: initialChainId,\n storageKey: options.storageKey,\n waitForHash: options.waitForHash,\n hashTimeoutMs: options.hashTimeoutMs,\n hashIntervalMs: options.hashIntervalMs,\n });\n }\n if (chainId) {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n }\n return provider;\n },\n\n /**\n * Registers the one-time `connect` event listener used during initial setup.\n *\n * Called by wagmi during config initialization. Attaches `onConnect` to the\n * provider's `connect` event so that wagmi is notified if the user's session\n * is restored from localStorage before an explicit `connect()` call.\n */\n async setup() {\n const provider = await this.getProvider();\n if (!connect) {\n const onConnect = this.onConnect?.bind(this);\n if (onConnect) {\n connect = onConnect;\n provider.on(\"connect\", connect as never);\n }\n }\n },\n\n /**\n * Returns whether the connector has a valid stored session.\n *\n * Used by wagmi on startup to decide whether to attempt auto-reconnect.\n * Returns false (rather than throwing) if account resolution fails.\n *\n * @returns True if at least one account address is available\n */\n async isAuthorized() {\n try {\n const accounts = await this.getAccounts();\n return accounts.length > 0;\n } catch {\n return false;\n }\n },\n\n /**\n * Switches the active chain on the underlying provider.\n *\n * Validates that the requested chain is present in the wagmi config before\n * issuing `wallet_switchEthereumChain` so that an informative error is thrown\n * rather than a silent failure.\n *\n * @param params.chainId - The numeric ID of the chain to switch to\n * @returns The `Chain` object from wagmi config for the new chain\n * @throws If the chain is not in the wagmi config's `chains` array\n */\n async switchChain({ chainId }) {\n const chain = chains.find((chain) => chain.id === chainId);\n if (!chain) {\n throw new Error(\"Chain not configured\");\n }\n const provider = await this.getProvider();\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: numberToHex(chainId) }],\n });\n return chain;\n },\n\n /**\n * Handles the provider `connect` event and forwards it to wagmi's emitter.\n *\n * Called once during the initial connection handshake. Resolves the current\n * accounts and emits a wagmi `connect` event with both accounts and chain ID.\n *\n * @param connectInfo - EIP-1193 connect info containing the hex chain ID\n */\n async onConnect(connectInfo: ProviderConnectInfo) {\n const accounts = await this.getAccounts();\n if (!accounts.length) return;\n const chainId = Number(connectInfo.chainId);\n wagmiConfig.emitter.emit(\"connect\", { accounts, chainId });\n },\n\n /**\n * Handles the provider `accountsChanged` event and forwards it to wagmi.\n *\n * @param accounts - Updated list of account address strings\n */\n onAccountsChanged(accounts: string[]) {\n wagmiConfig.emitter.emit(\"change\", {\n accounts: accounts as Address[],\n });\n },\n\n /**\n * Handles the provider `chainChanged` event and forwards it to wagmi.\n *\n * @param chainId - The new chain ID as a hex string or decimal string\n */\n onChainChanged(chainId: string) {\n wagmiConfig.emitter.emit(\"change\", {\n chainId: Number(chainId),\n });\n },\n\n /**\n * Handles the provider `disconnect` event and forwards it to wagmi.\n *\n * @param _error - Optional error that caused the disconnection (unused)\n */\n onDisconnect(_error?: Error) {\n wagmiConfig.emitter.emit(\"disconnect\");\n },\n };\n });\n}\n"],"mappings":"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","names":["provider","chain"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rhinestone/1auth",
3
- "version": "0.7.8-dev.0",
3
+ "version": "0.8.1",
4
4
  "description": "Passkey-based authentication SDK for Web3 applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -1,565 +0,0 @@
1
- import {
2
- encodeWebAuthnSignature
3
- } from "./chunk-N6KE5CII.mjs";
4
- import {
5
- getSupportedChainIds
6
- } from "./chunk-GUAI55LL.mjs";
7
-
8
- // src/provider.ts
9
- import {
10
- hexToString,
11
- isHex,
12
- numberToHex
13
- } from "viem";
14
- var DEFAULT_STORAGE_KEY = "1auth-user";
15
- function createOneAuthProvider(options) {
16
- const { client } = options;
17
- let chainId = options.chainId;
18
- const storageKey = options.storageKey || DEFAULT_STORAGE_KEY;
19
- const listeners = /* @__PURE__ */ new Map();
20
- let sessionOverride;
21
- const emit = (event, ...args) => {
22
- const set = listeners.get(event);
23
- if (!set) return;
24
- for (const listener of set) listener(...args);
25
- };
26
- const getStoredUser = () => {
27
- if (sessionOverride !== void 0) return sessionOverride;
28
- if (typeof window === "undefined") return null;
29
- try {
30
- const raw = localStorage.getItem(storageKey);
31
- if (!raw) return null;
32
- const parsed = JSON.parse(raw);
33
- if (!parsed?.address) return null;
34
- return parsed;
35
- } catch {
36
- return null;
37
- }
38
- };
39
- const setStoredUser = (user) => {
40
- if (typeof window === "undefined") return;
41
- localStorage.setItem(storageKey, JSON.stringify(user));
42
- };
43
- const clearStoredUser = () => {
44
- if (typeof window === "undefined") return;
45
- localStorage.removeItem(storageKey);
46
- };
47
- const connect = async () => {
48
- const stored = getStoredUser();
49
- if (stored) {
50
- return [stored.address];
51
- }
52
- const authResult = await client.authWithModal();
53
- if (!authResult.success) {
54
- throw new Error(authResult.error?.message || "Authentication failed");
55
- }
56
- const address = authResult.user?.address;
57
- const signerType = authResult.signerType;
58
- if (!address) {
59
- throw new Error("No account address available");
60
- }
61
- setStoredUser({ address, signerType });
62
- emit("accountsChanged", [address]);
63
- emit("connect", { chainId: numberToHex(chainId) });
64
- return [address];
65
- };
66
- const disconnect = async () => {
67
- sessionOverride = void 0;
68
- clearStoredUser();
69
- emit("accountsChanged", []);
70
- emit("disconnect");
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
- };
89
- const ensureUser = async () => {
90
- const stored = getStoredUser();
91
- if (stored) return stored;
92
- const [address] = await connect();
93
- if (!address) {
94
- throw new Error("Failed to resolve user session");
95
- }
96
- const user = getStoredUser();
97
- return user || { address };
98
- };
99
- const getAssetsAccountAddress = (assetsParams) => {
100
- const raw = Array.isArray(assetsParams) ? assetsParams[0] : assetsParams;
101
- if (typeof raw === "string" && raw.trim()) return raw.trim();
102
- if (!raw || typeof raw !== "object") return void 0;
103
- const request2 = raw;
104
- const candidates = [
105
- request2.accountAddress,
106
- request2.address
107
- ];
108
- for (const candidate of candidates) {
109
- if (typeof candidate === "string" && candidate.trim()) {
110
- return candidate.trim();
111
- }
112
- }
113
- return void 0;
114
- };
115
- const parseChainId = (value) => {
116
- if (typeof value === "number") return value;
117
- if (typeof value === "string") {
118
- if (value.startsWith("0x")) return Number.parseInt(value, 16);
119
- const parsed = Number(value);
120
- return Number.isFinite(parsed) ? parsed : void 0;
121
- }
122
- return void 0;
123
- };
124
- const normalizeValue = (value) => {
125
- if (value === void 0 || value === null) return void 0;
126
- if (typeof value === "bigint") return value.toString();
127
- if (typeof value === "number") return Math.trunc(value).toString();
128
- if (typeof value === "string") {
129
- if (value.startsWith("0x")) {
130
- return BigInt(value).toString();
131
- }
132
- return value;
133
- }
134
- return void 0;
135
- };
136
- const normalizeCalls = (calls) => {
137
- return calls.map((call) => {
138
- const c = call;
139
- return {
140
- to: c.to,
141
- data: c.data || "0x",
142
- value: normalizeValue(c.value) || "0",
143
- label: c.label,
144
- sublabel: c.sublabel,
145
- icon: c.icon,
146
- abi: c.abi
147
- };
148
- });
149
- };
150
- const normalizeTokenRequests = (requests) => {
151
- if (!Array.isArray(requests)) return void 0;
152
- return requests.map((r) => {
153
- const req = r;
154
- return {
155
- token: req.token,
156
- amount: typeof req.amount === "bigint" ? req.amount : BigInt(String(req.amount || "0"))
157
- };
158
- });
159
- };
160
- const decodeMessage = (value) => {
161
- if (!isHex(value)) return value;
162
- try {
163
- return hexToString(value);
164
- } catch {
165
- return value;
166
- }
167
- };
168
- const forwardToWallet = async (method, params, expectedAddress) => {
169
- const result = await client.requestWithWallet({
170
- method,
171
- params,
172
- expectedAddress
173
- });
174
- if (!result.success) {
175
- const err = new Error(result.error.message);
176
- err.code = result.error.code;
177
- throw err;
178
- }
179
- return result.result;
180
- };
181
- const EOA_FORWARDED_METHODS = /* @__PURE__ */ new Set([
182
- "personal_sign",
183
- "eth_sign",
184
- "eth_signTypedData",
185
- "eth_signTypedData_v3",
186
- "eth_signTypedData_v4",
187
- "eth_sendTransaction",
188
- "wallet_sendCalls",
189
- "wallet_getCallsStatus"
190
- ]);
191
- const signMessage = async (message) => {
192
- const user = await ensureUser();
193
- if (!user.address) {
194
- throw new Error("Account address required for signing.");
195
- }
196
- const result = await client.signMessage({
197
- accountAddress: user.address,
198
- message
199
- });
200
- if (!result.success || !result.signature) {
201
- throw new Error(result.error?.message || "Signing failed");
202
- }
203
- return encodeWebAuthnSignature(result.signature);
204
- };
205
- const signTypedData = async (typedData) => {
206
- const user = await ensureUser();
207
- if (!user.address) {
208
- throw new Error("Account address required for signing.");
209
- }
210
- const data = typeof typedData === "string" ? JSON.parse(typedData) : typedData;
211
- const result = await client.signTypedData({
212
- accountAddress: user.address,
213
- domain: data.domain,
214
- types: data.types,
215
- primaryType: data.primaryType,
216
- message: data.message
217
- });
218
- if (!result.success || !result.signature) {
219
- throw new Error(result.error?.message || "Signing failed");
220
- }
221
- return encodeWebAuthnSignature(result.signature);
222
- };
223
- const resolveIntentPayload = (payload) => ({
224
- accountAddress: payload.accountAddress,
225
- targetChain: payload.targetChain,
226
- calls: payload.calls,
227
- tokenRequests: payload.tokenRequests
228
- });
229
- const sendIntent = async (payload) => {
230
- const intentPayload = resolveIntentPayload(payload);
231
- const result = await client.sendIntent({
232
- ...intentPayload,
233
- tokenRequests: payload.tokenRequests,
234
- sourceChainId: payload.sourceChainId,
235
- closeOn: options.closeOn,
236
- waitForHash: options.waitForHash ?? true,
237
- hashTimeoutMs: options.hashTimeoutMs,
238
- hashIntervalMs: options.hashIntervalMs
239
- });
240
- if (!result.success) {
241
- throw new Error(result.error?.message || "Transaction failed");
242
- }
243
- return result.intentId;
244
- };
245
- const accountMismatchError = () => {
246
- const err = new Error(
247
- "Requested signer does not match the active wallet connection."
248
- );
249
- err.code = "ACCOUNT_MISMATCH";
250
- return err;
251
- };
252
- const sameAddress = (a, b) => typeof a === "string" && a.toLowerCase() === b.toLowerCase();
253
- const injectEoaSigner = (method, params, address) => {
254
- const list = Array.isArray(params) ? params.slice() : params;
255
- if (!Array.isArray(list)) return params;
256
- if (method === "eth_sendTransaction") {
257
- const first = list[0] || {};
258
- if (first.from !== void 0 && !sameAddress(first.from, address)) {
259
- throw accountMismatchError();
260
- }
261
- list[0] = { ...first, from: address };
262
- return list;
263
- }
264
- if (method === "wallet_sendCalls") {
265
- const first = list[0] || {};
266
- if (first.from !== void 0 && !sameAddress(first.from, address)) {
267
- throw accountMismatchError();
268
- }
269
- const calls = first.calls;
270
- if (Array.isArray(calls)) {
271
- for (const call of calls) {
272
- if (!call || typeof call !== "object") continue;
273
- const callFrom = call.from;
274
- if (callFrom !== void 0 && !sameAddress(callFrom, address)) {
275
- throw accountMismatchError();
276
- }
277
- }
278
- }
279
- list[0] = { ...first, from: address };
280
- return list;
281
- }
282
- if (method === "personal_sign") {
283
- if (list[1] !== void 0 && !sameAddress(list[1], address)) {
284
- throw accountMismatchError();
285
- }
286
- if (list[0] && list[1] === void 0) list[1] = address;
287
- return list;
288
- }
289
- if (method === "eth_sign" || method === "eth_signTypedData" || method === "eth_signTypedData_v3" || method === "eth_signTypedData_v4") {
290
- if (list[0] !== void 0 && !sameAddress(list[0], address)) {
291
- throw accountMismatchError();
292
- }
293
- if (list[0] === void 0 && list[1] !== void 0) list[0] = address;
294
- return list;
295
- }
296
- return list;
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
- };
330
- const request = async ({ method, params }) => {
331
- if (EOA_FORWARDED_METHODS.has(method)) {
332
- const user = await ensureUser();
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
- }
341
- return forwardToWallet(
342
- method,
343
- injectEoaSigner(method, params, user.address),
344
- user.address
345
- );
346
- }
347
- }
348
- switch (method) {
349
- case "eth_chainId":
350
- return numberToHex(chainId);
351
- case "eth_accounts": {
352
- const stored = getStoredUser();
353
- return stored ? [stored.address] : [];
354
- }
355
- case "eth_requestAccounts":
356
- return connect();
357
- case "wallet_connect":
358
- return connect();
359
- case "wallet_disconnect":
360
- await disconnect();
361
- return true;
362
- case "wallet_switchEthereumChain": {
363
- const [param] = params || [];
364
- const next = parseChainId(param?.chainId ?? param);
365
- if (!next) {
366
- throw new Error("Invalid chainId");
367
- }
368
- const stored = getStoredUser();
369
- if (stored?.signerType === "eoa") {
370
- await forwardToWallet(method, params, stored.address);
371
- }
372
- chainId = next;
373
- emit("chainChanged", numberToHex(chainId));
374
- return null;
375
- }
376
- case "personal_sign": {
377
- const paramList = Array.isArray(params) ? params : [];
378
- const first = paramList[0];
379
- const second = paramList[1];
380
- const message = typeof first === "string" && first.startsWith("0x") && second ? typeof second === "string" && !second.startsWith("0x") ? second : decodeMessage(first) : typeof first === "string" ? decodeMessage(first) : typeof second === "string" ? decodeMessage(second) : "";
381
- if (!message) throw new Error("Invalid personal_sign payload");
382
- return signMessage(message);
383
- }
384
- case "eth_sign": {
385
- const paramList = Array.isArray(params) ? params : [];
386
- const message = typeof paramList[1] === "string" ? paramList[1] : "";
387
- if (!message) throw new Error("Invalid eth_sign payload");
388
- return signMessage(decodeMessage(message));
389
- }
390
- case "eth_signTypedData":
391
- case "eth_signTypedData_v4": {
392
- const paramList = Array.isArray(params) ? params : [];
393
- const typedData = paramList[1] ?? paramList[0];
394
- return signTypedData(typedData);
395
- }
396
- case "eth_sendTransaction": {
397
- const paramList = Array.isArray(params) ? params : [];
398
- const tx = paramList[0] || {};
399
- const user = await ensureUser();
400
- const targetChain = parseChainId(tx.chainId) ?? chainId;
401
- const calls = normalizeCalls([tx]);
402
- const tokenRequests = normalizeTokenRequests(tx.tokenRequests);
403
- const txSourceChainId = parseChainId(tx.sourceChainId);
404
- return sendIntent({
405
- accountAddress: user.address,
406
- targetChain,
407
- calls,
408
- tokenRequests,
409
- sourceChainId: txSourceChainId
410
- });
411
- }
412
- case "wallet_sendCalls": {
413
- const paramList = Array.isArray(params) ? params : [];
414
- const payload = paramList[0] || {};
415
- const user = await ensureUser();
416
- const targetChain = parseChainId(payload.chainId) ?? chainId;
417
- const calls = normalizeCalls(payload.calls || []);
418
- const tokenRequests = normalizeTokenRequests(payload.tokenRequests);
419
- const sourceChainId = parseChainId(payload.sourceChainId);
420
- if (!calls.length) throw new Error("No calls provided");
421
- return sendIntent({
422
- accountAddress: user.address,
423
- targetChain,
424
- calls,
425
- tokenRequests,
426
- sourceChainId
427
- });
428
- }
429
- case "wallet_getCapabilities": {
430
- const stored = getStoredUser();
431
- if (stored?.signerType === "eoa") {
432
- return {};
433
- }
434
- const paramList = Array.isArray(params) ? params : [];
435
- const requestedChains = paramList[1];
436
- const chainIds = getSupportedChainIds();
437
- const capabilities = {};
438
- for (const chainId2 of chainIds) {
439
- const hexChainId = `0x${chainId2.toString(16)}`;
440
- if (requestedChains && !requestedChains.includes(hexChainId)) {
441
- continue;
442
- }
443
- capabilities[hexChainId] = {
444
- atomic: { status: "supported" },
445
- paymasterService: { supported: true },
446
- auxiliaryFunds: { supported: true }
447
- };
448
- }
449
- return capabilities;
450
- }
451
- case "wallet_getAssets": {
452
- const explicitAccountAddress = getAssetsAccountAddress(params);
453
- const user = explicitAccountAddress ? null : await ensureUser();
454
- const accountAddress = explicitAccountAddress || user?.address;
455
- if (!accountAddress) {
456
- throw new Error("wallet_getAssets requires accountAddress or a connected account");
457
- }
458
- return client.getAssets({ accountAddress });
459
- }
460
- case "wallet_getCallsStatus": {
461
- const paramList = Array.isArray(params) ? params : [];
462
- const callsId = paramList[0];
463
- if (!callsId) {
464
- throw new Error("callsId is required");
465
- }
466
- const statusClientId = client.getClientId();
467
- const response = await fetch(
468
- `${client.getProviderUrl()}/api/intent/status/${encodeURIComponent(callsId)}`,
469
- {
470
- headers: statusClientId ? { "x-client-id": statusClientId } : {}
471
- }
472
- );
473
- if (!response.ok) {
474
- const data2 = await response.json().catch(() => ({}));
475
- throw new Error(data2.error || "Failed to get calls status");
476
- }
477
- const data = await response.json();
478
- const statusMap = {
479
- pending: "PENDING",
480
- preconfirmed: "PENDING",
481
- completed: "CONFIRMED",
482
- failed: "CONFIRMED",
483
- expired: "CONFIRMED"
484
- };
485
- return {
486
- status: statusMap[data.status] || "PENDING",
487
- receipts: data.transactionHash ? [
488
- {
489
- logs: [],
490
- // 0x1 = success, 0x0 = reverted/failed — mirrors EVM receipt status
491
- status: data.status === "completed" ? "0x1" : "0x0",
492
- blockHash: data.blockHash,
493
- blockNumber: data.blockNumber,
494
- transactionHash: data.transactionHash
495
- }
496
- ] : []
497
- };
498
- }
499
- case "wallet_getCallsHistory": {
500
- const paramList = Array.isArray(params) ? params : [];
501
- const options2 = paramList[0] || {};
502
- const queryParams = new URLSearchParams();
503
- if (options2.limit) queryParams.set("limit", String(options2.limit));
504
- if (options2.offset) queryParams.set("offset", String(options2.offset));
505
- if (options2.status) queryParams.set("status", options2.status);
506
- if (options2.from) queryParams.set("from", options2.from);
507
- if (options2.to) queryParams.set("to", options2.to);
508
- const url = `${client.getProviderUrl()}/api/intent/history${queryParams.toString() ? `?${queryParams}` : ""}`;
509
- const historyClientId = client.getClientId();
510
- const response = await fetch(url, {
511
- headers: historyClientId ? { "x-client-id": historyClientId } : {},
512
- credentials: "include"
513
- });
514
- if (!response.ok) {
515
- const data2 = await response.json().catch(() => ({}));
516
- throw new Error(data2.error || "Failed to get calls history");
517
- }
518
- const data = await response.json();
519
- const statusMap = {
520
- pending: "PENDING",
521
- preconfirmed: "PENDING",
522
- completed: "CONFIRMED",
523
- failed: "CONFIRMED",
524
- expired: "CONFIRMED"
525
- };
526
- return {
527
- calls: data.intents.map(
528
- (intent) => ({
529
- callsId: intent.intentId,
530
- // intentId is the orchestrator's ID
531
- status: statusMap[intent.status] || "PENDING",
532
- receipts: intent.transactionHash ? [{ transactionHash: intent.transactionHash }] : [],
533
- chainId: `0x${intent.targetChain.toString(16)}`
534
- })
535
- ),
536
- total: data.total,
537
- hasMore: data.hasMore
538
- };
539
- }
540
- default:
541
- throw new Error(`Unsupported method: ${method}`);
542
- }
543
- };
544
- return {
545
- request,
546
- on(event, listener) {
547
- const set = listeners.get(event) ?? /* @__PURE__ */ new Set();
548
- set.add(listener);
549
- listeners.set(event, set);
550
- },
551
- removeListener(event, listener) {
552
- const set = listeners.get(event);
553
- if (!set) return;
554
- set.delete(listener);
555
- if (set.size === 0) listeners.delete(event);
556
- },
557
- disconnect,
558
- setSession
559
- };
560
- }
561
-
562
- export {
563
- createOneAuthProvider
564
- };
565
- //# sourceMappingURL=chunk-E4YZS7FZ.mjs.map