@renown/sdk 6.2.3-dev.24 → 6.2.3-dev.25

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 (87) hide show
  1. package/dist/{browser-key-storage-CeyLjla8.js → browser-key-storage-wjSwTnhs.js} +3 -2
  2. package/dist/browser-key-storage-wjSwTnhs.js.map +1 -0
  3. package/dist/{constants-BexAR53F.js → constants-DVOF17NB.js} +1 -1
  4. package/dist/{constants-BexAR53F.js.map → constants-DVOF17NB.js.map} +1 -1
  5. package/dist/crypto.d.ts +4 -3
  6. package/dist/crypto.js +2 -2
  7. package/dist/{index-Bcs-BY-C.d.ts → index-CGTiUojp.d.ts} +3 -3
  8. package/dist/index-CGTiUojp.d.ts.map +1 -0
  9. package/dist/index.d.ts +12 -12
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +10 -8
  12. package/dist/index.js.map +1 -1
  13. package/dist/{local-credential-verifier-2aC00ymX.js → local-credential-verifier-BC4HS01T.js} +5 -5
  14. package/dist/local-credential-verifier-BC4HS01T.js.map +1 -0
  15. package/dist/{meta-adhFGw0o.js → meta-4NmijIbE.js} +2 -2
  16. package/dist/{meta-adhFGw0o.js.map → meta-4NmijIbE.js.map} +1 -1
  17. package/dist/{meta-BOjLjJ1Y.js → meta-B2fHYlPD.js} +2 -2
  18. package/dist/{meta-BOjLjJ1Y.js.map → meta-B2fHYlPD.js.map} +1 -1
  19. package/dist/{meta-B8HbJHy8.d.ts → meta-CpBbgZnu.d.ts} +3 -3
  20. package/dist/meta-CpBbgZnu.d.ts.map +1 -0
  21. package/dist/{meta-CRXEMUUQ.d.ts → meta-DlON7DmF.d.ts} +3 -3
  22. package/dist/meta-DlON7DmF.d.ts.map +1 -0
  23. package/dist/node.d.ts +31 -29
  24. package/dist/node.d.ts.map +1 -1
  25. package/dist/node.js +9 -8
  26. package/dist/node.js.map +1 -1
  27. package/dist/{signer-DIbtSfsu.js → signer-GzTlZLjR.js} +10 -6
  28. package/dist/signer-GzTlZLjR.js.map +1 -0
  29. package/dist/{signer-trust-D7vg4xbS.js → signer-trust-C6UJAsNJ.js} +3 -3
  30. package/dist/signer-trust-C6UJAsNJ.js.map +1 -0
  31. package/dist/{signer-trust-Dg7Wggsc.d.ts → signer-trust-DstQutcf.d.ts} +3 -3
  32. package/dist/signer-trust-DstQutcf.d.ts.map +1 -0
  33. package/dist/trust.d.ts +3 -2
  34. package/dist/trust.js +1 -1
  35. package/dist/{types-CQDAkCVn.d.ts → types-Bsve10Ny.d.ts} +3 -3
  36. package/dist/types-Bsve10Ny.d.ts.map +1 -0
  37. package/dist/{types-ChjGDXVS.d.ts → types-CHIgkzKb.d.ts} +3 -3
  38. package/dist/types-CHIgkzKb.d.ts.map +1 -0
  39. package/dist/{types-CXBWG4JY.d.ts → types-DOTk0z2D.d.ts} +7 -5
  40. package/dist/types-DOTk0z2D.d.ts.map +1 -0
  41. package/dist/{types-ome2Ysme.js → types-Dwy6khXb.js} +1 -1
  42. package/dist/{types-ome2Ysme.js.map → types-Dwy6khXb.js.map} +1 -1
  43. package/dist/{utils-BuSw6Mud.d.ts → utils-C_2VV8CS.d.ts} +4 -3
  44. package/dist/utils-C_2VV8CS.d.ts.map +1 -0
  45. package/dist/{utils-Dtdm4vFs.js → utils-DLQ5VVqT.js} +4 -3
  46. package/dist/{utils-Dtdm4vFs.js.map → utils-DLQ5VVqT.js.map} +1 -1
  47. package/dist/wallet/index.d.ts +5 -5
  48. package/dist/wallet/index.d.ts.map +1 -1
  49. package/dist/wallet/index.js +1 -1
  50. package/dist/wallet/index.js.map +1 -1
  51. package/dist/wallet/mock/factory.d.ts +4 -5
  52. package/dist/wallet/mock/factory.d.ts.map +1 -1
  53. package/dist/wallet/mock/factory.js +1 -1
  54. package/dist/wallet/mock/factory.js.map +1 -1
  55. package/dist/wallet/mock/index.d.ts +5 -5
  56. package/dist/wallet/mock/index.d.ts.map +1 -1
  57. package/dist/wallet/mock/index.js +1 -1
  58. package/dist/wallet/mock/index.js.map +1 -1
  59. package/dist/wallet/privy/factory.d.ts +9 -11
  60. package/dist/wallet/privy/factory.d.ts.map +1 -1
  61. package/dist/wallet/privy/factory.js +2 -2
  62. package/dist/wallet/privy/factory.js.map +1 -1
  63. package/dist/wallet/privy/index.d.ts +5 -5
  64. package/dist/wallet/privy/index.d.ts.map +1 -1
  65. package/dist/wallet/privy/index.js +1 -1
  66. package/dist/wallet/privy/index.js.map +1 -1
  67. package/dist/wallet/rainbow/factory.d.ts +5 -4
  68. package/dist/wallet/rainbow/factory.d.ts.map +1 -1
  69. package/dist/wallet/rainbow/factory.js +2 -2
  70. package/dist/wallet/rainbow/factory.js.map +1 -1
  71. package/dist/wallet/rainbow/index.d.ts +5 -5
  72. package/dist/wallet/rainbow/index.d.ts.map +1 -1
  73. package/dist/wallet/rainbow/index.js +1 -1
  74. package/dist/wallet/rainbow/index.js.map +1 -1
  75. package/package.json +4 -3
  76. package/dist/browser-key-storage-CeyLjla8.js.map +0 -1
  77. package/dist/index-Bcs-BY-C.d.ts.map +0 -1
  78. package/dist/local-credential-verifier-2aC00ymX.js.map +0 -1
  79. package/dist/meta-B8HbJHy8.d.ts.map +0 -1
  80. package/dist/meta-CRXEMUUQ.d.ts.map +0 -1
  81. package/dist/signer-DIbtSfsu.js.map +0 -1
  82. package/dist/signer-trust-D7vg4xbS.js.map +0 -1
  83. package/dist/signer-trust-Dg7Wggsc.d.ts.map +0 -1
  84. package/dist/types-CQDAkCVn.d.ts.map +0 -1
  85. package/dist/types-CXBWG4JY.d.ts.map +0 -1
  86. package/dist/types-ChjGDXVS.d.ts.map +0 -1
  87. package/dist/utils-BuSw6Mud.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":[],"sources":["../../../src/wallet/privy/adapter.ts","../../../src/wallet/privy/bridge.tsx","../../../src/wallet/privy/client-config.ts","../../../src/wallet/privy/theme.ts","../../../src/wallet/privy/provider.tsx","../../../src/wallet/privy/factory.ts"],"sourcesContent":["import type {\n ConnectedWallet,\n LoginModalOptions,\n SignTypedDataParams,\n} from \"@privy-io/react-auth\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport { LoginMethod, type WalletSession } from \"../types.js\";\nimport type { PrivyLoginMethod } from \"./meta.js\";\nimport type { PrivyAuthState, SendCodeOptions } from \"./types.js\";\n\ntype Hex = `0x${string}`;\ntype PrivyLoginMethodId = NonNullable<\n LoginModalOptions[\"loginMethods\"]\n>[number];\n\n// Exhaustive over PrivyLoginMethod, so widening that union without adding the\n// Privy id here is a compile error.\nexport const PRIVY_METHOD_MAP: Record<PrivyLoginMethod, PrivyLoginMethodId> = {\n [LoginMethod.WALLET]: \"wallet\",\n [LoginMethod.GOOGLE]: \"google\",\n [LoginMethod.APPLE]: \"apple\",\n [LoginMethod.EMAIL]: \"email\",\n};\n\ntype PrivyOAuthProviderId = \"google\" | \"apple\";\n\n// Methods Privy can start headlessly with initOAuth. Opening the modal for these\n// would only render a single button for a provider the caller already picked.\nconst PRIVY_OAUTH_PROVIDERS: Partial<\n Record<LoginMethod, PrivyOAuthProviderId>\n> = {\n [LoginMethod.GOOGLE]: \"google\",\n [LoginMethod.APPLE]: \"apple\",\n};\n\n// Privy React functions captured by <PrivyAdapterBridge> via bind(). Until bind\n// runs, connect/disconnect calls throw.\nexport interface PrivyBindings {\n openLoginModal: (options?: LoginModalOptions) => void;\n initOAuth: (options: { provider: PrivyOAuthProviderId }) => Promise<void>;\n sendCode: (options: {\n email: string;\n disableSignup?: boolean;\n }) => Promise<void>;\n loginWithCode: (options: { code: string }) => Promise<void>;\n logout: () => Promise<void>;\n signTypedData: (\n args: Parameters<SignCredentialTypedData>[0],\n address: Hex,\n ) => Promise<Hex>;\n}\n\nconst INITIAL_STATE: PrivyAuthState = {\n ready: false,\n authenticated: false,\n emailStatus: \"initial\",\n};\n\ninterface PendingLogin {\n resolve(session: WalletSession): void;\n reject(error: Error): void;\n}\n\n// Framework-agnostic core the bridge drives. Holds the session and pending\n// login promise so the class can operate Privy without owning React state.\nexport class PrivyCore {\n readonly supportedMethods: LoginMethod[];\n\n private bindings: PrivyBindings | null = null;\n private pending: PendingLogin | null = null;\n private session: WalletSession | undefined = undefined;\n private listeners = new Set<(session: WalletSession | undefined) => void>();\n private state: PrivyAuthState = INITIAL_STATE;\n private stateListeners = new Set<(state: PrivyAuthState) => void>();\n\n constructor(supportedMethods: LoginMethod[]) {\n this.supportedMethods = supportedMethods;\n }\n\n bind(bindings: PrivyBindings): () => void {\n this.bindings = bindings;\n return () => {\n if (this.bindings === bindings) this.bindings = null;\n };\n }\n\n getSession(): WalletSession | undefined {\n return this.session;\n }\n\n // Push session changes to subscribers, replaying the current one on subscribe.\n // Lets the host complete sign-in when a session arrives with no pending connect().\n subscribe(\n listener: (session: WalletSession | undefined) => void,\n ): () => void {\n this.listeners.add(listener);\n if (this.session) listener(this.session);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(session: WalletSession | undefined): void {\n for (const listener of this.listeners) listener(session);\n }\n\n getState(): PrivyAuthState {\n return this.state;\n }\n\n subscribeState(listener: (state: PrivyAuthState) => void): () => void {\n this.stateListeners.add(listener);\n return () => {\n this.stateListeners.delete(listener);\n };\n }\n\n // Called by the bridge whenever Privy's auth/OTP state changes. Identity-stable\n // while unchanged so useSyncExternalStore consumers don't re-render.\n syncState(next: PrivyAuthState): void {\n const prev = this.state;\n if (\n prev.ready === next.ready &&\n prev.authenticated === next.authenticated &&\n prev.email === next.email &&\n prev.emailStatus === next.emailStatus &&\n prev.emailError === next.emailError\n ) {\n return;\n }\n this.state = next;\n for (const listener of this.stateListeners) listener(next);\n }\n\n // Called by the bridge when the embedded wallet is available. Builds the\n // session and resolves any pending login promise.\n syncFromEmbeddedWallet(wallet: ConnectedWallet): void {\n const address = wallet.address as Hex;\n const chainId = parseCaip2ChainId(wallet.chainId);\n\n const signTypedData: SignCredentialTypedData = async (args) => {\n if (!this.bindings) {\n throw new Error(\"PrivyAdapter not bound (bridge not mounted)\");\n }\n return this.bindings.signTypedData(args, address);\n };\n\n // Privy's embedded wallet signs without a prompt, so a host may auto-complete\n // sign-in with this session after a full-page OAuth redirect return.\n const session: WalletSession = {\n address,\n chainId,\n signTypedData,\n canSignSilently: true,\n };\n this.session = session;\n // A live connect() (in-page popup flow) consumes the session via its promise;\n // otherwise the promise died with the pre-redirect page, so emit to subscribers.\n if (this.pending) {\n this.pending.resolve(session);\n this.pending = null;\n } else {\n this.emit(session);\n }\n }\n\n clearSession(): void {\n this.session = undefined;\n this.emit(undefined);\n }\n\n // Called by the bridge on Privy's onError. String codes like `exited_auth_flow`\n // mean the user dismissed the modal.\n handleLoginError(error: unknown): void {\n if (!this.pending) return;\n const err = error instanceof Error ? error : new Error(String(error));\n this.pending.reject(err);\n this.pending = null;\n }\n\n private requireBindings(): PrivyBindings {\n if (!this.bindings) {\n throw new Error(\n \"PrivyAdapter not bound. Ensure the adapter Provider wraps the app.\",\n );\n }\n return this.bindings;\n }\n\n private requireMethod(method: LoginMethod): void {\n if (!this.supportedMethods.includes(method)) {\n throw new Error(`PrivyAdapter does not support login method \"${method}\"`);\n }\n }\n\n // Resolves via syncFromEmbeddedWallet once the embedded wallet arrives, or\n // rejects through handleLoginError / the start() failure.\n private awaitSession(\n start: (fail: (error: unknown) => void) => void,\n ): Promise<WalletSession> {\n // One login at a time: replacing `pending` would orphan the earlier promise.\n if (this.pending) {\n return Promise.reject(\n new Error(\"PrivyAdapter: a login is already in progress\"),\n );\n }\n return new Promise<WalletSession>((resolve, reject) => {\n this.pending = { resolve, reject };\n const fail = (error: unknown) => {\n this.pending = null;\n reject(error instanceof Error ? error : new Error(String(error)));\n };\n try {\n start(fail);\n } catch (error) {\n fail(error);\n }\n });\n }\n\n async connect(method?: LoginMethod): Promise<WalletSession> {\n if (this.session) return this.session;\n const bindings = this.requireBindings();\n\n const chosen = method ?? this.supportedMethods.at(0);\n if (!chosen) {\n throw new Error(\"PrivyAdapter has no supported login methods configured\");\n }\n // PRIVY_METHOD_MAP is total over the methods Privy can drive, so only the\n // configured subset needs checking here.\n this.requireMethod(chosen);\n const privyMethod = PRIVY_METHOD_MAP[chosen];\n const oauthProvider = PRIVY_OAUTH_PROVIDERS[chosen];\n\n return this.awaitSession((fail) => {\n // initOAuth navigates away, so this promise stays pending until the page\n // unloads; syncFromEmbeddedWallet emits the session on the redirect back.\n if (oauthProvider) {\n bindings.initOAuth({ provider: oauthProvider }).catch(fail);\n } else {\n bindings.openLoginModal({ loginMethods: [privyMethod] });\n }\n });\n }\n\n async sendCode(email: string, options?: SendCodeOptions): Promise<void> {\n this.requireMethod(LoginMethod.EMAIL);\n await this.requireBindings().sendCode({\n email,\n disableSignup: options?.disableSignup,\n });\n }\n\n async loginWithCode(code: string): Promise<WalletSession> {\n if (this.session) return this.session;\n this.requireMethod(LoginMethod.EMAIL);\n const bindings = this.requireBindings();\n // loginWithCode resolves on authentication; the wallet follows through the\n // bridge (useWallets, or createWallet for a first login).\n return this.awaitSession((fail) => {\n bindings.loginWithCode({ code }).catch(fail);\n });\n }\n\n async disconnect(): Promise<void> {\n this.clearSession();\n if (!this.bindings) return;\n // When mounted on demand for this logout, Privy may still be restoring its\n // session; its logout needs that to finish.\n await this.whenReady();\n // Re-read: the bridge may have unmounted during the wait.\n const bindings = this.currentBindings();\n if (!bindings) return;\n await bindings.logout();\n }\n\n private currentBindings(): PrivyBindings | null {\n return this.bindings;\n }\n\n private whenReady(timeoutMs = 10_000): Promise<void> {\n if (this.state.ready) return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n unsubscribe();\n clearTimeout(timer);\n resolve();\n };\n const unsubscribe = this.subscribeState((state) => {\n if (state.ready) done();\n });\n const timer = setTimeout(done, timeoutMs);\n });\n }\n}\n\nfunction parseCaip2ChainId(caip2: string): number {\n const last = caip2.split(\":\").at(-1);\n const n = Number(last);\n if (!Number.isFinite(n)) {\n throw new Error(\n `PrivyAdapter: could not parse chainId from CAIP-2 \"${caip2}\"`,\n );\n }\n return n;\n}\n\nexport type { SignTypedDataParams };\n","import { useEffect, useRef } from \"react\";\nimport {\n getEmbeddedConnectedWallet,\n useCreateWallet,\n useLogin,\n useLoginWithEmail,\n useLoginWithOAuth,\n useLogout,\n usePrivy,\n useSignTypedData,\n useWallets,\n} from \"@privy-io/react-auth\";\nimport type { PrivyCore, SignTypedDataParams } from \"./adapter.js\";\n\ntype Hex = `0x${string}`;\n\n// PrivyErrorCode is declared in the types but not exported at runtime, so match\n// the code by value.\nconst EMBEDDED_WALLET_ALREADY_EXISTS = \"embedded_wallet_already_exists\";\n\n// onError is typed as the bare code, but Privy's error class carries it on\n// `privyErrorCode`, so accept either rather than trusting toString().\nfunction isAlreadyExistsError(error: unknown): boolean {\n if (error === EMBEDDED_WALLET_ALREADY_EXISTS) return true;\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as { privyErrorCode?: unknown }).privyErrorCode ===\n EMBEDDED_WALLET_ALREADY_EXISTS\n );\n}\n\ninterface PrivyAdapterBridgeProps {\n core: PrivyCore;\n}\n\n// Captures the React-only Privy hooks and wires them into PrivyCore so the\n// class can drive Privy without owning React state. Mounted inside PrivyProvider.\nexport function PrivyAdapterBridge({ core }: PrivyAdapterBridgeProps) {\n const { ready, authenticated, user } = usePrivy();\n const { wallets } = useWallets();\n const { signTypedData } = useSignTypedData();\n const { logout } = useLogout();\n const { createWallet } = useCreateWallet({\n // A wallet that already exists still arrives through useWallets(), so that\n // code is not a login failure.\n onError: (error) => {\n if (!isAlreadyExistsError(error)) core.handleLoginError(error);\n },\n });\n const { login: openLoginModal } = useLogin({\n onError: (error) => core.handleLoginError(error),\n });\n // Also mounts this hook on the page Privy redirects back to, which is what\n // lets it finish the OAuth flow there.\n const { initOAuth } = useLoginWithOAuth({\n onError: (error) => core.handleLoginError(error),\n });\n // Headless email OTP for hosts drawing their own screens (see PrivyWalletController).\n const {\n sendCode,\n loginWithCode,\n state: emailState,\n } = useLoginWithEmail({\n onError: (error) => core.handleLoginError(error),\n });\n\n // Privy returns fresh function references each render. A ref keeps the bind\n // stable so we bind once per core instead of re-binding every render.\n const fnsRef = useRef({\n openLoginModal,\n initOAuth,\n sendCode,\n loginWithCode,\n logout,\n signTypedData,\n createWallet,\n });\n useEffect(() => {\n fnsRef.current = {\n openLoginModal,\n initOAuth,\n sendCode,\n loginWithCode,\n logout,\n signTypedData,\n createWallet,\n };\n }, [\n openLoginModal,\n initOAuth,\n sendCode,\n loginWithCode,\n logout,\n signTypedData,\n createWallet,\n ]);\n\n useEffect(() => {\n core.syncState({\n ready,\n authenticated,\n email: user?.email?.address,\n emailStatus: emailState.status,\n emailError:\n emailState.status === \"error\"\n ? (emailState.error ?? undefined)\n : undefined,\n });\n }, [core, ready, authenticated, user, emailState]);\n\n // One attempt per authenticated session, reset on logout.\n const creatingWalletRef = useRef(false);\n\n useEffect(() => {\n return core.bind({\n openLoginModal: (opts) => fnsRef.current.openLoginModal(opts),\n initOAuth: (opts) => fnsRef.current.initOAuth(opts),\n sendCode: (opts) => fnsRef.current.sendCode(opts),\n loginWithCode: (opts) => fnsRef.current.loginWithCode(opts),\n logout: () => fnsRef.current.logout(),\n // Privy owns the embedded wallet keys, so showWalletUIs:false signs the\n // credential typed-data silently as part of login.\n signTypedData: async (args, address) => {\n const result = await fnsRef.current.signTypedData(\n args as unknown as SignTypedDataParams,\n { address, uiOptions: { showWalletUIs: false } },\n );\n return result.signature as Hex;\n },\n });\n }, [core]);\n\n useEffect(() => {\n if (!ready) return;\n if (!authenticated) {\n core.clearSession();\n creatingWalletRef.current = false;\n return;\n }\n const embedded = getEmbeddedConnectedWallet(wallets);\n if (embedded) {\n core.syncFromEmbeddedWallet(embedded);\n return;\n }\n // `createOnLogin` only fires for Privy's own modal, so initOAuth logins\n // reach here with no wallet. Privy's docs prescribe creating it manually.\n if (creatingWalletRef.current) return;\n creatingWalletRef.current = true;\n // Failures are reported through useCreateWallet's onError; this only keeps\n // the rejection from surfacing as an unhandled one.\n void fnsRef.current.createWallet().catch(() => undefined);\n }, [core, ready, authenticated, wallets]);\n\n return null;\n}\n","import type { PrivyClientConfig, WalletListEntry } from \"@privy-io/react-auth\";\nimport type { Chain } from \"viem\";\nimport type { LoginMethod } from \"../types.js\";\nimport { PRIVY_METHOD_MAP } from \"./adapter.js\";\nimport type { PrivyChain } from \"./meta.js\";\n\n// Privy's provider root fetches the WalletConnect explorer listings on mount\n// unless walletList needs none; externalWallets.* and loginMethods don't gate it.\nexport const DEFAULT_WALLET_LIST: readonly WalletListEntry[] = [\n \"detected_ethereum_wallets\",\n];\n\nexport interface PrivyClientConfigInput {\n methods: LoginMethod[];\n mode: \"light\" | \"dark\";\n accentColor?: `#${string}`;\n chain?: PrivyChain;\n walletList?: string[];\n}\n\n// Pure so the config shape is testable without mounting PrivyProvider.\nexport function buildPrivyClientConfig({\n methods,\n mode,\n accentColor,\n chain,\n walletList,\n}: PrivyClientConfigInput): PrivyClientConfig {\n // PrivyChain is the structural subset every viem Chain satisfies.\n const pinned = chain as Chain | undefined;\n return {\n // Only the configured methods, so Privy skips the connectors (e.g.\n // WalletConnect) that the unlisted ones would initialize.\n loginMethods: methods.map((method) => PRIVY_METHOD_MAP[method]),\n appearance: {\n // Privy generates its own light/dark variants from the accent.\n theme: mode,\n // Config arrives from JSON, so entries are unvalidated here.\n walletList: [...(walletList ?? DEFAULT_WALLET_LIST)] as WalletListEntry[],\n ...(accentColor ? { accentColor } : {}),\n },\n // Renown rejects a wallet on any chain but the one it issues on.\n ...(pinned ? { defaultChain: pinned, supportedChains: [pinned] } : {}),\n embeddedWallets: {\n ethereum: { createOnLogin: \"users-without-wallets\" },\n showWalletUIs: false,\n },\n // Social/email adapter only (external wallets go through the rainbow\n // adapter), so don't init WalletConnect / fetch its registry on mount.\n externalWallets: {\n disableAllExternalWallets: true,\n walletConnect: { enabled: false },\n },\n };\n}\n","const HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB = /^rgba?\\(\\s*(-?[\\d.]+)[\\s,]+(-?[\\d.]+)[\\s,]+(-?[\\d.]+)/i;\n\nfunction channel(value: string): string {\n const byte = Math.round(Number(value));\n return Math.min(255, Math.max(0, byte)).toString(16).padStart(2, \"0\");\n}\n\n/** Convert a host theme accent color to the hex Privy's `appearance` requires, or `undefined` if it is not expressible. Hosts resolve CSS tokens through `getComputedStyle`, which yields `rgb(...)`, so plain pass-through would be rejected. Alpha is dropped: Privy derives its own variants. */\nexport function toPrivyAccentColor(\n color: string | undefined,\n): `#${string}` | undefined {\n if (!color) return undefined;\n const value = color.trim();\n if (HEX.test(value)) return value as `#${string}`;\n const rgb = RGB.exec(value);\n if (!rgb) return undefined;\n return `#${channel(rgb[1])}${channel(rgb[2])}${channel(rgb[3])}`;\n}\n","import { useMemo, type ComponentType, type ReactNode } from \"react\";\nimport { PrivyProvider } from \"@privy-io/react-auth\";\nimport { normalizeWalletTheme, type WalletTheme } from \"../types.js\";\nimport type { PrivyCore } from \"./adapter.js\";\nimport { PrivyAdapterBridge } from \"./bridge.js\";\nimport { buildPrivyClientConfig } from \"./client-config.js\";\nimport type { PrivyChain } from \"./meta.js\";\nimport { toPrivyAccentColor } from \"./theme.js\";\n\ninterface PrivyProviderConfig {\n appId: string;\n clientId?: string;\n chain?: PrivyChain;\n walletList?: string[];\n}\n\n// Build the adapter Provider bound to a specific core + config. Mounts\n// PrivyProvider with embedded wallets + showWalletUIs:false for silent signing.\nexport function createPrivyProvider(\n core: PrivyCore,\n config: PrivyProviderConfig,\n): ComponentType<{ children: ReactNode; theme?: WalletTheme }> {\n return function PrivyAuthProvider({\n children,\n theme,\n }: {\n children: ReactNode;\n theme?: WalletTheme;\n }) {\n const { mode, accentColor } = normalizeWalletTheme(theme);\n const accent = toPrivyAccentColor(accentColor);\n const { chain, walletList } = config;\n // Memoize so a new config object per render doesn't rebuild PrivyProvider's\n // context and cascade re-renders into descendants.\n const privyConfig = useMemo(\n () =>\n buildPrivyClientConfig({\n methods: core.supportedMethods,\n mode,\n accentColor: accent,\n chain,\n walletList,\n }),\n [mode, accent, chain, walletList],\n );\n\n return (\n <PrivyProvider\n appId={config.appId}\n clientId={config.clientId}\n config={privyConfig}\n >\n <PrivyAdapterBridge core={core} />\n {children}\n </PrivyProvider>\n );\n };\n}\n","// Renders React (PrivyProvider + hooks), so RSC hosts must treat this as a\n// client module even though the descriptor entry reaches it lazily.\n\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { WalletAdapterImpl } from \"../types.js\";\nimport { PrivyCore } from \"./adapter.js\";\nimport type { PrivyWalletController } from \"./types.js\";\nimport {\n resolvePrivyMethods,\n type PHRenownPrivyAdapterConfig,\n} from \"./meta.js\";\nimport { createPrivyProvider } from \"./provider.js\";\n\n// Build the Privy adapter. Provider mounts PrivyProvider + a bridge;\n// useController exposes imperative connect/disconnect over the shared core.\nexport function createPrivyAdapter(\n config: PHRenownPrivyAdapterConfig,\n): WalletAdapterImpl {\n const core = new PrivyCore(resolvePrivyMethods(config.methods));\n const Provider = createPrivyProvider(core, {\n appId: config.appId,\n clientId: config.clientId,\n chain: config.chain,\n walletList: config.walletList,\n });\n\n // Stable identity: the host publishes this to a registry on change.\n function useController(): PrivyWalletController {\n return useMemo<PrivyWalletController>(\n () => ({\n connect: (method) => core.connect(method),\n disconnect: () => core.disconnect(),\n getSession: () => core.getSession(),\n subscribe: (listener) => core.subscribe(listener),\n sendCode: (email, options) => core.sendCode(email, options),\n loginWithCode: (code) => core.loginWithCode(code),\n getState: () => core.getState(),\n subscribeState: (listener) => core.subscribeState(listener),\n }),\n [],\n );\n }\n\n return { Provider, useController };\n}\n\nexport { PrivyCore } from \"./adapter.js\";\nexport type { PrivyBindings } from \"./adapter.js\";\nexport type {\n PrivyAuthState,\n PrivyEmailStatus,\n PrivyWalletController,\n SendCodeOptions,\n} from \"./types.js\";\nexport { PrivyAdapterBridge } from \"./bridge.js\";\nexport { createPrivyProvider } from \"./provider.js\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","names":[],"sources":["../../../src/wallet/privy/adapter.ts","../../../src/wallet/privy/bridge.tsx","../../../src/wallet/privy/client-config.ts","../../../src/wallet/privy/theme.ts","../../../src/wallet/privy/provider.tsx","../../../src/wallet/privy/factory.ts"],"sourcesContent":["import type {\n ConnectedWallet,\n LoginModalOptions,\n SignTypedDataParams,\n} from \"@privy-io/react-auth\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport { LoginMethod, type WalletSession } from \"../types.js\";\nimport type { PrivyLoginMethod } from \"./meta.js\";\nimport type { PrivyAuthState, SendCodeOptions } from \"./types.js\";\n\ntype Hex = `0x${string}`;\ntype PrivyLoginMethodId = NonNullable<\n LoginModalOptions[\"loginMethods\"]\n>[number];\n\n// Exhaustive over PrivyLoginMethod, so widening that union without adding the\n// Privy id here is a compile error.\nexport const PRIVY_METHOD_MAP: Record<PrivyLoginMethod, PrivyLoginMethodId> = {\n [LoginMethod.WALLET]: \"wallet\",\n [LoginMethod.GOOGLE]: \"google\",\n [LoginMethod.APPLE]: \"apple\",\n [LoginMethod.EMAIL]: \"email\",\n};\n\ntype PrivyOAuthProviderId = \"google\" | \"apple\";\n\n// Methods Privy can start headlessly with initOAuth. Opening the modal for these\n// would only render a single button for a provider the caller already picked.\nconst PRIVY_OAUTH_PROVIDERS: Partial<\n Record<LoginMethod, PrivyOAuthProviderId>\n> = {\n [LoginMethod.GOOGLE]: \"google\",\n [LoginMethod.APPLE]: \"apple\",\n};\n\n// Privy React functions captured by <PrivyAdapterBridge> via bind(). Until bind\n// runs, connect/disconnect calls throw.\nexport interface PrivyBindings {\n openLoginModal: (options?: LoginModalOptions) => void;\n initOAuth: (options: { provider: PrivyOAuthProviderId }) => Promise<void>;\n sendCode: (options: {\n email: string;\n disableSignup?: boolean;\n }) => Promise<void>;\n loginWithCode: (options: { code: string }) => Promise<void>;\n logout: () => Promise<void>;\n signTypedData: (\n args: Parameters<SignCredentialTypedData>[0],\n address: Hex,\n ) => Promise<Hex>;\n}\n\nconst INITIAL_STATE: PrivyAuthState = {\n ready: false,\n authenticated: false,\n emailStatus: \"initial\",\n};\n\ninterface PendingLogin {\n resolve(session: WalletSession): void;\n reject(error: Error): void;\n}\n\n// Framework-agnostic core the bridge drives. Holds the session and pending\n// login promise so the class can operate Privy without owning React state.\nexport class PrivyCore {\n readonly supportedMethods: LoginMethod[];\n\n private bindings: PrivyBindings | null = null;\n private pending: PendingLogin | null = null;\n private session: WalletSession | undefined = undefined;\n private listeners = new Set<(session: WalletSession | undefined) => void>();\n private state: PrivyAuthState = INITIAL_STATE;\n private stateListeners = new Set<(state: PrivyAuthState) => void>();\n\n constructor(supportedMethods: LoginMethod[]) {\n this.supportedMethods = supportedMethods;\n }\n\n bind(bindings: PrivyBindings): () => void {\n this.bindings = bindings;\n return () => {\n if (this.bindings === bindings) this.bindings = null;\n };\n }\n\n getSession(): WalletSession | undefined {\n return this.session;\n }\n\n // Push session changes to subscribers, replaying the current one on subscribe.\n // Lets the host complete sign-in when a session arrives with no pending connect().\n subscribe(\n listener: (session: WalletSession | undefined) => void,\n ): () => void {\n this.listeners.add(listener);\n if (this.session) listener(this.session);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(session: WalletSession | undefined): void {\n for (const listener of this.listeners) listener(session);\n }\n\n getState(): PrivyAuthState {\n return this.state;\n }\n\n subscribeState(listener: (state: PrivyAuthState) => void): () => void {\n this.stateListeners.add(listener);\n return () => {\n this.stateListeners.delete(listener);\n };\n }\n\n // Called by the bridge whenever Privy's auth/OTP state changes. Identity-stable\n // while unchanged so useSyncExternalStore consumers don't re-render.\n syncState(next: PrivyAuthState): void {\n const prev = this.state;\n if (\n prev.ready === next.ready &&\n prev.authenticated === next.authenticated &&\n prev.email === next.email &&\n prev.emailStatus === next.emailStatus &&\n prev.emailError === next.emailError\n ) {\n return;\n }\n this.state = next;\n for (const listener of this.stateListeners) listener(next);\n }\n\n // Called by the bridge when the embedded wallet is available. Builds the\n // session and resolves any pending login promise.\n syncFromEmbeddedWallet(wallet: ConnectedWallet): void {\n const address = wallet.address as Hex;\n const chainId = parseCaip2ChainId(wallet.chainId);\n\n const signTypedData: SignCredentialTypedData = async (args) => {\n if (!this.bindings) {\n throw new Error(\"PrivyAdapter not bound (bridge not mounted)\");\n }\n return this.bindings.signTypedData(args, address);\n };\n\n // Privy's embedded wallet signs without a prompt, so a host may auto-complete\n // sign-in with this session after a full-page OAuth redirect return.\n const session: WalletSession = {\n address,\n chainId,\n signTypedData,\n canSignSilently: true,\n };\n this.session = session;\n // A live connect() (in-page popup flow) consumes the session via its promise;\n // otherwise the promise died with the pre-redirect page, so emit to subscribers.\n if (this.pending) {\n this.pending.resolve(session);\n this.pending = null;\n } else {\n this.emit(session);\n }\n }\n\n clearSession(): void {\n this.session = undefined;\n this.emit(undefined);\n }\n\n // Called by the bridge on Privy's onError. String codes like `exited_auth_flow`\n // mean the user dismissed the modal.\n handleLoginError(error: unknown): void {\n if (!this.pending) return;\n const err = error instanceof Error ? error : new Error(String(error));\n this.pending.reject(err);\n this.pending = null;\n }\n\n private requireBindings(): PrivyBindings {\n if (!this.bindings) {\n throw new Error(\n \"PrivyAdapter not bound. Ensure the adapter Provider wraps the app.\",\n );\n }\n return this.bindings;\n }\n\n private requireMethod(method: LoginMethod): void {\n if (!this.supportedMethods.includes(method)) {\n throw new Error(`PrivyAdapter does not support login method \"${method}\"`);\n }\n }\n\n // Resolves via syncFromEmbeddedWallet once the embedded wallet arrives, or\n // rejects through handleLoginError / the start() failure.\n private awaitSession(\n start: (fail: (error: unknown) => void) => void,\n ): Promise<WalletSession> {\n // One login at a time: replacing `pending` would orphan the earlier promise.\n if (this.pending) {\n return Promise.reject(\n new Error(\"PrivyAdapter: a login is already in progress\"),\n );\n }\n return new Promise<WalletSession>((resolve, reject) => {\n this.pending = { resolve, reject };\n const fail = (error: unknown) => {\n this.pending = null;\n reject(error instanceof Error ? error : new Error(String(error)));\n };\n try {\n start(fail);\n } catch (error) {\n fail(error);\n }\n });\n }\n\n async connect(method?: LoginMethod): Promise<WalletSession> {\n if (this.session) return this.session;\n const bindings = this.requireBindings();\n\n const chosen = method ?? this.supportedMethods.at(0);\n if (!chosen) {\n throw new Error(\"PrivyAdapter has no supported login methods configured\");\n }\n // PRIVY_METHOD_MAP is total over the methods Privy can drive, so only the\n // configured subset needs checking here.\n this.requireMethod(chosen);\n const privyMethod = PRIVY_METHOD_MAP[chosen];\n const oauthProvider = PRIVY_OAUTH_PROVIDERS[chosen];\n\n return this.awaitSession((fail) => {\n // initOAuth navigates away, so this promise stays pending until the page\n // unloads; syncFromEmbeddedWallet emits the session on the redirect back.\n if (oauthProvider) {\n bindings.initOAuth({ provider: oauthProvider }).catch(fail);\n } else {\n bindings.openLoginModal({ loginMethods: [privyMethod] });\n }\n });\n }\n\n async sendCode(email: string, options?: SendCodeOptions): Promise<void> {\n this.requireMethod(LoginMethod.EMAIL);\n await this.requireBindings().sendCode({\n email,\n disableSignup: options?.disableSignup,\n });\n }\n\n async loginWithCode(code: string): Promise<WalletSession> {\n if (this.session) return this.session;\n this.requireMethod(LoginMethod.EMAIL);\n const bindings = this.requireBindings();\n // loginWithCode resolves on authentication; the wallet follows through the\n // bridge (useWallets, or createWallet for a first login).\n return this.awaitSession((fail) => {\n bindings.loginWithCode({ code }).catch(fail);\n });\n }\n\n async disconnect(): Promise<void> {\n this.clearSession();\n if (!this.bindings) return;\n // When mounted on demand for this logout, Privy may still be restoring its\n // session; its logout needs that to finish.\n await this.whenReady();\n // Re-read: the bridge may have unmounted during the wait.\n const bindings = this.currentBindings();\n if (!bindings) return;\n await bindings.logout();\n }\n\n private currentBindings(): PrivyBindings | null {\n return this.bindings;\n }\n\n private whenReady(timeoutMs = 10_000): Promise<void> {\n if (this.state.ready) return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n unsubscribe();\n clearTimeout(timer);\n resolve();\n };\n const unsubscribe = this.subscribeState((state) => {\n if (state.ready) done();\n });\n const timer = setTimeout(done, timeoutMs);\n });\n }\n}\n\nfunction parseCaip2ChainId(caip2: string): number {\n const last = caip2.split(\":\").at(-1);\n const n = Number(last);\n if (!Number.isFinite(n)) {\n throw new Error(\n `PrivyAdapter: could not parse chainId from CAIP-2 \"${caip2}\"`,\n );\n }\n return n;\n}\n\nexport type { SignTypedDataParams };\n","import { useEffect, useRef } from \"react\";\nimport {\n getEmbeddedConnectedWallet,\n useCreateWallet,\n useLogin,\n useLoginWithEmail,\n useLoginWithOAuth,\n useLogout,\n usePrivy,\n useSignTypedData,\n useWallets,\n} from \"@privy-io/react-auth\";\nimport type { PrivyCore, SignTypedDataParams } from \"./adapter.js\";\n\ntype Hex = `0x${string}`;\n\n// PrivyErrorCode is declared in the types but not exported at runtime, so match\n// the code by value.\nconst EMBEDDED_WALLET_ALREADY_EXISTS = \"embedded_wallet_already_exists\";\n\n// onError is typed as the bare code, but Privy's error class carries it on\n// `privyErrorCode`, so accept either rather than trusting toString().\nfunction isAlreadyExistsError(error: unknown): boolean {\n if (error === EMBEDDED_WALLET_ALREADY_EXISTS) return true;\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as { privyErrorCode?: unknown }).privyErrorCode ===\n EMBEDDED_WALLET_ALREADY_EXISTS\n );\n}\n\ninterface PrivyAdapterBridgeProps {\n core: PrivyCore;\n}\n\n// Captures the React-only Privy hooks and wires them into PrivyCore so the\n// class can drive Privy without owning React state. Mounted inside PrivyProvider.\nexport function PrivyAdapterBridge({ core }: PrivyAdapterBridgeProps) {\n const { ready, authenticated, user } = usePrivy();\n const { wallets } = useWallets();\n const { signTypedData } = useSignTypedData();\n const { logout } = useLogout();\n const { createWallet } = useCreateWallet({\n // A wallet that already exists still arrives through useWallets(), so that\n // code is not a login failure.\n onError: (error) => {\n if (!isAlreadyExistsError(error)) core.handleLoginError(error);\n },\n });\n const { login: openLoginModal } = useLogin({\n onError: (error) => core.handleLoginError(error),\n });\n // Also mounts this hook on the page Privy redirects back to, which is what\n // lets it finish the OAuth flow there.\n const { initOAuth } = useLoginWithOAuth({\n onError: (error) => core.handleLoginError(error),\n });\n // Headless email OTP for hosts drawing their own screens (see PrivyWalletController).\n const {\n sendCode,\n loginWithCode,\n state: emailState,\n } = useLoginWithEmail({\n onError: (error) => core.handleLoginError(error),\n });\n\n // Privy returns fresh function references each render. A ref keeps the bind\n // stable so we bind once per core instead of re-binding every render.\n const fnsRef = useRef({\n openLoginModal,\n initOAuth,\n sendCode,\n loginWithCode,\n logout,\n signTypedData,\n createWallet,\n });\n useEffect(() => {\n fnsRef.current = {\n openLoginModal,\n initOAuth,\n sendCode,\n loginWithCode,\n logout,\n signTypedData,\n createWallet,\n };\n }, [\n openLoginModal,\n initOAuth,\n sendCode,\n loginWithCode,\n logout,\n signTypedData,\n createWallet,\n ]);\n\n useEffect(() => {\n core.syncState({\n ready,\n authenticated,\n email: user?.email?.address,\n emailStatus: emailState.status,\n emailError:\n emailState.status === \"error\"\n ? (emailState.error ?? undefined)\n : undefined,\n });\n }, [core, ready, authenticated, user, emailState]);\n\n // One attempt per authenticated session, reset on logout.\n const creatingWalletRef = useRef(false);\n\n useEffect(() => {\n return core.bind({\n openLoginModal: (opts) => fnsRef.current.openLoginModal(opts),\n initOAuth: (opts) => fnsRef.current.initOAuth(opts),\n sendCode: (opts) => fnsRef.current.sendCode(opts),\n loginWithCode: (opts) => fnsRef.current.loginWithCode(opts),\n logout: () => fnsRef.current.logout(),\n // Privy owns the embedded wallet keys, so showWalletUIs:false signs the\n // credential typed-data silently as part of login.\n signTypedData: async (args, address) => {\n const result = await fnsRef.current.signTypedData(\n args as unknown as SignTypedDataParams,\n { address, uiOptions: { showWalletUIs: false } },\n );\n return result.signature as Hex;\n },\n });\n }, [core]);\n\n useEffect(() => {\n if (!ready) return;\n if (!authenticated) {\n core.clearSession();\n creatingWalletRef.current = false;\n return;\n }\n const embedded = getEmbeddedConnectedWallet(wallets);\n if (embedded) {\n core.syncFromEmbeddedWallet(embedded);\n return;\n }\n // `createOnLogin` only fires for Privy's own modal, so initOAuth logins\n // reach here with no wallet. Privy's docs prescribe creating it manually.\n if (creatingWalletRef.current) return;\n creatingWalletRef.current = true;\n // Failures are reported through useCreateWallet's onError; this only keeps\n // the rejection from surfacing as an unhandled one.\n void fnsRef.current.createWallet().catch(() => undefined);\n }, [core, ready, authenticated, wallets]);\n\n return null;\n}\n","import type { PrivyClientConfig, WalletListEntry } from \"@privy-io/react-auth\";\nimport type { Chain } from \"viem\";\nimport type { LoginMethod } from \"../types.js\";\nimport { PRIVY_METHOD_MAP } from \"./adapter.js\";\nimport type { PrivyChain } from \"./meta.js\";\n\n// Privy's provider root fetches the WalletConnect explorer listings on mount\n// unless walletList needs none; externalWallets.* and loginMethods don't gate it.\nexport const DEFAULT_WALLET_LIST: readonly WalletListEntry[] = [\n \"detected_ethereum_wallets\",\n];\n\nexport interface PrivyClientConfigInput {\n methods: LoginMethod[];\n mode: \"light\" | \"dark\";\n accentColor?: `#${string}`;\n chain?: PrivyChain;\n walletList?: string[];\n}\n\n// Pure so the config shape is testable without mounting PrivyProvider.\nexport function buildPrivyClientConfig({\n methods,\n mode,\n accentColor,\n chain,\n walletList,\n}: PrivyClientConfigInput): PrivyClientConfig {\n // PrivyChain is the structural subset every viem Chain satisfies.\n const pinned = chain as Chain | undefined;\n return {\n // Only the configured methods, so Privy skips the connectors (e.g.\n // WalletConnect) that the unlisted ones would initialize.\n loginMethods: methods.map((method) => PRIVY_METHOD_MAP[method]),\n appearance: {\n // Privy generates its own light/dark variants from the accent.\n theme: mode,\n // Config arrives from JSON, so entries are unvalidated here.\n walletList: [...(walletList ?? DEFAULT_WALLET_LIST)] as WalletListEntry[],\n ...(accentColor ? { accentColor } : {}),\n },\n // Renown rejects a wallet on any chain but the one it issues on.\n ...(pinned ? { defaultChain: pinned, supportedChains: [pinned] } : {}),\n embeddedWallets: {\n ethereum: { createOnLogin: \"users-without-wallets\" },\n showWalletUIs: false,\n },\n // Social/email adapter only (external wallets go through the rainbow\n // adapter), so don't init WalletConnect / fetch its registry on mount.\n externalWallets: {\n disableAllExternalWallets: true,\n walletConnect: { enabled: false },\n },\n };\n}\n","const HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB = /^rgba?\\(\\s*(-?[\\d.]+)[\\s,]+(-?[\\d.]+)[\\s,]+(-?[\\d.]+)/i;\n\nfunction channel(value: string): string {\n const byte = Math.round(Number(value));\n return Math.min(255, Math.max(0, byte)).toString(16).padStart(2, \"0\");\n}\n\n/** Convert a host theme accent color to the hex Privy's `appearance` requires, or `undefined` if it is not expressible. Hosts resolve CSS tokens through `getComputedStyle`, which yields `rgb(...)`, so plain pass-through would be rejected. Alpha is dropped: Privy derives its own variants. */\nexport function toPrivyAccentColor(\n color: string | undefined,\n): `#${string}` | undefined {\n if (!color) return undefined;\n const value = color.trim();\n if (HEX.test(value)) return value as `#${string}`;\n const rgb = RGB.exec(value);\n if (!rgb) return undefined;\n return `#${channel(rgb[1])}${channel(rgb[2])}${channel(rgb[3])}`;\n}\n","import { useMemo, type ComponentType, type ReactNode } from \"react\";\nimport { PrivyProvider } from \"@privy-io/react-auth\";\nimport { normalizeWalletTheme, type WalletTheme } from \"../types.js\";\nimport type { PrivyCore } from \"./adapter.js\";\nimport { PrivyAdapterBridge } from \"./bridge.js\";\nimport { buildPrivyClientConfig } from \"./client-config.js\";\nimport type { PrivyChain } from \"./meta.js\";\nimport { toPrivyAccentColor } from \"./theme.js\";\n\ninterface PrivyProviderConfig {\n appId: string;\n clientId?: string;\n chain?: PrivyChain;\n walletList?: string[];\n}\n\n// Build the adapter Provider bound to a specific core + config. Mounts\n// PrivyProvider with embedded wallets + showWalletUIs:false for silent signing.\nexport function createPrivyProvider(\n core: PrivyCore,\n config: PrivyProviderConfig,\n): ComponentType<{ children: ReactNode; theme?: WalletTheme }> {\n return function PrivyAuthProvider({\n children,\n theme,\n }: {\n children: ReactNode;\n theme?: WalletTheme;\n }) {\n const { mode, accentColor } = normalizeWalletTheme(theme);\n const accent = toPrivyAccentColor(accentColor);\n const { chain, walletList } = config;\n // Memoize so a new config object per render doesn't rebuild PrivyProvider's\n // context and cascade re-renders into descendants.\n const privyConfig = useMemo(\n () =>\n buildPrivyClientConfig({\n methods: core.supportedMethods,\n mode,\n accentColor: accent,\n chain,\n walletList,\n }),\n [mode, accent, chain, walletList],\n );\n\n return (\n <PrivyProvider\n appId={config.appId}\n clientId={config.clientId}\n config={privyConfig}\n >\n <PrivyAdapterBridge core={core} />\n {children}\n </PrivyProvider>\n );\n };\n}\n","// Renders React (PrivyProvider + hooks), so RSC hosts must treat this as a\n// client module even though the descriptor entry reaches it lazily.\n\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { WalletAdapterImpl } from \"../types.js\";\nimport { PrivyCore } from \"./adapter.js\";\nimport type { PrivyWalletController } from \"./types.js\";\nimport {\n resolvePrivyMethods,\n type PHRenownPrivyAdapterConfig,\n} from \"./meta.js\";\nimport { createPrivyProvider } from \"./provider.js\";\n\n// Build the Privy adapter. Provider mounts PrivyProvider + a bridge;\n// useController exposes imperative connect/disconnect over the shared core.\nexport function createPrivyAdapter(\n config: PHRenownPrivyAdapterConfig,\n): WalletAdapterImpl {\n const core = new PrivyCore(resolvePrivyMethods(config.methods));\n const Provider = createPrivyProvider(core, {\n appId: config.appId,\n clientId: config.clientId,\n chain: config.chain,\n walletList: config.walletList,\n });\n\n // Stable identity: the host publishes this to a registry on change.\n function useController(): PrivyWalletController {\n return useMemo<PrivyWalletController>(\n () => ({\n connect: (method) => core.connect(method),\n disconnect: () => core.disconnect(),\n getSession: () => core.getSession(),\n subscribe: (listener) => core.subscribe(listener),\n sendCode: (email, options) => core.sendCode(email, options),\n loginWithCode: (code) => core.loginWithCode(code),\n getState: () => core.getState(),\n subscribeState: (listener) => core.subscribeState(listener),\n }),\n [],\n );\n }\n\n return { Provider, useController };\n}\n\nexport { PrivyCore } from \"./adapter.js\";\nexport type { PrivyBindings } from \"./adapter.js\";\nexport type {\n PrivyAuthState,\n PrivyEmailStatus,\n PrivyWalletController,\n SendCodeOptions,\n} from \"./types.js\";\nexport { PrivyAdapterBridge } from \"./bridge.js\";\nexport { createPrivyProvider } from \"./provider.js\";\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { r as WalletAdapterDescriptor } from "../../types-ChjGDXVS.js";
2
- import { a as DEFAULT_PRIVY_METHODS, c as PrivyLoginMethod, i as SendCodeOptions, l as privyAdapterMeta, n as PrivyEmailStatus, o as PHRenownPrivyAdapterConfig, r as PrivyWalletController, s as PrivyChain, t as PrivyAuthState, u as resolvePrivyMethods } from "../../types-CQDAkCVn.js";
3
-
1
+ import { r as WalletAdapterDescriptor } from "../../types-CHIgkzKb.js";
2
+ import { a as DEFAULT_PRIVY_METHODS, c as PrivyLoginMethod, i as SendCodeOptions, l as privyAdapterMeta, n as PrivyEmailStatus, o as PHRenownPrivyAdapterConfig, r as PrivyWalletController, s as PrivyChain, t as PrivyAuthState, u as resolvePrivyMethods } from "../../types-Bsve10Ny.js";
4
3
  //#region src/wallet/privy/index.d.ts
5
4
  /** Privy wallet adapter (embedded wallets plus social / email login) for `RenownWalletProvider`. Importing this module loads no wallet library — `@privy-io/react-auth` is fetched by `load()` on the first login click — but it does make that package a build-time requirement, so install it alongside this import. */
6
- declare function privyAdapter(config: PHRenownPrivyAdapterConfig): WalletAdapterDescriptor;
5
+ export declare function privyAdapter(config: PHRenownPrivyAdapterConfig): WalletAdapterDescriptor;
7
6
  //#endregion
8
- export { DEFAULT_PRIVY_METHODS, type PHRenownPrivyAdapterConfig, type PrivyAuthState, type PrivyChain, type PrivyEmailStatus, type PrivyLoginMethod, type PrivyWalletController, type SendCodeOptions, privyAdapter, privyAdapterMeta, resolvePrivyMethods };
7
+ export { DEFAULT_PRIVY_METHODS, type PHRenownPrivyAdapterConfig, type PrivyAuthState, type PrivyChain, type PrivyEmailStatus, type PrivyLoginMethod, type PrivyWalletController, type SendCodeOptions, privyAdapterMeta, resolvePrivyMethods };
8
+ export {};
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/privy/index.ts"],"mappings":";;;;;iBAQgB,YAAA,CACd,MAAA,EAAQ,0BAAA,GACP,uBAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/privy/index.ts"],"mappings":";;;;wBAQgB,aACd,QAAQ,6BACP"}
@@ -1,4 +1,4 @@
1
- import { n as privyAdapterMeta, r as resolvePrivyMethods, t as DEFAULT_PRIVY_METHODS } from "../../meta-adhFGw0o.js";
1
+ import { n as privyAdapterMeta, r as resolvePrivyMethods, t as DEFAULT_PRIVY_METHODS } from "../../meta-4NmijIbE.js";
2
2
  //#region src/wallet/privy/index.ts
3
3
  /** Privy wallet adapter (embedded wallets plus social / email login) for `RenownWalletProvider`. Importing this module loads no wallet library — `@privy-io/react-auth` is fetched by `load()` on the first login click — but it does make that package a build-time requirement, so install it alongside this import. */
4
4
  function privyAdapter(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/privy/index.ts"],"sourcesContent":["import type { WalletAdapterDescriptor } from \"../types.js\";\nimport {\n privyAdapterMeta,\n resolvePrivyMethods,\n type PHRenownPrivyAdapterConfig,\n} from \"./meta.js\";\n\n/** Privy wallet adapter (embedded wallets plus social / email login) for `RenownWalletProvider`. Importing this module loads no wallet library — `@privy-io/react-auth` is fetched by `load()` on the first login click — but it does make that package a build-time requirement, so install it alongside this import. */\nexport function privyAdapter(\n config: PHRenownPrivyAdapterConfig,\n): WalletAdapterDescriptor {\n return {\n meta: {\n ...privyAdapterMeta,\n supportedMethods: resolvePrivyMethods(config.methods),\n },\n load: () =>\n import(\"./factory.js\").then((m) => m.createPrivyAdapter(config)),\n };\n}\n\nexport {\n DEFAULT_PRIVY_METHODS,\n privyAdapterMeta,\n resolvePrivyMethods,\n} from \"./meta.js\";\nexport type {\n PHRenownPrivyAdapterConfig,\n PrivyChain,\n PrivyLoginMethod,\n} from \"./meta.js\";\n// Type-only: lets a host type `useRenownWalletAdapter<PrivyWalletController>(\"privy\")`\n// without pulling the factory (or @privy-io) into its bundle.\nexport type {\n PrivyAuthState,\n PrivyEmailStatus,\n PrivyWalletController,\n SendCodeOptions,\n} from \"./types.js\";\n"],"mappings":";;;AAQA,SAAgB,aACd,QACyB;AACzB,QAAO;EACL,MAAM;GACJ,GAAG;GACH,kBAAkB,oBAAoB,OAAO,QAAQ;GACtD;EACD,YACE,OAAO,gBAAgB,MAAM,MAAM,EAAE,mBAAmB,OAAO,CAAC;EACnE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/privy/index.ts"],"sourcesContent":["import type { WalletAdapterDescriptor } from \"../types.js\";\nimport {\n privyAdapterMeta,\n resolvePrivyMethods,\n type PHRenownPrivyAdapterConfig,\n} from \"./meta.js\";\n\n/** Privy wallet adapter (embedded wallets plus social / email login) for `RenownWalletProvider`. Importing this module loads no wallet library — `@privy-io/react-auth` is fetched by `load()` on the first login click — but it does make that package a build-time requirement, so install it alongside this import. */\nexport function privyAdapter(\n config: PHRenownPrivyAdapterConfig,\n): WalletAdapterDescriptor {\n return {\n meta: {\n ...privyAdapterMeta,\n supportedMethods: resolvePrivyMethods(config.methods),\n },\n load: () =>\n import(\"./factory.js\").then((m) => m.createPrivyAdapter(config)),\n };\n}\n\nexport {\n DEFAULT_PRIVY_METHODS,\n privyAdapterMeta,\n resolvePrivyMethods,\n} from \"./meta.js\";\nexport type {\n PHRenownPrivyAdapterConfig,\n PrivyChain,\n PrivyLoginMethod,\n} from \"./meta.js\";\n// Type-only: lets a host type `useRenownWalletAdapter<PrivyWalletController>(\"privy\")`\n// without pulling the factory (or @privy-io) into its bundle.\nexport type {\n PrivyAuthState,\n PrivyEmailStatus,\n PrivyWalletController,\n SendCodeOptions,\n} from \"./types.js\";\n"],"mappings":";;;AAQA,SAAgB,aACd,QACyB;CACzB,OAAO;EACL,MAAM;GACJ,GAAG;GACH,kBAAkB,oBAAoB,OAAO,OAAO;EACtD;EACA,YACE,OAAO,eAAe,CAAC,MAAM,MAAM,EAAE,mBAAmB,MAAM,CAAC;CACnE;AACF"}
@@ -1,7 +1,8 @@
1
- import { a as WalletAdapterImpl } from "../../types-ChjGDXVS.js";
2
- import { n as PHRenownRainbowAdapterConfig } from "../../meta-B8HbJHy8.js";
1
+ import { a as WalletAdapterImpl } from "../../types-CHIgkzKb.js";
2
+ import { n as PHRenownRainbowAdapterConfig } from "../../meta-CpBbgZnu.js";
3
+ import "@rainbow-me/rainbowkit/styles.css";
3
4
  //#region src/wallet/rainbow/factory.d.ts
4
- declare function createRainbowAdapter(config: PHRenownRainbowAdapterConfig): WalletAdapterImpl;
5
+ export declare function createRainbowAdapter(config: PHRenownRainbowAdapterConfig): WalletAdapterImpl;
5
6
  //#endregion
6
- export { createRainbowAdapter };
7
+ export {};
7
8
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","names":[],"sources":["../../../src/wallet/rainbow/factory.ts"],"mappings":";;;iBA2DgB,oBAAA,CACd,MAAA,EAAQ,4BAAA,GACP,iBAAA"}
1
+ {"version":3,"file":"factory.d.ts","names":[],"sources":["../../../src/wallet/rainbow/factory.ts"],"mappings":";;;;wBA2DgB,qBACd,QAAQ,+BACP"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import "../../constants-BexAR53F.js";
3
- import { n as normalizeWalletTheme, t as LoginMethod } from "../../types-ome2Ysme.js";
2
+ import "../../constants-DVOF17NB.js";
3
+ import { n as normalizeWalletTheme, t as LoginMethod } from "../../types-Dwy6khXb.js";
4
4
  import "@rainbow-me/rainbowkit/styles.css";
5
5
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
6
6
  import { disconnect, getAccount, signTypedData, watchAccount } from "wagmi/actions";
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":["useConnectModal","rainbowUseConnectModal","getDefaultConfig","rainbowGetDefaultConfig","injectedWallet","rainbowInjectedWallet","safeWallet","rainbowSafeWallet","lightTheme","rainbowLightTheme","darkTheme","rainbowDarkTheme","RainbowKitProvider","RainbowKitProviderRaw","wagmiSignTypedData","wagmiDisconnect"],"sources":["../../../src/wallet/rainbow/bridge.tsx","../../../src/wallet/rainbow/config.ts","../../../src/wallet/rainbow/provider.tsx","../../../src/wallet/rainbow/factory.ts"],"sourcesContent":["import { useConnectModal as rainbowUseConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { useEffect, useRef } from \"react\";\n\n// RainbowKit ships types via an exports map with no \"types\" condition, so\n// type-aware lint sees it as error-typed; assert the shape we rely on.\nconst useConnectModal = rainbowUseConnectModal as () => {\n openConnectModal: (() => void) | undefined;\n connectModalOpen: boolean;\n};\n\n// Imperative handle the controller reads across the React boundary: the bridge\n// component feeds it RainbowKit's modal opener and pending-login cancellation.\nexport interface RainbowBridge {\n getOpenConnectModal: () => (() => void) | null;\n setOpenConnectModal: (open: (() => void) | null) => void;\n /** Resolve once the modal opener is published, or reject after `timeoutMs`. */\n whenOpenConnectModalReady: (timeoutMs?: number) => Promise<() => void>;\n setPendingReject: (reject: ((error: Error) => void) | null) => void;\n handleModalClosed: () => void;\n}\n\n// Plain-JS bridge (created outside React) so effects only call its methods\n// rather than mutating a prop, satisfying the react-hooks immutability rule.\nexport function createRainbowBridge(): RainbowBridge {\n let openConnectModal: (() => void) | null = null;\n let pendingReject: ((error: Error) => void) | null = null;\n // connect() may fire before the RainbowKit Provider's effect publishes the\n // opener (wagmi reconnect / StrictMode double-invoke); these waiters bridge it.\n let readyWaiters: Array<(open: () => void) => void> = [];\n return {\n getOpenConnectModal: () => openConnectModal,\n setOpenConnectModal: (open) => {\n openConnectModal = open;\n if (open && readyWaiters.length) {\n const waiters = readyWaiters;\n readyWaiters = [];\n for (const resolve of waiters) resolve(open);\n }\n },\n whenOpenConnectModalReady: (timeoutMs = 8000) => {\n if (openConnectModal) return Promise.resolve(openConnectModal);\n return new Promise<() => void>((resolve, reject) => {\n const waiter = (open: () => void) => {\n clearTimeout(timer);\n resolve(open);\n };\n const timer = setTimeout(() => {\n readyWaiters = readyWaiters.filter((w) => w !== waiter);\n reject(\n new Error(\n \"rainbow adapter: connect modal unavailable. Ensure the adapter Provider is mounted.\",\n ),\n );\n }, timeoutMs);\n readyWaiters.push(waiter);\n });\n },\n setPendingReject: (reject) => {\n pendingReject = reject;\n },\n handleModalClosed: () => {\n const reject = pendingReject;\n pendingReject = null;\n if (reject) reject(new Error(\"Login cancelled by user\"));\n },\n };\n}\n\n// Wires RainbowKit's useConnectModal into the bridge so the controller's\n// connect() can open the React-only modal, and cancels on modal dismissal.\nexport function RainbowAdapterBridge({ bridge }: { bridge: RainbowBridge }) {\n const { openConnectModal, connectModalOpen } = useConnectModal();\n const wasOpen = useRef(false);\n\n useEffect(() => {\n bridge.setOpenConnectModal(openConnectModal ?? null);\n return () => bridge.setOpenConnectModal(null);\n }, [bridge, openConnectModal]);\n\n useEffect(() => {\n if (connectModalOpen) {\n wasOpen.current = true;\n return;\n }\n if (wasOpen.current) {\n wasOpen.current = false;\n bridge.handleModalClosed();\n }\n }, [bridge, connectModalOpen]);\n\n return null;\n}\n","import { getDefaultConfig as rainbowGetDefaultConfig } from \"@rainbow-me/rainbowkit\";\nimport {\n injectedWallet as rainbowInjectedWallet,\n safeWallet as rainbowSafeWallet,\n} from \"@rainbow-me/rainbowkit/wallets\";\nimport { http, type Config } from \"wagmi\";\nimport { mainnet } from \"wagmi/chains\";\nimport { DEFAULT_RENOWN_CHAIN_ID } from \"../../constants.js\";\nimport type { PHRenownChain, PHRenownRainbowAdapterConfig } from \"./meta.js\";\n\n// RainbowKit ships types via an exports map with no \"types\" condition, so\n// type-aware lint sees them as error-typed; assert the shapes we rely on.\ntype WalletCreator = () => unknown;\ninterface WalletGroup {\n groupName: string;\n wallets: WalletCreator[];\n}\nconst getDefaultConfig = rainbowGetDefaultConfig as (params: {\n appName: string;\n projectId: string;\n chains: readonly [unknown, ...unknown[]];\n wallets?: WalletGroup[];\n transports: Record<number, unknown>;\n ssr?: boolean;\n}) => Config;\nconst injectedWallet = rainbowInjectedWallet as WalletCreator;\nconst safeWallet = rainbowSafeWallet as WalletCreator;\n\n/** The wallets that work with no WalletConnect project id. Composed rather than subtracted from `getDefaultWallets()`, whose other entries fall back to WalletConnect themselves, so dropping just its entry still leaves buttons that cannot connect. */\nexport function walletsWithoutWalletConnect(): WalletGroup[] {\n return [{ groupName: \"Installed\", wallets: [injectedWallet, safeWallet] }];\n}\n\n// Matches DEFAULT_RENOWN_CHAIN_ID: the issuer DID embeds the chain the wallet\n// signs on, so offering others would let one wallet mint several identities.\nconst DEFAULT_CHAINS: readonly [PHRenownChain, ...PHRenownChain[]] = [mainnet];\n\n// Keyed by id rather than by chain, which would import them. A chain that is not\n// listed falls back to the RPC in its own definition.\nconst INFURA_SUBDOMAINS: Record<number, string> = {\n 1: \"mainnet\",\n 11155111: \"sepolia\",\n 137: \"polygon-mainnet\",\n 10: \"optimism-mainnet\",\n 42161: \"arbitrum-mainnet\",\n 8453: \"base-mainnet\",\n};\n\n// Build the wagmi + RainbowKit config from operator-provided project ids.\n// Ported from renown/utils/wagmi.ts (env vars replaced by config fields).\nexport function buildWagmiConfig(config: PHRenownRainbowAdapterConfig): Config {\n const {\n walletConnectProjectId,\n infuraProjectId,\n appName = \"Renown\",\n chains = DEFAULT_CHAINS,\n ssr,\n } = config;\n\n // renown.signIn() rejects a session from any other chain, so say so here\n // rather than at the end of a login the user cannot complete.\n if (!chains.some((chain) => chain.id === Number(DEFAULT_RENOWN_CHAIN_ID))) {\n console.warn(\n `renown rainbow adapter: none of the configured chains is ${DEFAULT_RENOWN_CHAIN_ID}, the chain credentials are issued on — sign-in will be rejected unless the Renown chain id is configured to match.`,\n );\n }\n\n if (!walletConnectProjectId) {\n console.warn(\n \"renown rainbow adapter: walletConnectProjectId is not set — only an installed browser wallet (or a Safe App iframe) can sign in. Every other RainbowKit wallet connects over WalletConnect, which needs a project id.\",\n );\n }\n\n const infuraUrl = (chainId: number) => {\n const subdomain = INFURA_SUBDOMAINS[chainId];\n return infuraProjectId && subdomain\n ? `https://${subdomain}.infura.io/v3/${infuraProjectId}`\n : undefined;\n };\n\n return getDefaultConfig({\n appName,\n projectId: walletConnectProjectId || \"MISSING_WALLET_CONNECT_PROJECT_ID\",\n chains: chains as readonly [unknown, ...unknown[]],\n // On SSR hosts wagmi's Hydrate defers reconnect to an effect; without it that\n // runs during render, which setState-in-render warns via RainbowKit's modal.\n ssr,\n // Omit `wallets` to keep RainbowKit's default set (which needs the project\n // id) when one exists; otherwise offer only the WalletConnect-free wallets.\n ...(walletConnectProjectId\n ? {}\n : { wallets: walletsWithoutWalletConnect() }),\n transports: Object.fromEntries(\n chains.map((chain) => [chain.id, http(infuraUrl(chain.id))]),\n ),\n });\n}\n","import {\n RainbowKitProvider as RainbowKitProviderRaw,\n darkTheme as rainbowDarkTheme,\n lightTheme as rainbowLightTheme,\n} from \"@rainbow-me/rainbowkit\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { useMemo, type ComponentType, type ReactNode } from \"react\";\nimport { WagmiProvider, type Config } from \"wagmi\";\nimport { normalizeWalletTheme, type WalletTheme } from \"../types.js\";\nimport { RainbowAdapterBridge, type RainbowBridge } from \"./bridge.js\";\n\n// RainbowKit ships types via an exports map with no \"types\" condition, so\n// type-aware lint sees them as error-typed; assert the shapes we rely on.\ntype RainbowKitTheme = Record<string, unknown>;\ninterface RainbowThemeOptions {\n accentColor?: string;\n accentColorForeground?: string;\n borderRadius?: \"none\" | \"small\" | \"medium\" | \"large\";\n fontStack?: \"rounded\" | \"system\";\n overlayBlur?: \"none\" | \"small\" | \"large\";\n}\nconst lightTheme = rainbowLightTheme as (\n options?: RainbowThemeOptions,\n) => RainbowKitTheme;\nconst darkTheme = rainbowDarkTheme as (\n options?: RainbowThemeOptions,\n) => RainbowKitTheme;\nconst RainbowKitProvider = RainbowKitProviderRaw as ComponentType<{\n appInfo?: { appName?: string };\n theme?: RainbowKitTheme;\n children?: ReactNode;\n}>;\n\n// Map the host theme to a RainbowKit theme: light/dark scheme plus the accent\n// colors the host passes in (omitted colors fall back to RainbowKit defaults).\nfunction buildRainbowKitTheme(theme: WalletTheme | undefined): RainbowKitTheme {\n const { mode, accentColor, accentColorForeground } =\n normalizeWalletTheme(theme);\n const options: RainbowThemeOptions = {\n accentColor,\n accentColorForeground,\n borderRadius: \"medium\",\n fontStack: \"system\",\n overlayBlur: \"small\",\n };\n return mode === \"dark\" ? darkTheme(options) : lightTheme(options);\n}\n\n// Build the adapter Provider: mounts wagmi + react-query + RainbowKit and the\n// bridge, so useController() (called under it) can drive the connect modal.\nexport function createRainbowProvider(options: {\n wagmiConfig: Config;\n queryClient: QueryClient;\n bridge: RainbowBridge;\n appName: string;\n}): ComponentType<{ children: ReactNode; theme?: WalletTheme }> {\n const { wagmiConfig, queryClient, bridge, appName } = options;\n\n return function RainbowAuthProvider({\n children,\n theme,\n }: {\n children: ReactNode;\n theme?: WalletTheme;\n }) {\n const rainbowKitTheme = useMemo(() => buildRainbowKitTheme(theme), [theme]);\n return (\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={queryClient}>\n <RainbowKitProvider appInfo={{ appName }} theme={rainbowKitTheme}>\n <RainbowAdapterBridge bridge={bridge} />\n {children}\n </RainbowKitProvider>\n </QueryClientProvider>\n </WagmiProvider>\n );\n };\n}\n","// Renders React (RainbowKitProvider + wagmi hooks), so RSC hosts must treat this\n// as a client module even though the descriptor entry reaches it lazily.\n\"use client\";\n\n// RainbowKit's modal styles; without them the connect modal renders unstyled.\n// Loaded lazily with this adapter, so it costs nothing until it's activated.\nimport \"@rainbow-me/rainbowkit/styles.css\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport type { Config } from \"wagmi\";\nimport {\n disconnect as wagmiDisconnect,\n getAccount,\n signTypedData as wagmiSignTypedData,\n watchAccount,\n type GetAccountReturnType,\n} from \"wagmi/actions\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport {\n LoginMethod,\n type WalletAdapterImpl,\n type WalletController,\n type WalletSession,\n} from \"../types.js\";\nimport { createRainbowBridge } from \"./bridge.js\";\nimport { buildWagmiConfig } from \"./config.js\";\nimport type { PHRenownRainbowAdapterConfig } from \"./meta.js\";\nimport { createRainbowProvider } from \"./provider.js\";\n\ntype ConnectedAccount = Extract<GetAccountReturnType, { status: \"connected\" }>;\n\n// Wagmi actions accept the broader viem typed-data shape; buildAndSignCredential\n// already strips EIP712Domain, so viem derives the domain type from `domain`.\nfunction makeSignTypedData(\n config: Config,\n address: `0x${string}`,\n): SignCredentialTypedData {\n return (args) =>\n wagmiSignTypedData(config, {\n account: address,\n domain: args.domain,\n types: args.types as Record<\n string,\n readonly { name: string; type: string }[]\n >,\n primaryType: args.primaryType,\n message: args.message,\n });\n}\n\nfunction toSession(config: Config, account: ConnectedAccount): WalletSession {\n return {\n address: account.address,\n chainId: account.chainId,\n signTypedData: makeSignTypedData(config, account.address),\n };\n}\n\n// wagmi + RainbowKit external-wallet adapter. connect() opens the RainbowKit\n// modal and resolves once wagmi reports a connected account.\nexport function createRainbowAdapter(\n config: PHRenownRainbowAdapterConfig,\n): WalletAdapterImpl {\n const wagmiConfig = buildWagmiConfig(config);\n const queryClient = new QueryClient();\n const bridge = createRainbowBridge();\n const appName = config.appName ?? \"Renown\";\n\n const Provider = createRainbowProvider({\n wagmiConfig,\n queryClient,\n bridge,\n appName,\n });\n\n const controller: WalletController = {\n getSession() {\n const account = getAccount(wagmiConfig);\n return account.status === \"connected\"\n ? toSession(wagmiConfig, account)\n : undefined;\n },\n async disconnect() {\n await wagmiDisconnect(wagmiConfig);\n },\n connect(method?: LoginMethod) {\n if (method && method !== LoginMethod.WALLET) {\n return Promise.reject(\n new Error(\n `rainbow adapter does not support login method \"${method}\"`,\n ),\n );\n }\n\n const existing = getAccount(wagmiConfig);\n if (existing.status === \"connected\") {\n return Promise.resolve(toSession(wagmiConfig, existing));\n }\n\n return new Promise<WalletSession>((resolve, reject) => {\n const unwatch = watchAccount(wagmiConfig, {\n onChange(account) {\n if (account.status === \"connected\") {\n unwatch();\n bridge.setPendingReject(null);\n resolve(toSession(wagmiConfig, account));\n }\n },\n });\n bridge.setPendingReject((error) => {\n unwatch();\n reject(error);\n });\n // Wait for the RainbowKit Provider to publish the modal opener (it can\n // lag connect() during wagmi reconnect / StrictMode remount), then open.\n bridge.whenOpenConnectModalReady().then(\n (open) => {\n try {\n open();\n } catch (error) {\n unwatch();\n bridge.setPendingReject(null);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n },\n (error: unknown) => {\n unwatch();\n bridge.setPendingReject(null);\n reject(error instanceof Error ? error : new Error(String(error)));\n },\n );\n });\n },\n };\n\n return { Provider, useController: () => controller };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","names":["useConnectModal","rainbowUseConnectModal","getDefaultConfig","rainbowGetDefaultConfig","injectedWallet","rainbowInjectedWallet","safeWallet","rainbowSafeWallet","lightTheme","rainbowLightTheme","darkTheme","rainbowDarkTheme","RainbowKitProvider","RainbowKitProviderRaw","wagmiSignTypedData","wagmiDisconnect"],"sources":["../../../src/wallet/rainbow/bridge.tsx","../../../src/wallet/rainbow/config.ts","../../../src/wallet/rainbow/provider.tsx","../../../src/wallet/rainbow/factory.ts"],"sourcesContent":["import { useConnectModal as rainbowUseConnectModal } from \"@rainbow-me/rainbowkit\";\nimport { useEffect, useRef } from \"react\";\n\n// RainbowKit ships types via an exports map with no \"types\" condition, so\n// type-aware lint sees it as error-typed; assert the shape we rely on.\nconst useConnectModal = rainbowUseConnectModal as () => {\n openConnectModal: (() => void) | undefined;\n connectModalOpen: boolean;\n};\n\n// Imperative handle the controller reads across the React boundary: the bridge\n// component feeds it RainbowKit's modal opener and pending-login cancellation.\nexport interface RainbowBridge {\n getOpenConnectModal: () => (() => void) | null;\n setOpenConnectModal: (open: (() => void) | null) => void;\n /** Resolve once the modal opener is published, or reject after `timeoutMs`. */\n whenOpenConnectModalReady: (timeoutMs?: number) => Promise<() => void>;\n setPendingReject: (reject: ((error: Error) => void) | null) => void;\n handleModalClosed: () => void;\n}\n\n// Plain-JS bridge (created outside React) so effects only call its methods\n// rather than mutating a prop, satisfying the react-hooks immutability rule.\nexport function createRainbowBridge(): RainbowBridge {\n let openConnectModal: (() => void) | null = null;\n let pendingReject: ((error: Error) => void) | null = null;\n // connect() may fire before the RainbowKit Provider's effect publishes the\n // opener (wagmi reconnect / StrictMode double-invoke); these waiters bridge it.\n let readyWaiters: Array<(open: () => void) => void> = [];\n return {\n getOpenConnectModal: () => openConnectModal,\n setOpenConnectModal: (open) => {\n openConnectModal = open;\n if (open && readyWaiters.length) {\n const waiters = readyWaiters;\n readyWaiters = [];\n for (const resolve of waiters) resolve(open);\n }\n },\n whenOpenConnectModalReady: (timeoutMs = 8000) => {\n if (openConnectModal) return Promise.resolve(openConnectModal);\n return new Promise<() => void>((resolve, reject) => {\n const waiter = (open: () => void) => {\n clearTimeout(timer);\n resolve(open);\n };\n const timer = setTimeout(() => {\n readyWaiters = readyWaiters.filter((w) => w !== waiter);\n reject(\n new Error(\n \"rainbow adapter: connect modal unavailable. Ensure the adapter Provider is mounted.\",\n ),\n );\n }, timeoutMs);\n readyWaiters.push(waiter);\n });\n },\n setPendingReject: (reject) => {\n pendingReject = reject;\n },\n handleModalClosed: () => {\n const reject = pendingReject;\n pendingReject = null;\n if (reject) reject(new Error(\"Login cancelled by user\"));\n },\n };\n}\n\n// Wires RainbowKit's useConnectModal into the bridge so the controller's\n// connect() can open the React-only modal, and cancels on modal dismissal.\nexport function RainbowAdapterBridge({ bridge }: { bridge: RainbowBridge }) {\n const { openConnectModal, connectModalOpen } = useConnectModal();\n const wasOpen = useRef(false);\n\n useEffect(() => {\n bridge.setOpenConnectModal(openConnectModal ?? null);\n return () => bridge.setOpenConnectModal(null);\n }, [bridge, openConnectModal]);\n\n useEffect(() => {\n if (connectModalOpen) {\n wasOpen.current = true;\n return;\n }\n if (wasOpen.current) {\n wasOpen.current = false;\n bridge.handleModalClosed();\n }\n }, [bridge, connectModalOpen]);\n\n return null;\n}\n","import { getDefaultConfig as rainbowGetDefaultConfig } from \"@rainbow-me/rainbowkit\";\nimport {\n injectedWallet as rainbowInjectedWallet,\n safeWallet as rainbowSafeWallet,\n} from \"@rainbow-me/rainbowkit/wallets\";\nimport { http, type Config } from \"wagmi\";\nimport { mainnet } from \"wagmi/chains\";\nimport { DEFAULT_RENOWN_CHAIN_ID } from \"../../constants.js\";\nimport type { PHRenownChain, PHRenownRainbowAdapterConfig } from \"./meta.js\";\n\n// RainbowKit ships types via an exports map with no \"types\" condition, so\n// type-aware lint sees them as error-typed; assert the shapes we rely on.\ntype WalletCreator = () => unknown;\ninterface WalletGroup {\n groupName: string;\n wallets: WalletCreator[];\n}\nconst getDefaultConfig = rainbowGetDefaultConfig as (params: {\n appName: string;\n projectId: string;\n chains: readonly [unknown, ...unknown[]];\n wallets?: WalletGroup[];\n transports: Record<number, unknown>;\n ssr?: boolean;\n}) => Config;\nconst injectedWallet = rainbowInjectedWallet as WalletCreator;\nconst safeWallet = rainbowSafeWallet as WalletCreator;\n\n/** The wallets that work with no WalletConnect project id. Composed rather than subtracted from `getDefaultWallets()`, whose other entries fall back to WalletConnect themselves, so dropping just its entry still leaves buttons that cannot connect. */\nexport function walletsWithoutWalletConnect(): WalletGroup[] {\n return [{ groupName: \"Installed\", wallets: [injectedWallet, safeWallet] }];\n}\n\n// Matches DEFAULT_RENOWN_CHAIN_ID: the issuer DID embeds the chain the wallet\n// signs on, so offering others would let one wallet mint several identities.\nconst DEFAULT_CHAINS: readonly [PHRenownChain, ...PHRenownChain[]] = [mainnet];\n\n// Keyed by id rather than by chain, which would import them. A chain that is not\n// listed falls back to the RPC in its own definition.\nconst INFURA_SUBDOMAINS: Record<number, string> = {\n 1: \"mainnet\",\n 11155111: \"sepolia\",\n 137: \"polygon-mainnet\",\n 10: \"optimism-mainnet\",\n 42161: \"arbitrum-mainnet\",\n 8453: \"base-mainnet\",\n};\n\n// Build the wagmi + RainbowKit config from operator-provided project ids.\n// Ported from renown/utils/wagmi.ts (env vars replaced by config fields).\nexport function buildWagmiConfig(config: PHRenownRainbowAdapterConfig): Config {\n const {\n walletConnectProjectId,\n infuraProjectId,\n appName = \"Renown\",\n chains = DEFAULT_CHAINS,\n ssr,\n } = config;\n\n // renown.signIn() rejects a session from any other chain, so say so here\n // rather than at the end of a login the user cannot complete.\n if (!chains.some((chain) => chain.id === Number(DEFAULT_RENOWN_CHAIN_ID))) {\n console.warn(\n `renown rainbow adapter: none of the configured chains is ${DEFAULT_RENOWN_CHAIN_ID}, the chain credentials are issued on — sign-in will be rejected unless the Renown chain id is configured to match.`,\n );\n }\n\n if (!walletConnectProjectId) {\n console.warn(\n \"renown rainbow adapter: walletConnectProjectId is not set — only an installed browser wallet (or a Safe App iframe) can sign in. Every other RainbowKit wallet connects over WalletConnect, which needs a project id.\",\n );\n }\n\n const infuraUrl = (chainId: number) => {\n const subdomain = INFURA_SUBDOMAINS[chainId];\n return infuraProjectId && subdomain\n ? `https://${subdomain}.infura.io/v3/${infuraProjectId}`\n : undefined;\n };\n\n return getDefaultConfig({\n appName,\n projectId: walletConnectProjectId || \"MISSING_WALLET_CONNECT_PROJECT_ID\",\n chains: chains as readonly [unknown, ...unknown[]],\n // On SSR hosts wagmi's Hydrate defers reconnect to an effect; without it that\n // runs during render, which setState-in-render warns via RainbowKit's modal.\n ssr,\n // Omit `wallets` to keep RainbowKit's default set (which needs the project\n // id) when one exists; otherwise offer only the WalletConnect-free wallets.\n ...(walletConnectProjectId\n ? {}\n : { wallets: walletsWithoutWalletConnect() }),\n transports: Object.fromEntries(\n chains.map((chain) => [chain.id, http(infuraUrl(chain.id))]),\n ),\n });\n}\n","import {\n RainbowKitProvider as RainbowKitProviderRaw,\n darkTheme as rainbowDarkTheme,\n lightTheme as rainbowLightTheme,\n} from \"@rainbow-me/rainbowkit\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { useMemo, type ComponentType, type ReactNode } from \"react\";\nimport { WagmiProvider, type Config } from \"wagmi\";\nimport { normalizeWalletTheme, type WalletTheme } from \"../types.js\";\nimport { RainbowAdapterBridge, type RainbowBridge } from \"./bridge.js\";\n\n// RainbowKit ships types via an exports map with no \"types\" condition, so\n// type-aware lint sees them as error-typed; assert the shapes we rely on.\ntype RainbowKitTheme = Record<string, unknown>;\ninterface RainbowThemeOptions {\n accentColor?: string;\n accentColorForeground?: string;\n borderRadius?: \"none\" | \"small\" | \"medium\" | \"large\";\n fontStack?: \"rounded\" | \"system\";\n overlayBlur?: \"none\" | \"small\" | \"large\";\n}\nconst lightTheme = rainbowLightTheme as (\n options?: RainbowThemeOptions,\n) => RainbowKitTheme;\nconst darkTheme = rainbowDarkTheme as (\n options?: RainbowThemeOptions,\n) => RainbowKitTheme;\nconst RainbowKitProvider = RainbowKitProviderRaw as ComponentType<{\n appInfo?: { appName?: string };\n theme?: RainbowKitTheme;\n children?: ReactNode;\n}>;\n\n// Map the host theme to a RainbowKit theme: light/dark scheme plus the accent\n// colors the host passes in (omitted colors fall back to RainbowKit defaults).\nfunction buildRainbowKitTheme(theme: WalletTheme | undefined): RainbowKitTheme {\n const { mode, accentColor, accentColorForeground } =\n normalizeWalletTheme(theme);\n const options: RainbowThemeOptions = {\n accentColor,\n accentColorForeground,\n borderRadius: \"medium\",\n fontStack: \"system\",\n overlayBlur: \"small\",\n };\n return mode === \"dark\" ? darkTheme(options) : lightTheme(options);\n}\n\n// Build the adapter Provider: mounts wagmi + react-query + RainbowKit and the\n// bridge, so useController() (called under it) can drive the connect modal.\nexport function createRainbowProvider(options: {\n wagmiConfig: Config;\n queryClient: QueryClient;\n bridge: RainbowBridge;\n appName: string;\n}): ComponentType<{ children: ReactNode; theme?: WalletTheme }> {\n const { wagmiConfig, queryClient, bridge, appName } = options;\n\n return function RainbowAuthProvider({\n children,\n theme,\n }: {\n children: ReactNode;\n theme?: WalletTheme;\n }) {\n const rainbowKitTheme = useMemo(() => buildRainbowKitTheme(theme), [theme]);\n return (\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={queryClient}>\n <RainbowKitProvider appInfo={{ appName }} theme={rainbowKitTheme}>\n <RainbowAdapterBridge bridge={bridge} />\n {children}\n </RainbowKitProvider>\n </QueryClientProvider>\n </WagmiProvider>\n );\n };\n}\n","// Renders React (RainbowKitProvider + wagmi hooks), so RSC hosts must treat this\n// as a client module even though the descriptor entry reaches it lazily.\n\"use client\";\n\n// RainbowKit's modal styles; without them the connect modal renders unstyled.\n// Loaded lazily with this adapter, so it costs nothing until it's activated.\nimport \"@rainbow-me/rainbowkit/styles.css\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport type { Config } from \"wagmi\";\nimport {\n disconnect as wagmiDisconnect,\n getAccount,\n signTypedData as wagmiSignTypedData,\n watchAccount,\n type GetAccountReturnType,\n} from \"wagmi/actions\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport {\n LoginMethod,\n type WalletAdapterImpl,\n type WalletController,\n type WalletSession,\n} from \"../types.js\";\nimport { createRainbowBridge } from \"./bridge.js\";\nimport { buildWagmiConfig } from \"./config.js\";\nimport type { PHRenownRainbowAdapterConfig } from \"./meta.js\";\nimport { createRainbowProvider } from \"./provider.js\";\n\ntype ConnectedAccount = Extract<GetAccountReturnType, { status: \"connected\" }>;\n\n// Wagmi actions accept the broader viem typed-data shape; buildAndSignCredential\n// already strips EIP712Domain, so viem derives the domain type from `domain`.\nfunction makeSignTypedData(\n config: Config,\n address: `0x${string}`,\n): SignCredentialTypedData {\n return (args) =>\n wagmiSignTypedData(config, {\n account: address,\n domain: args.domain,\n types: args.types as Record<\n string,\n readonly { name: string; type: string }[]\n >,\n primaryType: args.primaryType,\n message: args.message,\n });\n}\n\nfunction toSession(config: Config, account: ConnectedAccount): WalletSession {\n return {\n address: account.address,\n chainId: account.chainId,\n signTypedData: makeSignTypedData(config, account.address),\n };\n}\n\n// wagmi + RainbowKit external-wallet adapter. connect() opens the RainbowKit\n// modal and resolves once wagmi reports a connected account.\nexport function createRainbowAdapter(\n config: PHRenownRainbowAdapterConfig,\n): WalletAdapterImpl {\n const wagmiConfig = buildWagmiConfig(config);\n const queryClient = new QueryClient();\n const bridge = createRainbowBridge();\n const appName = config.appName ?? \"Renown\";\n\n const Provider = createRainbowProvider({\n wagmiConfig,\n queryClient,\n bridge,\n appName,\n });\n\n const controller: WalletController = {\n getSession() {\n const account = getAccount(wagmiConfig);\n return account.status === \"connected\"\n ? toSession(wagmiConfig, account)\n : undefined;\n },\n async disconnect() {\n await wagmiDisconnect(wagmiConfig);\n },\n connect(method?: LoginMethod) {\n if (method && method !== LoginMethod.WALLET) {\n return Promise.reject(\n new Error(\n `rainbow adapter does not support login method \"${method}\"`,\n ),\n );\n }\n\n const existing = getAccount(wagmiConfig);\n if (existing.status === \"connected\") {\n return Promise.resolve(toSession(wagmiConfig, existing));\n }\n\n return new Promise<WalletSession>((resolve, reject) => {\n const unwatch = watchAccount(wagmiConfig, {\n onChange(account) {\n if (account.status === \"connected\") {\n unwatch();\n bridge.setPendingReject(null);\n resolve(toSession(wagmiConfig, account));\n }\n },\n });\n bridge.setPendingReject((error) => {\n unwatch();\n reject(error);\n });\n // Wait for the RainbowKit Provider to publish the modal opener (it can\n // lag connect() during wagmi reconnect / StrictMode remount), then open.\n bridge.whenOpenConnectModalReady().then(\n (open) => {\n try {\n open();\n } catch (error) {\n unwatch();\n bridge.setPendingReject(null);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n },\n (error: unknown) => {\n unwatch();\n bridge.setPendingReject(null);\n reject(error instanceof Error ? error : new Error(String(error)));\n },\n );\n });\n },\n };\n\n return { Provider, useController: () => controller };\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { r as WalletAdapterDescriptor } from "../../types-ChjGDXVS.js";
2
- import { i as rainbowAdapterMeta, n as PHRenownRainbowAdapterConfig, r as RAINBOW_METHODS, t as PHRenownChain } from "../../meta-B8HbJHy8.js";
3
-
1
+ import { r as WalletAdapterDescriptor } from "../../types-CHIgkzKb.js";
2
+ import { i as rainbowAdapterMeta, n as PHRenownRainbowAdapterConfig, r as RAINBOW_METHODS, t as PHRenownChain } from "../../meta-CpBbgZnu.js";
4
3
  //#region src/wallet/rainbow/index.d.ts
5
4
  /** RainbowKit + wagmi wallet adapter (external / injected wallets) for `RenownWalletProvider`. Importing this module loads no wallet library — `@rainbow-me/rainbowkit`, `wagmi` and `@tanstack/react-query` are fetched by `load()` on the first login click — but it does make them build-time requirements, so install them alongside this import. Pass `ssr: true` on server-rendered hosts. */
6
- declare function rainbowAdapter(config: PHRenownRainbowAdapterConfig): WalletAdapterDescriptor;
5
+ export declare function rainbowAdapter(config: PHRenownRainbowAdapterConfig): WalletAdapterDescriptor;
7
6
  //#endregion
8
- export { type PHRenownChain, type PHRenownRainbowAdapterConfig, RAINBOW_METHODS, rainbowAdapter, rainbowAdapterMeta };
7
+ export { type PHRenownChain, type PHRenownRainbowAdapterConfig, RAINBOW_METHODS, rainbowAdapterMeta };
8
+ export {};
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/rainbow/index.ts"],"mappings":";;;;;iBAOgB,cAAA,CACd,MAAA,EAAQ,4BAAA,GACP,uBAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/rainbow/index.ts"],"mappings":";;;;wBAOgB,eACd,QAAQ,+BACP"}
@@ -1,4 +1,4 @@
1
- import { t as LoginMethod } from "../../types-ome2Ysme.js";
1
+ import { t as LoginMethod } from "../../types-Dwy6khXb.js";
2
2
  //#region src/wallet/rainbow/meta.ts
3
3
  const RAINBOW_METHODS = [LoginMethod.WALLET];
4
4
  const rainbowAdapterMeta = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/rainbow/meta.ts","../../../src/wallet/rainbow/index.ts"],"sourcesContent":["import { LoginMethod, type WalletAdapterMeta } from \"../types.js\";\n\n// Any `wagmi/chains` export satisfies this. Declared here so the module stays\n// free of wallet-peer imports, type ones included.\nexport interface PHRenownChain {\n id: number;\n name: string;\n}\n\n// Config slice this adapter consumes; operators pass the same shape from\n// powerhouse.config.json. No `methods`: this adapter only does wallet login.\nexport interface PHRenownRainbowAdapterConfig {\n // Optional, but without it only an installed browser wallet (or a Safe App\n // iframe) can sign in — every other wallet needs it. See buildWagmiConfig.\n walletConnectProjectId?: string;\n infuraProjectId?: string;\n appName?: string;\n // From `wagmi/chains`; defaults to mainnet alone, as each one adds bundle\n // weight. A wallet on a chain outside this list must switch to sign in.\n chains?: readonly [PHRenownChain, ...PHRenownChain[]];\n // Opt-in for server-rendered hosts (e.g. Next.js) so wagmi defers its hydrate\n // reconnect to an effect instead of running it during render.\n ssr?: boolean;\n}\n\nexport const RAINBOW_METHODS: LoginMethod[] = [LoginMethod.WALLET];\n\n// Dependency-free identity (see privy/meta.ts). Injected wallets have no\n// full-page OAuth redirect, so no redirect-return params.\nexport const rainbowAdapterMeta: WalletAdapterMeta = {\n id: \"rainbow\",\n redirectReturnParams: [],\n supportedMethods: RAINBOW_METHODS,\n};\n","import type { WalletAdapterDescriptor } from \"../types.js\";\nimport {\n rainbowAdapterMeta,\n type PHRenownRainbowAdapterConfig,\n} from \"./meta.js\";\n\n/** RainbowKit + wagmi wallet adapter (external / injected wallets) for `RenownWalletProvider`. Importing this module loads no wallet library — `@rainbow-me/rainbowkit`, `wagmi` and `@tanstack/react-query` are fetched by `load()` on the first login click — but it does make them build-time requirements, so install them alongside this import. Pass `ssr: true` on server-rendered hosts. */\nexport function rainbowAdapter(\n config: PHRenownRainbowAdapterConfig,\n): WalletAdapterDescriptor {\n return {\n meta: rainbowAdapterMeta,\n load: () =>\n import(\"./factory.js\").then((m) => m.createRainbowAdapter(config)),\n };\n}\n\nexport { RAINBOW_METHODS, rainbowAdapterMeta } from \"./meta.js\";\nexport type { PHRenownChain, PHRenownRainbowAdapterConfig } from \"./meta.js\";\n"],"mappings":";;AAyBA,MAAa,kBAAiC,CAAC,YAAY,OAAO;AAIlE,MAAa,qBAAwC;CACnD,IAAI;CACJ,sBAAsB,EAAE;CACxB,kBAAkB;CACnB;;;;AC1BD,SAAgB,eACd,QACyB;AACzB,QAAO;EACL,MAAM;EACN,YACE,OAAO,gBAAgB,MAAM,MAAM,EAAE,qBAAqB,OAAO,CAAC;EACrE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/rainbow/meta.ts","../../../src/wallet/rainbow/index.ts"],"sourcesContent":["import { LoginMethod, type WalletAdapterMeta } from \"../types.js\";\n\n// Any `wagmi/chains` export satisfies this. Declared here so the module stays\n// free of wallet-peer imports, type ones included.\nexport interface PHRenownChain {\n id: number;\n name: string;\n}\n\n// Config slice this adapter consumes; operators pass the same shape from\n// powerhouse.config.json. No `methods`: this adapter only does wallet login.\nexport interface PHRenownRainbowAdapterConfig {\n // Optional, but without it only an installed browser wallet (or a Safe App\n // iframe) can sign in — every other wallet needs it. See buildWagmiConfig.\n walletConnectProjectId?: string;\n infuraProjectId?: string;\n appName?: string;\n // From `wagmi/chains`; defaults to mainnet alone, as each one adds bundle\n // weight. A wallet on a chain outside this list must switch to sign in.\n chains?: readonly [PHRenownChain, ...PHRenownChain[]];\n // Opt-in for server-rendered hosts (e.g. Next.js) so wagmi defers its hydrate\n // reconnect to an effect instead of running it during render.\n ssr?: boolean;\n}\n\nexport const RAINBOW_METHODS: LoginMethod[] = [LoginMethod.WALLET];\n\n// Dependency-free identity (see privy/meta.ts). Injected wallets have no\n// full-page OAuth redirect, so no redirect-return params.\nexport const rainbowAdapterMeta: WalletAdapterMeta = {\n id: \"rainbow\",\n redirectReturnParams: [],\n supportedMethods: RAINBOW_METHODS,\n};\n","import type { WalletAdapterDescriptor } from \"../types.js\";\nimport {\n rainbowAdapterMeta,\n type PHRenownRainbowAdapterConfig,\n} from \"./meta.js\";\n\n/** RainbowKit + wagmi wallet adapter (external / injected wallets) for `RenownWalletProvider`. Importing this module loads no wallet library — `@rainbow-me/rainbowkit`, `wagmi` and `@tanstack/react-query` are fetched by `load()` on the first login click — but it does make them build-time requirements, so install them alongside this import. Pass `ssr: true` on server-rendered hosts. */\nexport function rainbowAdapter(\n config: PHRenownRainbowAdapterConfig,\n): WalletAdapterDescriptor {\n return {\n meta: rainbowAdapterMeta,\n load: () =>\n import(\"./factory.js\").then((m) => m.createRainbowAdapter(config)),\n };\n}\n\nexport { RAINBOW_METHODS, rainbowAdapterMeta } from \"./meta.js\";\nexport type { PHRenownChain, PHRenownRainbowAdapterConfig } from \"./meta.js\";\n"],"mappings":";;AAyBA,MAAa,kBAAiC,CAAC,YAAY,MAAM;AAIjE,MAAa,qBAAwC;CACnD,IAAI;CACJ,sBAAsB,CAAC;CACvB,kBAAkB;AACpB;;;;AC1BA,SAAgB,eACd,QACyB;CACzB,OAAO;EACL,MAAM;EACN,YACE,OAAO,eAAe,CAAC,MAAM,MAAM,EAAE,qBAAqB,MAAM,CAAC;CACrE;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renown/sdk",
3
- "version": "6.2.3-dev.24",
3
+ "version": "6.2.3-dev.25",
4
4
  "description": "Renown SDK — wallet-based authentication and user identity management for Powerhouse React applications.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "private": false,
@@ -99,13 +99,14 @@
99
99
  "@tanstack/react-query": "^5.90.2",
100
100
  "@types/react": "19.2.14",
101
101
  "react": ">=19",
102
- "tsdown": "0.21.1",
102
+ "tsdown": "0.23.0",
103
+ "typescript": "7.0.2",
103
104
  "vitest": "4.1.1",
104
105
  "wagmi": "^2.19.5"
105
106
  },
106
107
  "dependencies": {
107
108
  "@didtools/key-webcrypto": "^0.2.0",
108
- "@powerhousedao/shared": "6.2.3-dev.24",
109
+ "@powerhousedao/shared": "6.2.3-dev.25",
109
110
  "did-jwt-vc": "^4.0.12",
110
111
  "did-resolver": "^4.1.0",
111
112
  "key-did-resolver": "^4.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-key-storage-CeyLjla8.js","names":["#db","#openDatabase","#useStore"],"sources":["../src/crypto/browser-key-storage.ts"],"sourcesContent":["import type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nconst DEFAULT_DB_NAME = \"renownKeyDB\";\nconst STORE_NAME = \"keyPairs\";\nconst KEY = \"keyPair\";\n\nexport class BrowserKeyStorage implements JsonWebKeyPairStorage {\n #db: IDBDatabase;\n\n constructor(db: IDBDatabase) {\n this.#db = db;\n }\n\n static async create(\n dbName: string = DEFAULT_DB_NAME,\n ): Promise<BrowserKeyStorage> {\n const db = await BrowserKeyStorage.#openDatabase(dbName);\n return new BrowserKeyStorage(db);\n }\n\n static #openDatabase(dbName: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName);\n\n req.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n\n req.onsuccess = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const currentVersion = db.version;\n db.close();\n const upgradeReq = indexedDB.open(dbName, currentVersion + 1);\n upgradeReq.onupgradeneeded = (event) => {\n const upgradeDb = (event.target as IDBOpenDBRequest).result;\n if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {\n upgradeDb.createObjectStore(STORE_NAME);\n }\n };\n upgradeReq.onsuccess = () => resolve(upgradeReq.result);\n upgradeReq.onerror = () => reject(upgradeReq.error as Error);\n } else {\n resolve(db);\n }\n };\n\n req.onerror = () => reject(req.error as Error);\n });\n }\n\n #useStore(mode: IDBTransactionMode = \"readwrite\") {\n const transaction = this.#db.transaction(STORE_NAME, mode);\n return transaction.objectStore(STORE_NAME);\n }\n\n async saveKeyPair(keyPair: JwkKeyPair) {\n const store = this.#useStore();\n const request = store.put(keyPair, KEY);\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(\"Failed to save key pair\"));\n });\n }\n\n async loadKeyPair(): Promise<JwkKeyPair | undefined> {\n const store = this.#useStore(\"readonly\");\n const request = store.get(KEY);\n\n return new Promise<JwkKeyPair | undefined>((resolve, reject) => {\n request.onsuccess = () => {\n const keyPair = request.result as JwkKeyPair | undefined;\n resolve(keyPair);\n };\n request.onerror = () => reject(new Error(\"Failed to load key pair\"));\n });\n }\n\n async removeKeyPair(): Promise<void> {\n const store = this.#useStore();\n const request = store.delete(KEY);\n\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(\"Failed to remove key pair\"));\n });\n }\n}\n"],"mappings":";AAEA,MAAM,kBAAkB;AACxB,MAAM,aAAa;AACnB,MAAM,MAAM;AAEZ,IAAa,oBAAb,MAAa,kBAAmD;CAC9D;CAEA,YAAY,IAAiB;AAC3B,QAAA,KAAW;;CAGb,aAAa,OACX,SAAiB,iBACW;AAE5B,SAAO,IAAI,kBADA,MAAM,mBAAA,aAAgC,OAAO,CACxB;;CAGlC,QAAA,aAAqB,QAAsC;AACzD,SAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,MAAM,UAAU,KAAK,OAAO;AAElC,OAAI,mBAAmB,UAAU;IAC/B,MAAM,KAAM,MAAM,OAA4B;AAC9C,QAAI,CAAC,GAAG,iBAAiB,SAAS,WAAW,CAC3C,IAAG,kBAAkB,WAAW;;AAIpC,OAAI,kBAAkB;IACpB,MAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAG,iBAAiB,SAAS,WAAW,EAAE;KAC7C,MAAM,iBAAiB,GAAG;AAC1B,QAAG,OAAO;KACV,MAAM,aAAa,UAAU,KAAK,QAAQ,iBAAiB,EAAE;AAC7D,gBAAW,mBAAmB,UAAU;MACtC,MAAM,YAAa,MAAM,OAA4B;AACrD,UAAI,CAAC,UAAU,iBAAiB,SAAS,WAAW,CAClD,WAAU,kBAAkB,WAAW;;AAG3C,gBAAW,kBAAkB,QAAQ,WAAW,OAAO;AACvD,gBAAW,gBAAgB,OAAO,WAAW,MAAe;UAE5D,SAAQ,GAAG;;AAIf,OAAI,gBAAgB,OAAO,IAAI,MAAe;IAC9C;;CAGJ,UAAU,OAA2B,aAAa;AAEhD,SADoB,MAAA,GAAS,YAAY,YAAY,KAAK,CACvC,YAAY,WAAW;;CAG5C,MAAM,YAAY,SAAqB;EAErC,MAAM,UADQ,MAAA,UAAgB,CACR,IAAI,SAAS,IAAI;AACvC,SAAO,IAAI,SAAe,SAAS,WAAW;AAC5C,WAAQ,kBAAkB,SAAS;AACnC,WAAQ,gBAAgB,uBAAO,IAAI,MAAM,0BAA0B,CAAC;IACpE;;CAGJ,MAAM,cAA+C;EAEnD,MAAM,UADQ,MAAA,SAAe,WAAW,CAClB,IAAI,IAAI;AAE9B,SAAO,IAAI,SAAiC,SAAS,WAAW;AAC9D,WAAQ,kBAAkB;IACxB,MAAM,UAAU,QAAQ;AACxB,YAAQ,QAAQ;;AAElB,WAAQ,gBAAgB,uBAAO,IAAI,MAAM,0BAA0B,CAAC;IACpE;;CAGJ,MAAM,gBAA+B;EAEnC,MAAM,UADQ,MAAA,UAAgB,CACR,OAAO,IAAI;AAEjC,SAAO,IAAI,SAAe,SAAS,WAAW;AAC5C,WAAQ,kBAAkB,SAAS;AACnC,WAAQ,gBAAgB,uBAAO,IAAI,MAAM,4BAA4B,CAAC;IACtE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Bcs-BY-C.d.ts","names":[],"sources":["../src/crypto/renown-crypto.ts","../src/crypto/renown-crypto-builder.ts","../src/crypto/memory-key-storage.ts","../src/crypto/signer.ts","../src/crypto/browser-key-storage.ts"],"mappings":";;;;cAUa,YAAA,YAAwB,aAAA;EAAA;WAK1B,GAAA,EAAK,GAAA;EALU;EAAA,SAOf,OAAA;EAAA,OAEF,SAAA,EAAS,cAAA;EAAA,OACT,aAAA;;;;;cAGL,cAAA,EAAgB,qBAAA,EAChB,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,aAAA,EACT,GAAA,EAAK,GAAA,EACL,OAAA;EAAA,IASE,SAAA,CAAA,GAAS,SAAA;EAIP,cAAA,CACJ,OAAA,sBACA,OAAA,GAAU,wBAAA,GACT,OAAA;EAUG,SAAA,CAAA,GAAa,OAAA;EAQb,IAAA,CAAK,IAAA,EAAM,UAAA,YAAsB,OAAA,CAAQ,UAAA;EAazC,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,UAAA,GAAa,OAAA;EAAA,IASnD,MAAA,CAAA,GAAU,MAAA;AAAA;;;;cAiBH,aAAA,SAAsB,YAAA;;;cC3FtB,mBAAA;EAAA;UACH,cAAA;EAAA,QACA,YAAA;EAAA,QACA,OAAA;EAER,kBAAA,CAAmB,OAAA,EAAS,qBAAA;EAK5B,gBAAA,CAAiB,MAAA,EAAQ,YAAA;EAOzB,WAAA,CAAY,OAAA;EAKN,KAAA,CAAA,GAAS,OAAA,CAAQ,YAAA;AAAA;;;cC7BZ,gBAAA,YAA4B,qBAAA;EAAA,QAC/B,OAAA;cAEI,OAAA,GAAU,UAAA;EAItB,WAAA,CAAA,GAAW,OAAA,CAAA,UAAA;EAIX,WAAA,CAAY,OAAA,EAAS,UAAA,GAAU,OAAA;EAK/B,aAAA,CAAA,GAAa,OAAA;AAAA;;;cCIF,kBAAA,YAA8B,OAAA;EAAA,iBAItB,MAAA;EAAA,iBACA,OAAA;EACV,IAAA,GAAO,gBAAA;EAAA,SALP,GAAA,EAAK,eAAA;cAGK,MAAA,EAAQ,aAAA,EACR,OAAA,UACV,IAAA,GAAO,gBAAA;EAAA,IAQZ,SAAA,CAAA,GAAS,SAAA;EAIP,IAAA,CAAK,IAAA,EAAM,UAAA,GAAa,OAAA,CAAQ,UAAA;EAIhC,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,UAAA,GAAa,OAAA;EAOjD,UAAA,CACJ,MAAA,EAAQ,MAAA,EACR,MAAA,EAAQ,mBAAA,EACR,WAAA,GAAc,WAAA,GACb,OAAA,CAAQ,SAAA;EHZR;;;;EGqBG,4BAAA,CACJ,MAAA,EAAQ,MAAA,EACR,MAAA,EAAQ,mBAAA,EACR,kBAAA,UACA,WAAA,GAAc,WAAA,GACb,OAAA,CAAQ,SAAA;EHKQ;;;;EGKb,gBAAA,CACJ,MAAA,EAAQ,MAAA,EACR,WAAA,GAAc,WAAA,GACb,OAAA,CAAQ,SAAA;EAAA,QAqBG,WAAA;EAAA,QAyBA,UAAA;EAAA,QAYN,qBAAA;EAAA,QASA,gBAAA;EAAA,QAQA,mBAAA;AAAA;;;;;iBAcM,uBAAA,CACd,gBAAA,aACC,4BAAA;;;;;;;;;;;iBAgNa,uBAAA,CAAwB,SAAA;EACtC,aAAA;EACA,kBAAA;AAAA;;;;;;;iBAuBc,iCAAA,CACd,SAAA,EAAW,SAAA;;;;;;;iBAaG,yBAAA,CAA0B,SAAA,EAAW,SAAA;;;cC9ZxC,iBAAA,YAA6B,qBAAA;EAAA;cAG5B,EAAA,EAAI,WAAA;EAAA,OAIH,MAAA,CACX,MAAA,YACC,OAAA,CAAQ,iBAAA;EA4CL,WAAA,CAAY,OAAA,EAAS,UAAA,GAAU,OAAA;EAS/B,WAAA,CAAA,GAAe,OAAA,CAAQ,UAAA;EAavB,aAAA,CAAA,GAAiB,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-credential-verifier-2aC00ymX.js","names":["#store","#eventEmitter","#baseUrl","#crypto","#appName","#profileFetcher","#switchboard","#chainId","#signer","#status","#updateStatus","#getCredential","#updateUser","#completeLogin","#listeners","#appName","#storage","#eventEmitter","#crypto","#keyPairStorage","#baseUrl","#switchboardUrl","#chainId","#profileFetcher"],"sources":["../src/storage/common.ts","../src/common.ts","../src/event/memory.ts","../src/profile.ts","../src/renown-builder.ts","../src/local-credential-verifier.ts"],"sourcesContent":["export interface IStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n Key extends keyof T = keyof T,\n> {\n get(key: Key): T[Key] | undefined;\n set(key: Key, value?: T[Key]): void;\n delete(key: Key): void;\n}\n\nexport abstract class BaseStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n Key extends keyof T = keyof T,\n> implements IStorage<T> {\n abstract get(key: Key): T[Key] | undefined;\n abstract set(key: Key, value?: T[Key]): void;\n abstract delete(key: Key): void;\n}\n\nexport class MemoryStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n Key extends keyof T = keyof T,\n> extends BaseStorage<T> {\n private readonly data = new Map<Key, T[Key]>();\n\n get(key: Key) {\n return this.data.get(key);\n }\n\n set(key: Key, value?: T[Key]): void {\n if (value === undefined) {\n this.data.delete(key);\n } else {\n this.data.set(key, value);\n }\n }\n\n delete(key: Key): void {\n this.data.delete(key);\n }\n}\n","import {\n CREDENTIAL_TYPES,\n DEFAULT_RENOWN_CHAIN_ID,\n DEFAULT_RENOWN_NETWORK_ID,\n DEFAULT_RENOWN_URL,\n} from \"./constants.js\";\nimport {\n buildAndSignCredential,\n verifyCredentialSignature,\n} from \"./credential.js\";\nimport { RenownCryptoSigner, type IRenownCrypto } from \"./crypto/index.js\";\nimport { MemoryStorage } from \"./storage/common.js\";\nimport {\n MissingSwitchboardError,\n type SwitchboardClient,\n} from \"./switchboard.js\";\nimport type {\n CreateBearerTokenOptions,\n IProof,\n IRenown,\n ISigner,\n LoginStatus,\n PKHDid,\n PowerhouseVerifiableCredential,\n ProfileFetcher,\n RenownEventEmitter,\n RenownEvents,\n RenownStorage,\n RenownStorageMap,\n SignInParams,\n User,\n UserActionSigner,\n} from \"./types.js\";\nimport { parsePkhDid, verifyAuthBearerToken } from \"./utils.js\";\nexport * from \"./constants.js\";\n\nexport class RenownMemoryStorage extends MemoryStorage<RenownStorageMap> {}\n\n/**\n * The acting identity an action's signature carries.\n *\n * `User` here is the whole session record — it also holds the DID, the\n * credential, the fetched profile and ENS info — while `UserActionSigner` is\n * what travels on a signed action, and it is deliberately just an address on a\n * chain. The reactor's `ReactorSignerUserInput` declares exactly these three\n * fields, and a GraphQL input object refuses a field it does not declare by\n * rejecting the WHOLE request, so handing the session record to the signer\n * makes every signed push fail before it reaches the reactor.\n *\n * Narrowed here rather than at the transport, because the session record has no\n * business being on an operation in the first place: it is stored on every\n * operation a local reactor writes, not only on the ones that go over a wire.\n *\n * The compiler cannot catch the difference — excess-property checks apply to\n * fresh object literals, never to a variable of a wider type — which is why\n * this is a function rather than a type annotation.\n */\nfunction toActionSigner(user: User | undefined): UserActionSigner | undefined {\n if (!user) return undefined;\n return {\n address: user.address,\n networkId: user.networkId,\n chainId: user.chainId,\n };\n}\n\nexport class Renown implements IRenown {\n #baseUrl: string;\n #store: RenownStorage;\n #eventEmitter: RenownEventEmitter;\n #appName: string;\n #crypto: IRenownCrypto;\n #signer: ISigner;\n #profileFetcher?: ProfileFetcher;\n #switchboard?: SwitchboardClient;\n #chainId: number;\n #status: LoginStatus = \"initial\";\n\n constructor(\n store: RenownStorage,\n eventEmitter: RenownEventEmitter,\n crypto: IRenownCrypto,\n appName: string,\n baseUrl = DEFAULT_RENOWN_URL,\n profileFetcher?: ProfileFetcher,\n switchboard?: SwitchboardClient,\n chainId = Number(DEFAULT_RENOWN_CHAIN_ID),\n ) {\n this.#store = store;\n this.#eventEmitter = eventEmitter;\n this.#baseUrl = baseUrl;\n this.#crypto = crypto;\n this.#appName = appName;\n this.#profileFetcher = profileFetcher;\n this.#switchboard = switchboard;\n this.#chainId = chainId;\n const restoredUser = this.user;\n this.#signer = new RenownCryptoSigner(\n crypto,\n this.#appName,\n toActionSigner(restoredUser),\n );\n\n // A restored, previously-verified user is an authorized session; otherwise\n // status stays \"initial\" after a reload while the user is present.\n if (restoredUser) {\n this.#status = \"authorized\";\n }\n\n this.on(\"user\", (user) => {\n this.#signer.user = toActionSigner(user);\n });\n }\n\n get baseUrl() {\n return this.#baseUrl;\n }\n\n /** Chain id this app issues credentials on; a session from another chain is rejected by {@link signIn}. */\n get chainId() {\n return this.#chainId;\n }\n\n get user() {\n return this.#store.get(\"user\");\n }\n\n get status() {\n return this.#status;\n }\n\n get signer() {\n return this.#signer;\n }\n\n get crypto() {\n return this.#crypto;\n }\n\n get did() {\n return this.#crypto.did;\n }\n\n get profileFetcher() {\n return this.#profileFetcher;\n }\n\n #updateStatus(status: LoginStatus) {\n this.#status = status;\n this.#eventEmitter.emit(\"status\", status);\n }\n\n #updateUser(user: User | undefined) {\n if (user) {\n this.#store.set(\"user\", user);\n } else {\n this.#store.delete(\"user\");\n }\n this.#eventEmitter.emit(\"user\", user);\n }\n\n async login(userDid: string): Promise<User> {\n this.#updateStatus(\"checking\");\n try {\n const result = parsePkhDid(userDid);\n const credential = await this.#getCredential(\n result.address,\n result.chainId,\n this.#crypto.did,\n );\n\n if (!credential) {\n this.#updateUser(undefined);\n throw new Error(\"Credential not found\");\n }\n\n return await this.#completeLogin(userDid, result, credential);\n } catch (error) {\n this.#updateUser(undefined);\n this.#updateStatus(\"not-authorized\");\n throw error;\n }\n }\n\n // Sign in without the Renown redirect: build + sign a delegation credential\n // with the caller's wallet signer, write it to the switchboard, then log in.\n async signIn(params: SignInParams): Promise<User> {\n if (!this.#switchboard) throw new MissingSwitchboardError();\n const {\n address,\n chainId,\n signTypedData,\n username,\n userImage,\n expiresInDays,\n } = params;\n\n // The chain id goes into the issuer DID and the EIP-712 domain, so signing on\n // another chain would mint a second identity for the same wallet.\n if (chainId !== this.#chainId) {\n throw new Error(\n `Renown signIn: wallet is on chain ${chainId}, but this app issues credentials on chain ${this.#chainId}. Switch networks and retry — signing here would create a separate identity for the same address.`,\n );\n }\n\n this.#updateStatus(\"checking\");\n try {\n const credential = await buildAndSignCredential({\n signTypedData,\n address,\n chainId,\n app: this.#appName,\n appId: this.did,\n expiresInDays,\n });\n\n await this.#switchboard.issueCredential(credential);\n await this.#switchboard.findOrCreateUser(address, {\n username,\n userImage,\n });\n\n const userDid = `did:pkh:${DEFAULT_RENOWN_NETWORK_ID}:${chainId}:${address.toLowerCase()}`;\n // Authenticate from the freshly signed credential — no read-back, which\n // avoids racing the read-model processor that indexes the write.\n return await this.#completeLogin(\n userDid,\n parsePkhDid(userDid),\n credential,\n );\n } catch (error) {\n this.#updateUser(undefined);\n this.#updateStatus(\"not-authorized\");\n throw error;\n }\n }\n\n // Verify a credential binds to userDid + this app key, set the user, and\n // start the background profile fetch. Throws if the credential is invalid.\n async #completeLogin(\n userDid: string,\n result: PKHDid,\n credential: PowerhouseVerifiableCredential,\n ): Promise<User> {\n if (\n !(\n credential.issuer.id === userDid &&\n credential.credentialSubject.id === this.did\n )\n ) {\n throw new Error(\"Invalid credential\");\n }\n\n // The API may return proof.eip712 without domain/types; the domain is\n // canonical (version \"1\", the chainId), so reconstruct it before verifying.\n const eip712 = credential.proof.eip712 as\n | Partial<IProof[\"eip712\"]>\n | undefined;\n const verifiableCredential: PowerhouseVerifiableCredential = eip712?.domain\n ? credential\n : {\n ...credential,\n proof: {\n ...credential.proof,\n eip712: {\n domain: { version: \"1\", chainId: result.chainId },\n types: CREDENTIAL_TYPES,\n primaryType: \"VerifiableCredential\",\n },\n },\n };\n\n // Verify the EIP-712 proof was signed by the DID's address on its chain.\n if (\n credential.issuer.ethereumAddress.toLowerCase() !==\n result.address.toLowerCase() ||\n verifiableCredential.proof.eip712.domain.chainId !== result.chainId ||\n !(await verifyCredentialSignature(verifiableCredential))\n ) {\n throw new Error(\"Invalid credential signature\");\n }\n\n const user: User = {\n ...result,\n address: credential.issuer.ethereumAddress,\n did: userDid,\n credential: verifiableCredential,\n };\n\n this.#updateUser(user);\n this.#updateStatus(\"authorized\");\n\n // Fetch profile data in the background if a fetcher is configured\n if (this.#profileFetcher) {\n this.#profileFetcher(user, this.#baseUrl)\n .then((profile) => {\n if (\n profile &&\n this.user?.address === user.address &&\n this.user.chainId === user.chainId\n ) {\n this.#updateUser({\n ...this.user,\n profile,\n ens: {\n name: profile.username ?? undefined,\n avatarUrl: profile.userImage ?? undefined,\n },\n });\n }\n })\n .catch(console.error);\n }\n\n return user;\n }\n\n logout() {\n this.#updateUser(undefined);\n this.#updateStatus(\"initial\");\n return Promise.resolve();\n }\n\n // Re-check the current user's credential at the source; logs out if it was\n // revoked or expired. Network errors keep the session (fail open).\n async revalidate(): Promise<boolean> {\n const user = this.user;\n if (!user) return false;\n try {\n const credential = await this.#getCredential(\n user.address,\n user.chainId,\n this.#crypto.did,\n );\n if (!credential) {\n await this.logout();\n return false;\n }\n await this.refreshProfile();\n return true;\n } catch {\n return true;\n }\n }\n\n // Re-read profile attributes at the source so a renamed user or changed avatar\n // shows up on the next load. Carries no logout risk, unlike revalidate().\n async refreshProfile(): Promise<boolean> {\n const user = this.user;\n if (!user || !this.#profileFetcher) return false;\n try {\n const profile = await this.#profileFetcher(user, this.#baseUrl);\n if (!profile) return false;\n // Asserted because narrowing from the pre-await read would otherwise hide\n // that a logout during the fetch can clear this.\n const current = this.user as User | undefined;\n if (\n !current ||\n current.address !== user.address ||\n current.chainId !== user.chainId\n ) {\n return false;\n }\n // Narrow `profile` first: the fetched payload is unvalidated JSON, so a\n // missing documentId must not make the undefined case compare equal.\n const unchanged =\n current.profile !== undefined &&\n current.profile.documentId === profile.documentId &&\n current.profile.username === profile.username &&\n current.profile.userImage === profile.userImage;\n if (unchanged) return false;\n this.#updateUser({\n ...current,\n profile,\n ens: {\n name: profile.username ?? undefined,\n avatarUrl: profile.userImage ?? undefined,\n },\n });\n return true;\n } catch {\n return false;\n }\n }\n\n on<K extends keyof RenownEvents>(\n event: K,\n listener: (data: RenownEvents[K]) => void,\n ): () => void {\n return this.#eventEmitter.on(event, listener);\n }\n\n async #getCredential(\n address: string,\n chainId: number,\n appDid: string,\n ): Promise<PowerhouseVerifiableCredential | undefined> {\n // Direct-switchboard flow: read the credential from the reactor subgraph.\n if (this.#switchboard) {\n return this.#switchboard.getCredential({ address, chainId, appDid });\n }\n if (!this.#baseUrl) {\n throw new Error(\"RENOWN_URL is not set\");\n }\n const url = new URL(\n `/api/auth/credential?address=${encodeURIComponent(address)}&chainId=${encodeURIComponent(chainId)}&connectId=${encodeURIComponent(appDid)}&appId=${encodeURIComponent(appDid)}`,\n this.#baseUrl,\n );\n const response = await fetch(url, {\n method: \"GET\",\n });\n if (response.ok) {\n const result = (await response.json()) as {\n credential: PowerhouseVerifiableCredential;\n };\n return result.credential;\n } else {\n throw new Error(`Failed to get credential: ${response.status}`);\n }\n }\n\n async verifyBearerToken(token: string) {\n return verifyAuthBearerToken(token);\n }\n\n async getBearerToken(options: CreateBearerTokenOptions) {\n if (!this.user) {\n throw new Error(\"User not found\");\n }\n return this.#crypto.getBearerToken(this.user.address, options);\n }\n}\n","import type { RenownEvents } from \"../types.js\";\nimport type { IEventEmitter } from \"./types.js\";\n\nexport class MemoryEventEmitter implements IEventEmitter<RenownEvents> {\n #listeners = new Map<keyof RenownEvents, Set<(data: unknown) => void>>();\n\n on<K extends keyof RenownEvents>(\n event: K,\n listener: (data: RenownEvents[K]) => void,\n ): () => void {\n if (!this.#listeners.has(event)) {\n this.#listeners.set(event, new Set());\n }\n this.#listeners.get(event)!.add(listener as (data: unknown) => void);\n return () => {\n this.#listeners.get(event)?.delete(listener as (data: unknown) => void);\n };\n }\n\n emit<K extends keyof RenownEvents>(event: K, data: RenownEvents[K]): void {\n this.#listeners.get(event)?.forEach((listener) => listener(data));\n }\n}\n","import type { ProfileFetcher, RenownProfile } from \"./types.js\";\n\nexport const fetchRenownProfile: ProfileFetcher = async (user, baseUrl) => {\n try {\n const response = await fetch(`${baseUrl.replace(/\\/+$/, \"\")}/api/profile`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n ethAddress: user.address,\n }),\n });\n\n if (!response.ok) {\n return undefined;\n }\n\n const result = (await response.json()) as {\n profile?: RenownProfile;\n };\n\n return result.profile ?? undefined;\n } catch {\n return undefined;\n }\n};\n","import { Renown, RenownMemoryStorage } from \"./common.js\";\nimport { DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_URL } from \"./constants.js\";\nimport { RenownCryptoBuilder } from \"./crypto/renown-crypto-builder.js\";\nimport type { IRenownCrypto, JsonWebKeyPairStorage } from \"./crypto/types.js\";\nimport { resolveSwitchboardEndpoint } from \"./discovery.js\";\nimport { MemoryEventEmitter } from \"./event/memory.js\";\nimport { fetchRenownProfile } from \"./profile.js\";\nimport { SwitchboardClient } from \"./switchboard.js\";\nimport type {\n ProfileFetcher,\n RenownEventEmitter,\n RenownStorage,\n} from \"./types.js\";\n\nexport interface RenownBuilderOptions {\n appName: string;\n storage?: RenownStorage;\n eventEmitter?: RenownEventEmitter;\n crypto?: IRenownCrypto;\n keyPairStorage?: JsonWebKeyPairStorage;\n baseUrl?: string;\n switchboardUrl?: string;\n profileFetcher?: ProfileFetcher;\n /** Chain id credentials are issued on (default 1). The issuer DID embeds it, so `signIn` rejects a wallet session from another chain. */\n chainId?: number;\n}\n\n/**\n * Base builder for creating Renown instances.\n * Use platform-specific builders (RenownBuilder from init.browser.js or init.node.js)\n * for pre-configured defaults.\n */\nexport class BaseRenownBuilder {\n #appName: string;\n #storage?: RenownStorage;\n #eventEmitter?: RenownEventEmitter;\n #crypto?: IRenownCrypto;\n #keyPairStorage?: JsonWebKeyPairStorage;\n #baseUrl?: string;\n #switchboardUrl?: string;\n #profileFetcher?: ProfileFetcher;\n #chainId?: number;\n\n /**\n * @param appName - Application name used for signing context\n */\n constructor(appName: string) {\n this.#appName = appName;\n }\n\n /**\n * Set custom storage for user data persistence.\n * Defaults to in-memory storage if not set.\n */\n withStorage(storage: RenownStorage): this {\n this.#storage = storage;\n return this;\n }\n\n /**\n * Set custom event emitter for user state changes.\n * Defaults to in-memory event emitter if not set.\n */\n withEventEmitter(eventEmitter: RenownEventEmitter): this {\n this.#eventEmitter = eventEmitter;\n return this;\n }\n\n /**\n * Set a pre-built crypto instance.\n * Either crypto or keyPairStorage must be provided.\n */\n withCrypto(crypto: IRenownCrypto): this {\n this.#crypto = crypto;\n return this;\n }\n\n /**\n * Set key pair storage for cryptographic keys.\n * A crypto instance will be built from this storage.\n * Either crypto or keyPairStorage must be provided.\n */\n withKeyPairStorage(keyPairStorage: JsonWebKeyPairStorage): this {\n this.#keyPairStorage = keyPairStorage;\n return this;\n }\n\n /**\n * Set the Renown server URL for credential verification.\n * Defaults to https://www.renown.id\n */\n withBaseUrl(baseUrl: string): this {\n this.#baseUrl = baseUrl;\n return this;\n }\n\n // Set the Switchboard GraphQL endpoint to read from the reactor directly.\n // When unset, the SDK discovers it from the base URL, else uses the REST flow.\n withSwitchboardUrl(switchboardUrl: string): this {\n this.#switchboardUrl = switchboardUrl;\n return this;\n }\n\n // Set the chain id credentials are issued on (default 1). It is part of the\n // issuer DID, so signIn rejects a wallet session from a different chain.\n withChainId(chainId: number): this {\n this.#chainId = chainId;\n return this;\n }\n\n /**\n * Set a profile fetcher strategy for enriching user data after login.\n * The fetcher receives the authenticated user and the base URL,\n * and returns a RenownProfile. Called in the background after each login.\n * Defaults to fetchRenownProfile which calls the Renown API.\n */\n withProfileFetcher(profileFetcher: ProfileFetcher): this {\n this.#profileFetcher = profileFetcher;\n return this;\n }\n\n /**\n * Build and initialize the Renown instance.\n * If a user is stored, attempts to re-authenticate them.\n * @throws Error if neither crypto nor keyPairStorage is provided\n */\n async build(): Promise<Renown> {\n if (!this.#crypto && !this.#keyPairStorage) {\n throw new Error(\n \"Either crypto or keyPairStorage is required. Use withCrypto() or withKeyPairStorage() to set one.\",\n );\n }\n\n const chainId = this.#chainId ?? Number(DEFAULT_RENOWN_CHAIN_ID);\n const crypto =\n this.#crypto ??\n (await new RenownCryptoBuilder()\n .withKeyPairStorage(this.#keyPairStorage!)\n .withChainId(chainId)\n .build());\n\n // A crypto supplied via withCrypto() carries its own chain; the bearer token\n // it mints would then disagree with the credentials issued here.\n if (crypto.chainId !== undefined && crypto.chainId !== chainId) {\n console.warn(\n `Renown: the supplied crypto signs bearer tokens for chain ${crypto.chainId}, but credentials are issued on chain ${chainId}.`,\n );\n }\n\n const storage = this.#storage ?? new RenownMemoryStorage();\n const eventEmitter = this.#eventEmitter ?? new MemoryEventEmitter();\n const baseUrl = this.#baseUrl ?? DEFAULT_RENOWN_URL;\n\n // Pick the transport once: direct-switchboard when an endpoint resolves,\n // else the REST flow. A custom profile fetcher always takes precedence.\n const switchboardEndpoint = await resolveSwitchboardEndpoint({\n switchboardUrl: this.#switchboardUrl,\n baseUrl,\n });\n const switchboard = switchboardEndpoint\n ? new SwitchboardClient(switchboardEndpoint)\n : undefined;\n const profileFetcher =\n this.#profileFetcher ??\n (switchboard ? switchboard.profileFetcher : fetchRenownProfile);\n\n const renown = new Renown(\n storage,\n eventEmitter,\n crypto,\n this.#appName,\n baseUrl,\n profileFetcher,\n switchboard,\n chainId,\n );\n\n // A stored user is loaded as-is for an instant, offline-safe start; callers\n // revalidate against the source separately via renown.revalidate().\n return renown;\n }\n\n /**\n * Create a BaseRenownBuilder from options object for a more concise API\n */\n static from(options: RenownBuilderOptions): BaseRenownBuilder {\n const builder = new BaseRenownBuilder(options.appName);\n\n if (options.storage) {\n builder.withStorage(options.storage);\n }\n if (options.eventEmitter) {\n builder.withEventEmitter(options.eventEmitter);\n }\n if (options.crypto) {\n builder.withCrypto(options.crypto);\n }\n if (options.keyPairStorage) {\n builder.withKeyPairStorage(options.keyPairStorage);\n }\n if (options.baseUrl) {\n builder.withBaseUrl(options.baseUrl);\n }\n if (options.switchboardUrl) {\n builder.withSwitchboardUrl(options.switchboardUrl);\n }\n if (options.profileFetcher) {\n builder.withProfileFetcher(options.profileFetcher);\n }\n if (options.chainId !== undefined) {\n builder.withChainId(options.chainId);\n }\n\n return builder;\n }\n}\n","import { fetchDelegationCredential } from \"./credential.js\";\nimport type { SwitchboardRequestFn } from \"./switchboard.js\";\n\n/** Confirms an authenticated signer's delegation credential is still live. */\nexport type CredentialCheck = (params: {\n address: string;\n chainId: number;\n appId: string;\n}) => Promise<boolean>;\n\nexport interface LocalCredentialVerifierOptions {\n /** Notified when the read itself fails; the check then fails closed. */\n onError?: (error: unknown) => void;\n}\n\n/** A credential check that reads a Switchboard's own renown read model through\n * `execute`, rather than any Renown or Switchboard over HTTP. */\nexport function createLocalCredentialVerifier(\n execute: SwitchboardRequestFn,\n options: LocalCredentialVerifierOptions = {},\n): CredentialCheck {\n // fetchDelegationCredential turns a read failure into \"no credential\" — the\n // right verdict, but silent; surface it before it is swallowed.\n const request: SwitchboardRequestFn = async (query, variables) => {\n try {\n return await execute(query, variables);\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n\n return async ({ address, chainId, appId }) => {\n const credential = await fetchDelegationCredential({\n address,\n chainId,\n appDid: appId,\n switchboardRequest: request,\n });\n return credential !== undefined;\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta-B8HbJHy8.d.ts","names":[],"sources":["../src/wallet/rainbow/meta.ts"],"mappings":";;;UAIiB,aAAA;EACf,EAAA;EACA,IAAA;AAAA;AAAA,UAKe,4BAAA;EAGf,sBAAA;EACA,eAAA;EACA,OAAA;EAGA,MAAA,aAAmB,aAAA,KAAkB,aAAA;EAGrC,GAAA;AAAA;AAAA,cAGW,eAAA,EAAiB,WAAA;AAAA,cAIjB,kBAAA,EAAoB,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta-CRXEMUUQ.d.ts","names":[],"sources":["../src/wallet/mock/meta.ts"],"mappings":";;;KAEY,eAAA;AAAA,cAUC,oBAAA,EAAsB,WAAA;AAVnC;AAAA,UAiBiB,yBAAA;;EAEf,UAAA;EAnByB;EAqBzB,OAAA;EAPD;EASC,OAAA,GAAU,eAAA;AAAA;AAAA,iBAKI,kBAAA,CAAmB,OAAA,cAAqB,WAAA;AAAA,cAe3C,eAAA,EAAiB,IAAA,CAAK,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"signer-DIbtSfsu.js","names":["#keyPairStorage","#subtleCrypto","#keyPair","#stringToBytes","#initializeKeyPair"],"sources":["../src/crypto/utils.ts","../src/crypto/renown-crypto.ts","../src/crypto/renown-crypto-builder.ts","../src/crypto/memory-key-storage.ts","../src/crypto/signer.ts"],"sourcesContent":["import { encodeDIDFromPub, getPublicKey } from \"@didtools/key-webcrypto\";\nimport type { DID, JwkKeyPair } from \"./types.js\";\n\nexport const ECDSA_ALGORITHM: EcKeyAlgorithm = {\n name: \"ECDSA\",\n namedCurve: \"P-256\",\n};\n\nexport const ECDSA_SIGN_ALGORITHM = {\n name: \"ECDSA\",\n namedCurve: \"P-256\",\n hash: \"SHA-256\",\n};\n\nexport async function parseDid(keyPair: CryptoKeyPair): Promise<DID> {\n return encodeDIDFromPub(await getPublicKey(keyPair)) as DID;\n}\n\nexport async function exportKeyPair(\n keyPair: CryptoKeyPair,\n subtleCrypto: SubtleCrypto,\n): Promise<JwkKeyPair> {\n return {\n publicKey: await subtleCrypto.exportKey(\"jwk\", keyPair.publicKey),\n privateKey: await subtleCrypto.exportKey(\"jwk\", keyPair.privateKey),\n };\n}\n\nexport async function importKeyPair(\n jwkKeyPair: JwkKeyPair,\n subtleCrypto: SubtleCrypto,\n algorithm: EcKeyAlgorithm = ECDSA_ALGORITHM,\n): Promise<CryptoKeyPair> {\n return {\n publicKey: await subtleCrypto.importKey(\n \"jwk\",\n jwkKeyPair.publicKey,\n algorithm,\n true,\n [\"verify\"],\n ),\n privateKey: await subtleCrypto.importKey(\n \"jwk\",\n jwkKeyPair.privateKey,\n algorithm,\n true,\n [\"sign\"],\n ),\n };\n}\n\nexport async function generateKeyPair(\n subtleCrypto: SubtleCrypto,\n algorithm: EcKeyAlgorithm = ECDSA_ALGORITHM,\n): Promise<CryptoKeyPair> {\n return subtleCrypto.generateKey(algorithm, true, [\"sign\", \"verify\"]);\n}\n","import { fromString, toString } from \"uint8arrays\";\nimport {\n DEFAULT_RENOWN_CHAIN_ID,\n DEFAULT_RENOWN_NETWORK_ID,\n} from \"../constants.js\";\nimport type { CreateBearerTokenOptions, Issuer } from \"../types.js\";\nimport { createAuthBearerToken } from \"../utils.js\";\nimport type { DID, IRenownCrypto, JsonWebKeyPairStorage } from \"./types.js\";\nimport { ECDSA_ALGORITHM, ECDSA_SIGN_ALGORITHM } from \"./utils.js\";\n\nexport class RenownCrypto implements IRenownCrypto {\n #subtleCrypto: SubtleCrypto;\n #keyPair: CryptoKeyPair;\n #keyPairStorage: JsonWebKeyPairStorage;\n\n readonly did: DID;\n /** Chain id the bearer token is scoped to; keep it equal to the issuing Renown instance's. */\n readonly chainId: number;\n\n static algorithm = ECDSA_ALGORITHM;\n static signAlgorithm = ECDSA_SIGN_ALGORITHM;\n\n constructor(\n keyPairStorage: JsonWebKeyPairStorage,\n crypto: SubtleCrypto,\n keyPair: CryptoKeyPair,\n did: DID,\n chainId = Number(DEFAULT_RENOWN_CHAIN_ID),\n ) {\n this.#keyPairStorage = keyPairStorage;\n this.#subtleCrypto = crypto;\n this.#keyPair = keyPair;\n this.did = did;\n this.chainId = chainId;\n }\n\n get publicKey() {\n return this.#keyPair.publicKey;\n }\n\n async getBearerToken(\n address: string | undefined,\n options?: CreateBearerTokenOptions,\n ): Promise<string> {\n return await createAuthBearerToken(\n this.chainId,\n DEFAULT_RENOWN_NETWORK_ID,\n address || this.did,\n this.issuer,\n options,\n );\n }\n\n async removeDid(): Promise<void> {\n await this.#keyPairStorage.removeKeyPair();\n }\n\n #stringToBytes(s: string): Uint8Array {\n return fromString(s, \"utf-8\");\n }\n\n async sign(data: Uint8Array | string): Promise<Uint8Array> {\n const dataBytes: Uint8Array =\n typeof data === \"string\" ? this.#stringToBytes(data) : data;\n\n const arrayBuffer = await this.#subtleCrypto.sign(\n RenownCrypto.signAlgorithm,\n this.#keyPair.privateKey,\n dataBytes.buffer as ArrayBuffer,\n );\n\n return new Uint8Array(arrayBuffer);\n }\n\n async verify(data: Uint8Array, signature: Uint8Array): Promise<boolean> {\n return this.#subtleCrypto.verify(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n this.#keyPair.publicKey,\n signature.buffer as ArrayBuffer,\n data.buffer as ArrayBuffer,\n );\n }\n\n get issuer(): Issuer {\n return {\n did: this.did,\n signer: async (data: string | Uint8Array) => {\n const signature = await this.sign(\n typeof data === \"string\" ? new TextEncoder().encode(data) : data,\n );\n return toString(signature, \"base64url\");\n },\n alg: \"ES256\",\n };\n }\n}\n\n/**\n * @deprecated Use RenownCrypto instead\n */\nexport class ConnectCrypto extends RenownCrypto {}\n","import { RenownCrypto } from \"./renown-crypto.js\";\nimport type { JsonWebKeyPairStorage } from \"./types.js\";\nimport {\n exportKeyPair,\n generateKeyPair,\n importKeyPair,\n parseDid,\n} from \"./utils.js\";\n\nexport class RenownCryptoBuilder {\n private keyPairStorage?: JsonWebKeyPairStorage;\n private subtleCrypto?: SubtleCrypto;\n private chainId?: number;\n\n withKeyPairStorage(storage: JsonWebKeyPairStorage): this {\n this.keyPairStorage = storage;\n return this;\n }\n\n withSubtleCrypto(crypto: SubtleCrypto): this {\n this.subtleCrypto = crypto;\n return this;\n }\n\n // Scopes the bearer token to a chain (default 1). Match the Renown instance\n // issuing credentials, or the token and the credential disagree.\n withChainId(chainId: number): this {\n this.chainId = chainId;\n return this;\n }\n\n async build(): Promise<RenownCrypto> {\n if (!this.keyPairStorage) {\n throw new Error(\n \"KeyPairStorage is required. Use withKeyPairStorage() to set it.\",\n );\n }\n\n const subtleCrypto = this.subtleCrypto ?? globalThis.crypto.subtle;\n const keyPair = await this.#initializeKeyPair(\n subtleCrypto,\n this.keyPairStorage,\n );\n const did = await parseDid(keyPair);\n\n return new RenownCrypto(\n this.keyPairStorage,\n subtleCrypto,\n keyPair,\n did,\n this.chainId,\n );\n }\n\n async #initializeKeyPair(\n subtleCrypto: SubtleCrypto,\n keyPairStorage: JsonWebKeyPairStorage,\n ): Promise<CryptoKeyPair> {\n const loadedKeyPair = await keyPairStorage.loadKeyPair();\n if (loadedKeyPair) {\n return importKeyPair(loadedKeyPair, subtleCrypto);\n }\n\n const keyPair = await generateKeyPair(subtleCrypto);\n const exported = await exportKeyPair(keyPair, subtleCrypto);\n await keyPairStorage.saveKeyPair(exported);\n return keyPair;\n }\n}\n","import type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nexport class MemoryKeyStorage implements JsonWebKeyPairStorage {\n private keyPair: JwkKeyPair | undefined;\n\n constructor(keyPair?: JwkKeyPair) {\n this.keyPair = keyPair;\n }\n\n loadKeyPair() {\n return Promise.resolve(this.keyPair);\n }\n\n saveKeyPair(keyPair: JwkKeyPair) {\n this.keyPair = keyPair;\n return Promise.resolve();\n }\n\n removeKeyPair() {\n this.keyPair = undefined;\n return Promise.resolve();\n }\n}\n","import type {\n Action,\n ActionSigningTarget,\n AppActionSigner,\n ISigner,\n Operation,\n Signature,\n SignatureVerificationHandler,\n UserActionSigner,\n} from \"@powerhousedao/shared/document-model\";\nimport {\n actionSignerIdentity,\n signActionV2,\n} from \"@powerhousedao/shared/document-model\";\nimport type { IRenownCrypto } from \"./index.js\";\n\nexport class InvalidSignatureError extends Error {\n constructor() {\n super(\"Invalid signature\");\n }\n}\n\nexport class RenownCryptoSigner implements ISigner {\n readonly app: AppActionSigner;\n\n constructor(\n private readonly crypto: IRenownCrypto,\n private readonly appName: string,\n public user?: UserActionSigner,\n ) {\n this.app = {\n key: this.crypto.did,\n name: this.appName,\n };\n }\n\n get publicKey() {\n return this.crypto.publicKey;\n }\n\n async sign(data: Uint8Array): Promise<Uint8Array> {\n return this.crypto.sign(data);\n }\n\n async verify(data: Uint8Array, signature: Uint8Array): Promise<void> {\n const isValid = await this.crypto.verify(data, signature);\n if (!isValid) {\n throw new InvalidSignatureError();\n }\n }\n\n async signAction(\n action: Action,\n target: ActionSigningTarget,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n const hashField = action.context?.prevOpHash ?? \"\";\n return this._signAction(action, target, hashField, abortSignal);\n }\n\n /**\n * Signs an action including a predicted resulting state hash, packed into\n * element [3] as `${prevStateHash}:${resultingStateHash}`.\n */\n async signActionWithResultingState(\n action: Action,\n target: ActionSigningTarget,\n resultingStateHash: string,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n const prevStateHash = action.context?.prevOpHash ?? \"\";\n const hashField = `${prevStateHash}:${resultingStateHash}`;\n return this._signAction(action, target, hashField, abortSignal);\n }\n\n /**\n * The pre-v2 tuple, over scope, type and input only. For peers and tests\n * that still need one; it binds neither the document nor the signer.\n */\n async signActionLegacy(\n action: Action,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n\n const params: [string, string, string, string] = [\n (new Date().getTime() / 1000).toFixed(0),\n this.crypto.did,\n await this.hashAction(action),\n action.context?.prevOpHash ?? \"\",\n ];\n const signatureBytes = await this.crypto.sign(\n this.buildSignatureMessage(params),\n );\n\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n return [...params, `0x${this.arrayBufferToHex(signatureBytes)}`];\n }\n\n private async _signAction(\n action: Action,\n target: ActionSigningTarget,\n hashField: string,\n abortSignal?: AbortSignal,\n ): Promise<Signature> {\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n\n const signature = await signActionV2({\n action,\n target,\n signer: actionSignerIdentity(this),\n sign: (message) => this.crypto.sign(message),\n previousStateHash: hashField,\n });\n\n if (abortSignal?.aborted) {\n throw new Error(\"Signing aborted\");\n }\n\n return signature;\n }\n\n private async hashAction(action: Action): Promise<string> {\n const payload = [\n action.scope,\n action.type,\n JSON.stringify(action.input),\n ].join(\"\");\n const encoder = new TextEncoder();\n const data = encoder.encode(payload);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n return this.arrayBufferToBase64(hashBuffer);\n }\n\n private buildSignatureMessage(\n params: [string, string, string, string],\n ): Uint8Array {\n const message = params.join(\"\");\n const prefix = \"\\x19Signed Operation:\\n\" + message.length.toString();\n const encoder = new TextEncoder();\n return encoder.encode(prefix + message);\n }\n\n private arrayBufferToHex(buffer: Uint8Array | ArrayBuffer): string {\n const bytes =\n buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n}\n\n/**\n * Creates a signature verification handler that verifies signatures using the Web Crypto API.\n * The verification uses ECDSA with P-256 curve and SHA-256 hash, matching the RenownCrypto signing algorithm.\n */\nexport function createSignatureVerifier(\n requireSignature = false,\n): SignatureVerificationHandler {\n return async (operation: Operation, publicKey: string): Promise<boolean> => {\n const signer = operation.action.context?.signer;\n if (!signer || !publicKey) {\n return !requireSignature;\n }\n\n const signatures = signer.signatures;\n if (signatures.length === 0) {\n return false;\n }\n\n const signature = signatures[signatures.length - 1];\n const [timestamp, signerKey, hash, prevStateHash, signatureHex] = signature;\n\n if (signerKey !== publicKey) {\n return false;\n }\n\n const params: [string, string, string, string] = [\n timestamp,\n signerKey,\n hash,\n prevStateHash,\n ];\n const message = buildSignatureMessage(params);\n const signatureBytes = hexToUint8Array(signatureHex);\n\n const cryptoKey = await importPublicKey(publicKey);\n\n const isValid = await crypto.subtle.verify(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n cryptoKey,\n signatureBytes.buffer as ArrayBuffer,\n message.buffer as ArrayBuffer,\n );\n\n return isValid;\n };\n}\n\nfunction buildSignatureMessage(\n params: [string, string, string, string],\n): Uint8Array {\n const message = params.join(\"\");\n const prefix = \"\\x19Signed Operation:\\n\" + message.length.toString();\n const encoder = new TextEncoder();\n return encoder.encode(prefix + message);\n}\n\nfunction hexToUint8Array(hex: string): Uint8Array {\n const cleanHex = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = parseInt(cleanHex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n\nasync function importPublicKey(did: string): Promise<CryptoKey> {\n const keyData = extractKeyFromDid(did);\n return crypto.subtle.importKey(\n \"raw\",\n keyData.buffer as ArrayBuffer,\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n true,\n [\"verify\"],\n );\n}\n\nfunction extractKeyFromDid(did: string): Uint8Array {\n const parts = did.split(\":\");\n if (parts.length < 3 || parts[0] !== \"did\" || parts[1] !== \"key\") {\n throw new Error(`Invalid DID format: ${did}`);\n }\n\n const multibaseKey = parts[2];\n if (!multibaseKey.startsWith(\"z\")) {\n throw new Error(`Unsupported multibase encoding: ${multibaseKey[0]}`);\n }\n\n const decoded = base58Decode(multibaseKey.slice(1));\n\n if (decoded[0] !== 0x80 || decoded[1] !== 0x24) {\n throw new Error(\"Not a P-256 public key multicodec\");\n }\n\n const compressedKey = decoded.slice(2);\n return decompressP256PublicKey(compressedKey);\n}\n\nfunction base58Decode(input: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const ALPHABET_MAP = new Map<string, number>();\n for (let i = 0; i < ALPHABET.length; i++) {\n ALPHABET_MAP.set(ALPHABET[i], i);\n }\n\n if (input.length === 0) {\n return new Uint8Array(0);\n }\n\n const bytes: number[] = [0];\n for (const char of input) {\n const value = ALPHABET_MAP.get(char);\n if (value === undefined) {\n throw new Error(`Invalid base58 character: ${char}`);\n }\n\n let carry = value;\n for (let j = 0; j < bytes.length; j++) {\n carry += bytes[j] * 58;\n bytes[j] = carry & 0xff;\n carry >>= 8;\n }\n\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n for (const char of input) {\n if (char !== \"1\") break;\n bytes.push(0);\n }\n\n return new Uint8Array(bytes.reverse());\n}\n\nfunction decompressP256PublicKey(compressed: Uint8Array): Uint8Array {\n if (compressed.length !== 33) {\n throw new Error(`Invalid compressed key length: ${compressed.length}`);\n }\n\n const prefix = compressed[0];\n if (prefix !== 0x02 && prefix !== 0x03) {\n throw new Error(`Invalid compression prefix: ${prefix}`);\n }\n\n const p = BigInt(\n \"0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff\",\n );\n const a = BigInt(\n \"0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc\",\n );\n const b = BigInt(\n \"0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b\",\n );\n\n let x = BigInt(0);\n for (let i = 1; i < compressed.length; i++) {\n x = (x << BigInt(8)) | BigInt(compressed[i]);\n }\n\n const ySquared = (modPow(x, BigInt(3), p) + a * x + b) % p;\n let y = modPow(ySquared, (p + BigInt(1)) / BigInt(4), p);\n\n const isYEven = y % BigInt(2) === BigInt(0);\n const shouldBeEven = prefix === 0x02;\n if (isYEven !== shouldBeEven) {\n y = p - y;\n }\n\n const uncompressed = new Uint8Array(65);\n uncompressed[0] = 0x04;\n\n const xBytes = bigIntToBytes(x, 32);\n const yBytes = bigIntToBytes(y, 32);\n\n uncompressed.set(xBytes, 1);\n uncompressed.set(yBytes, 33);\n\n return uncompressed;\n}\n\nfunction modPow(base: bigint, exp: bigint, mod: bigint): bigint {\n let result = BigInt(1);\n base = base % mod;\n while (exp > BigInt(0)) {\n if (exp % BigInt(2) === BigInt(1)) {\n result = (result * base) % mod;\n }\n exp = exp >> BigInt(1);\n base = (base * base) % mod;\n }\n return result;\n}\n\nfunction bigIntToBytes(n: bigint, length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n for (let i = length - 1; i >= 0; i--) {\n bytes[i] = Number(n & BigInt(0xff));\n n = n >> BigInt(8);\n }\n return bytes;\n}\n\n/**\n * Parses the hash field (element [3]) from a signature tuple.\n *\n * Supports two formats:\n * - Old format: just `prevStateHash` (no colon)\n * - New format: `prevStateHash:resultingStateHash` (colon-separated)\n *\n * @param hashField - The 4th element of a Signature tuple\n * @returns Object with prevStateHash and optional resultingStateHash\n */\nexport function parseSignatureHashField(hashField: string): {\n prevStateHash: string;\n resultingStateHash: string | undefined;\n} {\n const colonIndex = hashField.indexOf(\":\");\n\n if (colonIndex === -1) {\n return {\n prevStateHash: hashField,\n resultingStateHash: undefined,\n };\n }\n\n return {\n prevStateHash: hashField.substring(0, colonIndex),\n resultingStateHash: hashField.substring(colonIndex + 1),\n };\n}\n\n/**\n * Extracts the resulting state hash from a signature, if present.\n *\n * @param signature - A Signature tuple\n * @returns The resulting state hash, or undefined if not present\n */\nexport function extractResultingHashFromSignature(\n signature: Signature,\n): string | undefined {\n const hashField = signature[3];\n const { resultingStateHash } = parseSignatureHashField(hashField);\n return resultingStateHash;\n}\n\n/**\n * Checks if a signature includes a resulting state hash.\n *\n * @param signature - A Signature tuple\n * @returns true if the signature includes a resulting state hash\n */\nexport function signatureHasResultingHash(signature: Signature): boolean {\n return extractResultingHashFromSignature(signature) !== undefined;\n}\n"],"mappings":";;;;;;AAGA,MAAa,kBAAkC;CAC7C,MAAM;CACN,YAAY;CACb;AAED,MAAa,uBAAuB;CAClC,MAAM;CACN,YAAY;CACZ,MAAM;CACP;AAED,eAAsB,SAAS,SAAsC;AACnE,QAAO,iBAAiB,MAAM,aAAa,QAAQ,CAAC;;AAGtD,eAAsB,cACpB,SACA,cACqB;AACrB,QAAO;EACL,WAAW,MAAM,aAAa,UAAU,OAAO,QAAQ,UAAU;EACjE,YAAY,MAAM,aAAa,UAAU,OAAO,QAAQ,WAAW;EACpE;;AAGH,eAAsB,cACpB,YACA,cACA,YAA4B,iBACJ;AACxB,QAAO;EACL,WAAW,MAAM,aAAa,UAC5B,OACA,WAAW,WACX,WACA,MACA,CAAC,SAAS,CACX;EACD,YAAY,MAAM,aAAa,UAC7B,OACA,WAAW,YACX,WACA,MACA,CAAC,OAAO,CACT;EACF;;AAGH,eAAsB,gBACpB,cACA,YAA4B,iBACJ;AACxB,QAAO,aAAa,YAAY,WAAW,MAAM,CAAC,QAAQ,SAAS,CAAC;;;;AC7CtE,IAAa,eAAb,MAAa,aAAsC;CACjD;CACA;CACA;CAEA;;CAEA;CAEA,OAAO,YAAY;CACnB,OAAO,gBAAgB;CAEvB,YACE,gBACA,QACA,SACA,KACA,UAAU,GACV;AACA,QAAA,iBAAuB;AACvB,QAAA,eAAqB;AACrB,QAAA,UAAgB;AAChB,OAAK,MAAM;AACX,OAAK,UAAU;;CAGjB,IAAI,YAAY;AACd,SAAO,MAAA,QAAc;;CAGvB,MAAM,eACJ,SACA,SACiB;AACjB,SAAO,MAAM,sBACX,KAAK,SACL,2BACA,WAAW,KAAK,KAChB,KAAK,QACL,QACD;;CAGH,MAAM,YAA2B;AAC/B,QAAM,MAAA,eAAqB,eAAe;;CAG5C,eAAe,GAAuB;AACpC,SAAO,WAAW,GAAG,QAAQ;;CAG/B,MAAM,KAAK,MAAgD;EACzD,MAAM,YACJ,OAAO,SAAS,WAAW,MAAA,cAAoB,KAAK,GAAG;EAEzD,MAAM,cAAc,MAAM,MAAA,aAAmB,KAC3C,aAAa,eACb,MAAA,QAAc,YACd,UAAU,OACX;AAED,SAAO,IAAI,WAAW,YAAY;;CAGpC,MAAM,OAAO,MAAkB,WAAyC;AACtE,SAAO,MAAA,aAAmB,OACxB;GAAE,MAAM;GAAS,MAAM;GAAW,EAClC,MAAA,QAAc,WACd,UAAU,QACV,KAAK,OACN;;CAGH,IAAI,SAAiB;AACnB,SAAO;GACL,KAAK,KAAK;GACV,QAAQ,OAAO,SAA8B;AAI3C,WAAO,SAHW,MAAM,KAAK,KAC3B,OAAO,SAAS,WAAW,IAAI,aAAa,CAAC,OAAO,KAAK,GAAG,KAC7D,EAC0B,YAAY;;GAEzC,KAAK;GACN;;;;;;AAOL,IAAa,gBAAb,cAAmC,aAAa;;;AC3FhD,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA;CAEA,mBAAmB,SAAsC;AACvD,OAAK,iBAAiB;AACtB,SAAO;;CAGT,iBAAiB,QAA4B;AAC3C,OAAK,eAAe;AACpB,SAAO;;CAKT,YAAY,SAAuB;AACjC,OAAK,UAAU;AACf,SAAO;;CAGT,MAAM,QAA+B;AACnC,MAAI,CAAC,KAAK,eACR,OAAM,IAAI,MACR,kEACD;EAGH,MAAM,eAAe,KAAK,gBAAgB,WAAW,OAAO;EAC5D,MAAM,UAAU,MAAM,MAAA,kBACpB,cACA,KAAK,eACN;EACD,MAAM,MAAM,MAAM,SAAS,QAAQ;AAEnC,SAAO,IAAI,aACT,KAAK,gBACL,cACA,SACA,KACA,KAAK,QACN;;CAGH,OAAA,kBACE,cACA,gBACwB;EACxB,MAAM,gBAAgB,MAAM,eAAe,aAAa;AACxD,MAAI,cACF,QAAO,cAAc,eAAe,aAAa;EAGnD,MAAM,UAAU,MAAM,gBAAgB,aAAa;EACnD,MAAM,WAAW,MAAM,cAAc,SAAS,aAAa;AAC3D,QAAM,eAAe,YAAY,SAAS;AAC1C,SAAO;;;;;AChEX,IAAa,mBAAb,MAA+D;CAC7D;CAEA,YAAY,SAAsB;AAChC,OAAK,UAAU;;CAGjB,cAAc;AACZ,SAAO,QAAQ,QAAQ,KAAK,QAAQ;;CAGtC,YAAY,SAAqB;AAC/B,OAAK,UAAU;AACf,SAAO,QAAQ,SAAS;;CAG1B,gBAAgB;AACd,OAAK,UAAU,KAAA;AACf,SAAO,QAAQ,SAAS;;;;;ACJ5B,IAAa,wBAAb,cAA2C,MAAM;CAC/C,cAAc;AACZ,QAAM,oBAAoB;;;AAI9B,IAAa,qBAAb,MAAmD;CACjD;CAEA,YACE,QACA,SACA,MACA;AAHiB,OAAA,SAAA;AACA,OAAA,UAAA;AACV,OAAA,OAAA;AAEP,OAAK,MAAM;GACT,KAAK,KAAK,OAAO;GACjB,MAAM,KAAK;GACZ;;CAGH,IAAI,YAAY;AACd,SAAO,KAAK,OAAO;;CAGrB,MAAM,KAAK,MAAuC;AAChD,SAAO,KAAK,OAAO,KAAK,KAAK;;CAG/B,MAAM,OAAO,MAAkB,WAAsC;AAEnE,MAAI,CADY,MAAM,KAAK,OAAO,OAAO,MAAM,UAAU,CAEvD,OAAM,IAAI,uBAAuB;;CAIrC,MAAM,WACJ,QACA,QACA,aACoB;EACpB,MAAM,YAAY,OAAO,SAAS,cAAc;AAChD,SAAO,KAAK,YAAY,QAAQ,QAAQ,WAAW,YAAY;;;;;;CAOjE,MAAM,6BACJ,QACA,QACA,oBACA,aACoB;EAEpB,MAAM,YAAY,GADI,OAAO,SAAS,cAAc,GACjB,GAAG;AACtC,SAAO,KAAK,YAAY,QAAQ,QAAQ,WAAW,YAAY;;;;;;CAOjE,MAAM,iBACJ,QACA,aACoB;AACpB,MAAI,aAAa,QACf,OAAM,IAAI,MAAM,kBAAkB;EAGpC,MAAM,SAA2C;qBAC9C,IAAI,MAAM,EAAC,SAAS,GAAG,KAAM,QAAQ,EAAE;GACxC,KAAK,OAAO;GACZ,MAAM,KAAK,WAAW,OAAO;GAC7B,OAAO,SAAS,cAAc;GAC/B;EACD,MAAM,iBAAiB,MAAM,KAAK,OAAO,KACvC,KAAK,sBAAsB,OAAO,CACnC;AAED,MAAI,aAAa,QACf,OAAM,IAAI,MAAM,kBAAkB;AAEpC,SAAO,CAAC,GAAG,QAAQ,KAAK,KAAK,iBAAiB,eAAe,GAAG;;CAGlE,MAAc,YACZ,QACA,QACA,WACA,aACoB;AACpB,MAAI,aAAa,QACf,OAAM,IAAI,MAAM,kBAAkB;EAGpC,MAAM,YAAY,MAAM,aAAa;GACnC;GACA;GACA,QAAQ,qBAAqB,KAAK;GAClC,OAAO,YAAY,KAAK,OAAO,KAAK,QAAQ;GAC5C,mBAAmB;GACpB,CAAC;AAEF,MAAI,aAAa,QACf,OAAM,IAAI,MAAM,kBAAkB;AAGpC,SAAO;;CAGT,MAAc,WAAW,QAAiC;EACxD,MAAM,UAAU;GACd,OAAO;GACP,OAAO;GACP,KAAK,UAAU,OAAO,MAAM;GAC7B,CAAC,KAAK,GAAG;EAEV,MAAM,OADU,IAAI,aAAa,CACZ,OAAO,QAAQ;EACpC,MAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC9D,SAAO,KAAK,oBAAoB,WAAW;;CAG7C,sBACE,QACY;EACZ,MAAM,UAAU,OAAO,KAAK,GAAG;EAC/B,MAAM,SAAS,yBAA4B,QAAQ,OAAO,UAAU;AAEpE,SADgB,IAAI,aAAa,CAClB,OAAO,SAAS,QAAQ;;CAGzC,iBAAyB,QAA0C;EACjE,MAAM,QACJ,kBAAkB,aAAa,SAAS,IAAI,WAAW,OAAO;AAChE,SAAO,MAAM,KAAK,MAAM,CACrB,KAAK,SAAS,KAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CACjD,KAAK,GAAG;;CAGb,oBAA4B,QAA6B;EACvD,MAAM,QAAQ,IAAI,WAAW,OAAO;EACpC,IAAI,SAAS;AACb,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAChC,WAAU,OAAO,aAAa,MAAM,GAAG;AAEzC,SAAO,KAAK,OAAO;;;;;;;AAQvB,SAAgB,wBACd,mBAAmB,OACW;AAC9B,QAAO,OAAO,WAAsB,cAAwC;EAC1E,MAAM,SAAS,UAAU,OAAO,SAAS;AACzC,MAAI,CAAC,UAAU,CAAC,UACd,QAAO,CAAC;EAGV,MAAM,aAAa,OAAO;AAC1B,MAAI,WAAW,WAAW,EACxB,QAAO;EAIT,MAAM,CAAC,WAAW,WAAW,MAAM,eAAe,gBADhC,WAAW,WAAW,SAAS;AAGjD,MAAI,cAAc,UAChB,QAAO;EAST,MAAM,UAAU,sBANiC;GAC/C;GACA;GACA;GACA;GACD,CAC4C;EAC7C,MAAM,iBAAiB,gBAAgB,aAAa;EAEpD,MAAM,YAAY,MAAM,gBAAgB,UAAU;AASlD,SAPgB,MAAM,OAAO,OAAO,OAClC;GAAE,MAAM;GAAS,MAAM;GAAW,EAClC,WACA,eAAe,QACf,QAAQ,OACT;;;AAML,SAAS,sBACP,QACY;CACZ,MAAM,UAAU,OAAO,KAAK,GAAG;CAC/B,MAAM,SAAS,yBAA4B,QAAQ,OAAO,UAAU;AAEpE,QADgB,IAAI,aAAa,CAClB,OAAO,SAAS,QAAQ;;AAGzC,SAAS,gBAAgB,KAAyB;CAChD,MAAM,WAAW,IAAI,WAAW,KAAK,GAAG,IAAI,MAAM,EAAE,GAAG;CACvD,MAAM,QAAQ,IAAI,WAAW,SAAS,SAAS,EAAE;AACjD,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,EACxC,OAAM,IAAI,KAAK,SAAS,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE,GAAG;AAE3D,QAAO;;AAGT,eAAe,gBAAgB,KAAiC;CAC9D,MAAM,UAAU,kBAAkB,IAAI;AACtC,QAAO,OAAO,OAAO,UACnB,OACA,QAAQ,QACR;EAAE,MAAM;EAAS,YAAY;EAAS,EACtC,MACA,CAAC,SAAS,CACX;;AAGH,SAAS,kBAAkB,KAAyB;CAClD,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,KAAI,MAAM,SAAS,KAAK,MAAM,OAAO,SAAS,MAAM,OAAO,MACzD,OAAM,IAAI,MAAM,uBAAuB,MAAM;CAG/C,MAAM,eAAe,MAAM;AAC3B,KAAI,CAAC,aAAa,WAAW,IAAI,CAC/B,OAAM,IAAI,MAAM,mCAAmC,aAAa,KAAK;CAGvE,MAAM,UAAU,aAAa,aAAa,MAAM,EAAE,CAAC;AAEnD,KAAI,QAAQ,OAAO,OAAQ,QAAQ,OAAO,GACxC,OAAM,IAAI,MAAM,oCAAoC;AAItD,QAAO,wBADe,QAAQ,MAAM,EAAE,CACO;;AAG/C,SAAS,aAAa,OAA2B;CAC/C,MAAM,WAAW;CACjB,MAAM,+BAAe,IAAI,KAAqB;AAC9C,MAAK,IAAI,IAAI,GAAG,IAAI,IAAiB,IACnC,cAAa,IAAI,SAAS,IAAI,EAAE;AAGlC,KAAI,MAAM,WAAW,EACnB,QAAO,IAAI,WAAW,EAAE;CAG1B,MAAM,QAAkB,CAAC,EAAE;AAC3B,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,aAAa,IAAI,KAAK;AACpC,MAAI,UAAU,KAAA,EACZ,OAAM,IAAI,MAAM,6BAA6B,OAAO;EAGtD,IAAI,QAAQ;AACZ,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAS,MAAM,KAAK;AACpB,SAAM,KAAK,QAAQ;AACnB,aAAU;;AAGZ,SAAO,QAAQ,GAAG;AAChB,SAAM,KAAK,QAAQ,IAAK;AACxB,aAAU;;;AAId,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,SAAS,IAAK;AAClB,QAAM,KAAK,EAAE;;AAGf,QAAO,IAAI,WAAW,MAAM,SAAS,CAAC;;AAGxC,SAAS,wBAAwB,YAAoC;AACnE,KAAI,WAAW,WAAW,GACxB,OAAM,IAAI,MAAM,kCAAkC,WAAW,SAAS;CAGxE,MAAM,SAAS,WAAW;AAC1B,KAAI,WAAW,KAAQ,WAAW,EAChC,OAAM,IAAI,MAAM,+BAA+B,SAAS;CAG1D,MAAM,IAAI,OACR,qEACD;CACD,MAAM,IAAI,OACR,qEACD;CACD,MAAM,IAAI,OACR,qEACD;CAED,IAAI,IAAI,OAAO,EAAE;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,IACrC,KAAK,KAAK,OAAO,EAAE,GAAI,OAAO,WAAW,GAAG;CAI9C,IAAI,IAAI,QADU,OAAO,GAAG,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,IAC/B,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,EAAE;AAIxD,KAFgB,IAAI,OAAO,EAAE,KAAK,OAAO,EAAE,MACtB,WAAW,GAE9B,KAAI,IAAI;CAGV,MAAM,eAAe,IAAI,WAAW,GAAG;AACvC,cAAa,KAAK;CAElB,MAAM,SAAS,cAAc,GAAG,GAAG;CACnC,MAAM,SAAS,cAAc,GAAG,GAAG;AAEnC,cAAa,IAAI,QAAQ,EAAE;AAC3B,cAAa,IAAI,QAAQ,GAAG;AAE5B,QAAO;;AAGT,SAAS,OAAO,MAAc,KAAa,KAAqB;CAC9D,IAAI,SAAS,OAAO,EAAE;AACtB,QAAO,OAAO;AACd,QAAO,MAAM,OAAO,EAAE,EAAE;AACtB,MAAI,MAAM,OAAO,EAAE,KAAK,OAAO,EAAE,CAC/B,UAAU,SAAS,OAAQ;AAE7B,QAAM,OAAO,OAAO,EAAE;AACtB,SAAQ,OAAO,OAAQ;;AAEzB,QAAO;;AAGT,SAAS,cAAc,GAAW,QAA4B;CAC5D,MAAM,QAAQ,IAAI,WAAW,OAAO;AACpC,MAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACpC,QAAM,KAAK,OAAO,IAAI,OAAO,IAAK,CAAC;AACnC,MAAI,KAAK,OAAO,EAAE;;AAEpB,QAAO;;;;;;;;;;;;AAaT,SAAgB,wBAAwB,WAGtC;CACA,MAAM,aAAa,UAAU,QAAQ,IAAI;AAEzC,KAAI,eAAe,GACjB,QAAO;EACL,eAAe;EACf,oBAAoB,KAAA;EACrB;AAGH,QAAO;EACL,eAAe,UAAU,UAAU,GAAG,WAAW;EACjD,oBAAoB,UAAU,UAAU,aAAa,EAAE;EACxD;;;;;;;;AASH,SAAgB,kCACd,WACoB;CACpB,MAAM,YAAY,UAAU;CAC5B,MAAM,EAAE,uBAAuB,wBAAwB,UAAU;AACjE,QAAO;;;;;;;;AAST,SAAgB,0BAA0B,WAA+B;AACvE,QAAO,kCAAkC,UAAU,KAAK,KAAA"}