@renown/sdk 6.2.2-dev.17 → 6.2.2-dev.19

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.
@@ -1 +1 @@
1
- {"version":3,"file":"types-DG816Qa8.js","names":[],"sources":["../src/wallet/types.ts"],"sourcesContent":["import type { ComponentType, ReactNode } from \"react\";\nimport type { SignCredentialTypedData } from \"../credential.js\";\n\nexport enum LoginMethod {\n WALLET = \"wallet\",\n GOOGLE = \"google\",\n EMAIL = \"email\",\n APPLE = \"apple\",\n}\n\n// Default login methods per adapter when config omits `methods`; single source\n// of truth shared by the adapters and useRenownLoginMethods so they can't drift.\nexport const DEFAULT_PRIVY_METHODS: LoginMethod[] = [\n LoginMethod.GOOGLE,\n LoginMethod.EMAIL,\n];\nexport const DEFAULT_MOCK_METHODS: LoginMethod[] = [\n LoginMethod.WALLET,\n LoginMethod.GOOGLE,\n LoginMethod.EMAIL,\n];\n\n// Colors the host passes into an adapter Provider so its wallet UI matches.\n// The adapter stays agnostic to how the host derives them (CSS tokens, etc.).\nexport interface WalletThemeColors {\n accentColor?: string;\n accentColorForeground?: string;\n}\n\n// The theme the host passes at runtime: a bare mode, or a mode plus colors.\nexport type WalletTheme =\n | \"light\"\n | \"dark\"\n | ({ mode: \"light\" | \"dark\" } & WalletThemeColors);\n\n// Normalize a WalletTheme (or undefined) to a mode + colors the adapters use.\nexport function normalizeWalletTheme(theme: WalletTheme | undefined): {\n mode: \"light\" | \"dark\";\n accentColor?: string;\n accentColorForeground?: string;\n} {\n if (theme === undefined) return { mode: \"light\" };\n if (typeof theme === \"string\") return { mode: theme };\n return {\n mode: theme.mode,\n accentColor: theme.accentColor,\n accentColorForeground: theme.accentColorForeground,\n };\n}\n\n// The signer surface signIn needs, produced by an adapter after the user connects.\nexport interface WalletSession {\n address: `0x${string}`;\n chainId: number;\n signTypedData: SignCredentialTypedData;\n}\n\n// Imperative controls returned by an adapter's React hook (used inside its Provider).\nexport interface WalletController {\n connect(method?: LoginMethod): Promise<WalletSession>;\n disconnect(): Promise<void>;\n getSession(): WalletSession | undefined;\n supportedMethods: LoginMethod[];\n}\n\n// What each adapter subexport default-exports (a factory over its own config slice).\nexport interface WalletAdapter {\n id: \"rainbow\" | \"privy\" | \"mock\";\n supportedMethods: LoginMethod[];\n // React provider that must wrap the app subtree for this adapter to work.\n // The host passes its current theme so the adapter's UI can match.\n Provider: ComponentType<{ children: ReactNode; theme?: WalletTheme }>;\n // Hook returning imperative controls; MUST be called inside <Provider>.\n useController: () => WalletController;\n}\n\nexport type WalletAdapterFactory<Config = unknown> = (\n config: Config,\n) => WalletAdapter;\n"],"mappings":";AAGA,IAAY,cAAL,yBAAA,aAAA;AACL,aAAA,YAAA;AACA,aAAA,YAAA;AACA,aAAA,WAAA;AACA,aAAA,WAAA;;KACD;AAID,MAAa,wBAAuC,CAClD,YAAY,QACZ,YAAY,MACb;AACD,MAAa,uBAAsC;CACjD,YAAY;CACZ,YAAY;CACZ,YAAY;CACb;AAgBD,SAAgB,qBAAqB,OAInC;AACA,KAAI,UAAU,KAAA,EAAW,QAAO,EAAE,MAAM,SAAS;AACjD,KAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,OAAO;AACrD,QAAO;EACL,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,uBAAuB,MAAM;EAC9B"}
1
+ {"version":3,"file":"types-DG816Qa8.js","names":[],"sources":["../src/wallet/types.ts"],"sourcesContent":["import type { ComponentType, ReactNode } from \"react\";\nimport type { SignCredentialTypedData } from \"../credential.js\";\n\nexport enum LoginMethod {\n WALLET = \"wallet\",\n GOOGLE = \"google\",\n EMAIL = \"email\",\n APPLE = \"apple\",\n}\n\n// Default login methods per adapter when config omits `methods`; single source\n// of truth shared by the adapters and useRenownLoginMethods so they can't drift.\nexport const DEFAULT_PRIVY_METHODS: LoginMethod[] = [\n LoginMethod.GOOGLE,\n LoginMethod.EMAIL,\n];\nexport const DEFAULT_MOCK_METHODS: LoginMethod[] = [\n LoginMethod.WALLET,\n LoginMethod.GOOGLE,\n LoginMethod.EMAIL,\n];\n\n// Colors the host passes into an adapter Provider so its wallet UI matches.\n// The adapter stays agnostic to how the host derives them (CSS tokens, etc.).\nexport interface WalletThemeColors {\n accentColor?: string;\n accentColorForeground?: string;\n}\n\n// The theme the host passes at runtime: a bare mode, or a mode plus colors.\nexport type WalletTheme =\n | \"light\"\n | \"dark\"\n | ({ mode: \"light\" | \"dark\" } & WalletThemeColors);\n\n// Normalize a WalletTheme (or undefined) to a mode + colors the adapters use.\nexport function normalizeWalletTheme(theme: WalletTheme | undefined): {\n mode: \"light\" | \"dark\";\n accentColor?: string;\n accentColorForeground?: string;\n} {\n if (theme === undefined) return { mode: \"light\" };\n if (typeof theme === \"string\") return { mode: theme };\n return {\n mode: theme.mode,\n accentColor: theme.accentColor,\n accentColorForeground: theme.accentColorForeground,\n };\n}\n\n// The signer surface signIn needs, produced by an adapter after the user connects.\nexport interface WalletSession {\n address: `0x${string}`;\n chainId: number;\n signTypedData: SignCredentialTypedData;\n // Capability, not policy: the session can sign without a user prompt (e.g. a\n // Privy embedded wallet). Whether/when to sign silently is the host's call.\n canSignSilently?: boolean;\n}\n\n// Imperative controls returned by an adapter's React hook (used inside its Provider).\nexport interface WalletController {\n connect(method?: LoginMethod): Promise<WalletSession>;\n disconnect(): Promise<void>;\n getSession(): WalletSession | undefined;\n // Optional push stream of session changes (fires immediately with the current\n // one), so a host can complete sign-in on an OAuth return with no live connect().\n subscribe?(\n listener: (session: WalletSession | undefined) => void,\n ): () => void;\n supportedMethods: LoginMethod[];\n}\n\n// What each adapter subexport default-exports (a factory over its own config slice).\nexport interface WalletAdapter {\n id: \"rainbow\" | \"privy\" | \"mock\";\n supportedMethods: LoginMethod[];\n // React provider that must wrap the app subtree for this adapter to work.\n // The host passes its current theme so the adapter's UI can match.\n Provider: ComponentType<{ children: ReactNode; theme?: WalletTheme }>;\n // Hook returning imperative controls; MUST be called inside <Provider>.\n useController: () => WalletController;\n}\n\nexport type WalletAdapterFactory<Config = unknown> = (\n config: Config,\n) => WalletAdapter;\n\n// Minimal descriptor an adapter exposes for eager import (no wallet library), so\n// a host can detect a redirect return without loading the adapter's heavy factory.\nexport interface WalletAdapterMeta {\n id: WalletAdapter[\"id\"];\n // URL params the adapter leaves when a full-page OAuth login returns; empty for\n // adapters with no redirect flow.\n redirectReturnParams: string[];\n}\n"],"mappings":";AAGA,IAAY,cAAL,yBAAA,aAAA;AACL,aAAA,YAAA;AACA,aAAA,YAAA;AACA,aAAA,WAAA;AACA,aAAA,WAAA;;KACD;AAID,MAAa,wBAAuC,CAClD,YAAY,QACZ,YAAY,MACb;AACD,MAAa,uBAAsC;CACjD,YAAY;CACZ,YAAY;CACZ,YAAY;CACb;AAgBD,SAAgB,qBAAqB,OAInC;AACA,KAAI,UAAU,KAAA,EAAW,QAAO,EAAE,MAAM,SAAS;AACjD,KAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,OAAO;AACrD,QAAO;EACL,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,uBAAuB,MAAM;EAC9B"}
@@ -26,11 +26,13 @@ interface WalletSession {
26
26
  address: `0x${string}`;
27
27
  chainId: number;
28
28
  signTypedData: SignCredentialTypedData;
29
+ canSignSilently?: boolean;
29
30
  }
30
31
  interface WalletController {
31
32
  connect(method?: LoginMethod): Promise<WalletSession>;
32
33
  disconnect(): Promise<void>;
33
34
  getSession(): WalletSession | undefined;
35
+ subscribe?(listener: (session: WalletSession | undefined) => void): () => void;
34
36
  supportedMethods: LoginMethod[];
35
37
  }
36
38
  interface WalletAdapter {
@@ -43,6 +45,10 @@ interface WalletAdapter {
43
45
  useController: () => WalletController;
44
46
  }
45
47
  type WalletAdapterFactory<Config = unknown> = (config: Config) => WalletAdapter;
48
+ interface WalletAdapterMeta {
49
+ id: WalletAdapter["id"];
50
+ redirectReturnParams: string[];
51
+ }
46
52
  //#endregion
47
- export { WalletAdapterFactory as a, WalletTheme as c, WalletAdapter as i, WalletThemeColors as l, DEFAULT_PRIVY_METHODS as n, WalletController as o, LoginMethod as r, WalletSession as s, DEFAULT_MOCK_METHODS as t, normalizeWalletTheme as u };
48
- //# sourceMappingURL=types-B5VOm-9h.d.ts.map
53
+ export { WalletAdapterFactory as a, WalletSession as c, normalizeWalletTheme as d, WalletAdapter as i, WalletTheme as l, DEFAULT_PRIVY_METHODS as n, WalletAdapterMeta as o, LoginMethod as r, WalletController as s, DEFAULT_MOCK_METHODS as t, WalletThemeColors as u };
54
+ //# sourceMappingURL=types-Z6jyeonm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-Z6jyeonm.d.ts","names":[],"sources":["../src/wallet/types.ts"],"mappings":";;;;aAGY,WAAA;EACV,MAAA;EACA,MAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,cAKW,qBAAA,EAAuB,WAAA;AAAA,cAIvB,oBAAA,EAAsB,WAAA;AAAA,UAQlB,iBAAA;EACf,WAAA;EACA,qBAAA;AAAA;AAAA,KAIU,WAAA;EAGL,IAAA;AAAA,IAA2B,iBAAA;AAAA,iBAGlB,oBAAA,CAAqB,KAAA,EAAO,WAAA;EAC1C,IAAA;EACA,WAAA;EACA,qBAAA;AAAA;AAAA,UAYe,aAAA;EACf,OAAA;EACA,OAAA;EACA,aAAA,EAAe,uBAAA;EAGf,eAAA;AAAA;AAAA,UAIe,gBAAA;EACf,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,aAAA;EACvC,UAAA,IAAc,OAAA;EACd,UAAA,IAAc,aAAA;EAGd,SAAA,EACE,QAAA,GAAW,OAAA,EAAS,aAAA;EAEtB,gBAAA,EAAkB,WAAA;AAAA;AAAA,UAIH,aAAA;EACf,EAAA;EACA,gBAAA,EAAkB,WAAA;EAGlB,QAAA,EAAU,aAAA;IAAgB,QAAA,EAAU,SAAA;IAAW,KAAA,GAAQ,WAAA;EAAA;EAEvD,aAAA,QAAqB,gBAAA;AAAA;AAAA,KAGX,oBAAA,sBACV,MAAA,EAAQ,MAAA,KACL,aAAA;AAAA,UAIY,iBAAA;EACf,EAAA,EAAI,aAAA;EAGJ,oBAAA;AAAA"}
@@ -1,9 +1,10 @@
1
- import { a as WalletAdapterFactory, c as WalletTheme, i as WalletAdapter, l as WalletThemeColors, n as DEFAULT_PRIVY_METHODS, o as WalletController, r as LoginMethod, s as WalletSession, t as DEFAULT_MOCK_METHODS, u as normalizeWalletTheme } from "../types-B5VOm-9h.js";
1
+ import { a as WalletAdapterFactory, c as WalletSession, d as normalizeWalletTheme, i as WalletAdapter, l as WalletTheme, n as DEFAULT_PRIVY_METHODS, o as WalletAdapterMeta, r as LoginMethod, s as WalletController, t as DEFAULT_MOCK_METHODS, u as WalletThemeColors } from "../types-Z6jyeonm.js";
2
2
 
3
3
  //#region src/wallet/controller.d.ts
4
4
  interface WalletRainbowConfig {
5
- walletConnectProjectId: string;
5
+ walletConnectProjectId?: string;
6
6
  infuraProjectId?: string;
7
+ ssr?: boolean;
7
8
  }
8
9
  interface WalletPrivyConfig {
9
10
  appId: string;
@@ -20,9 +21,10 @@ interface WalletAdaptersConfig {
20
21
  privy?: WalletPrivyConfig;
21
22
  mock?: WalletMockConfig;
22
23
  }
24
+ declare function isWalletRedirectReturn(search: string): boolean;
23
25
  declare function resolveAdapters(config: WalletAdaptersConfig | undefined): Promise<WalletAdapter[]>;
24
26
  declare function supportedMethods(adapters: WalletAdapter[]): LoginMethod[];
25
27
  declare function resolveForMethod(adapters: WalletAdapter[], method: LoginMethod): WalletAdapter;
26
28
  //#endregion
27
- export { DEFAULT_MOCK_METHODS, DEFAULT_PRIVY_METHODS, LoginMethod, WalletAdapter, WalletAdapterFactory, WalletAdaptersConfig, WalletController, WalletMockConfig, WalletPrivyConfig, WalletRainbowConfig, WalletSession, WalletTheme, WalletThemeColors, normalizeWalletTheme, resolveAdapters, resolveForMethod, supportedMethods };
29
+ export { DEFAULT_MOCK_METHODS, DEFAULT_PRIVY_METHODS, LoginMethod, WalletAdapter, WalletAdapterFactory, WalletAdapterMeta, WalletAdaptersConfig, WalletController, WalletMockConfig, WalletPrivyConfig, WalletRainbowConfig, WalletSession, WalletTheme, WalletThemeColors, isWalletRedirectReturn, normalizeWalletTheme, resolveAdapters, resolveForMethod, supportedMethods };
28
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/wallet/controller.ts"],"mappings":";;;UAQiB,mBAAA;EACf,sBAAA;EACA,eAAA;AAAA;AAAA,UAGe,iBAAA;EACf,KAAA;EACA,QAAA;EACA,OAAA;AAAA;AAAA,UAIe,gBAAA;EACf,UAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,UAGe,oBAAA;EACf,OAAA,GAAU,mBAAA;EACV,KAAA,GAAQ,iBAAA;EACR,IAAA,GAAO,gBAAA;AAAA;AAAA,iBA0Ba,eAAA,CACpB,MAAA,EAAQ,oBAAA,eACP,OAAA,CAAQ,aAAA;AAAA,iBAqCK,gBAAA,CAAiB,QAAA,EAAU,aAAA,KAAkB,WAAA;AAAA,iBAU7C,gBAAA,CACd,QAAA,EAAU,aAAA,IACV,MAAA,EAAQ,WAAA,GACP,aAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/wallet/controller.ts"],"mappings":";;;UAYiB,mBAAA;EACf,sBAAA;EACA,eAAA;EAGA,GAAA;AAAA;AAAA,UAGe,iBAAA;EACf,KAAA;EACA,QAAA;EACA,OAAA;AAAA;AAAA,UAIe,gBAAA;EACf,UAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,UAGe,oBAAA;EACf,OAAA,GAAU,mBAAA;EACV,KAAA,GAAQ,iBAAA;EACR,IAAA,GAAO,gBAAA;AAAA;AAAA,iBAaO,sBAAA,CAAuB,MAAA;AAAA,iBA8BjB,eAAA,CACpB,MAAA,EAAQ,oBAAA,eACP,OAAA,CAAQ,aAAA;AAAA,iBAqCK,gBAAA,CAAiB,QAAA,EAAU,aAAA,KAAkB,WAAA;AAAA,iBAU7C,gBAAA,CACd,QAAA,EAAU,aAAA,IACV,MAAA,EAAQ,WAAA,GACP,aAAA"}
@@ -1,5 +1,24 @@
1
1
  import { i as normalizeWalletTheme, n as DEFAULT_PRIVY_METHODS, r as LoginMethod, t as DEFAULT_MOCK_METHODS } from "../types-DG816Qa8.js";
2
+ //#endregion
2
3
  //#region src/wallet/controller.ts
4
+ const ADAPTER_METAS = [
5
+ {
6
+ id: "rainbow",
7
+ redirectReturnParams: []
8
+ },
9
+ {
10
+ id: "privy",
11
+ redirectReturnParams: ["privy_oauth_code", "privy_oauth_state"]
12
+ },
13
+ {
14
+ id: "mock",
15
+ redirectReturnParams: []
16
+ }
17
+ ];
18
+ function isWalletRedirectReturn(search) {
19
+ const params = new URLSearchParams(search);
20
+ return ADAPTER_METAS.some((meta) => meta.redirectReturnParams.some((param) => params.has(param)));
21
+ }
3
22
  const ADAPTER_PEER_DEPS = {
4
23
  rainbow: [
5
24
  "wagmi",
@@ -50,6 +69,6 @@ function resolveForMethod(adapters, method) {
50
69
  return adapter;
51
70
  }
52
71
  //#endregion
53
- export { DEFAULT_MOCK_METHODS, DEFAULT_PRIVY_METHODS, LoginMethod, normalizeWalletTheme, resolveAdapters, resolveForMethod, supportedMethods };
72
+ export { DEFAULT_MOCK_METHODS, DEFAULT_PRIVY_METHODS, LoginMethod, isWalletRedirectReturn, normalizeWalletTheme, resolveAdapters, resolveForMethod, supportedMethods };
54
73
 
55
74
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/wallet/controller.ts"],"sourcesContent":["import type {\n LoginMethod,\n WalletAdapter,\n WalletAdapterFactory,\n} from \"./types.js\";\n\n// Structural config slices the core codes against; each adapter subexport accepts\n// a compatible config. Kept local so the core imports no wallet-lib or shared type.\nexport interface WalletRainbowConfig {\n walletConnectProjectId: string;\n infuraProjectId?: string;\n}\n\nexport interface WalletPrivyConfig {\n appId: string;\n clientId?: string;\n methods?: string[];\n}\n\n// TEST/DEV only: a headless signer backed by a local key. Never enable in prod.\nexport interface WalletMockConfig {\n privateKey?: `0x${string}`;\n chainId?: number;\n methods?: string[];\n}\n\nexport interface WalletAdaptersConfig {\n rainbow?: WalletRainbowConfig;\n privy?: WalletPrivyConfig;\n mock?: WalletMockConfig;\n}\n\n// Peer dependencies each adapter subexport imports; listed in the error message\n// when a dynamic import fails so operators know exactly what to install.\nconst ADAPTER_PEER_DEPS: Record<string, string[]> = {\n rainbow: [\"wagmi\", \"@rainbow-me/rainbowkit\", \"@tanstack/react-query\", \"viem\"],\n privy: [\"@privy-io/react-auth\", \"viem\"],\n mock: [\"viem\"],\n};\n\n// A module-not-found from a dynamic import means the adapter's optional peer\n// dependency isn't installed; explain it in plain language instead of the raw error.\nfunction logAdapterLoadError(\n id: \"rainbow\" | \"privy\" | \"mock\",\n error: unknown,\n): void {\n const deps = ADAPTER_PEER_DEPS[id].join(\", \");\n console.error(\n `[renown] Could not load the \"${id}\" wallet adapter. It is enabled in renown.adapters but its peer dependencies are not installed. Install them to use it: ${deps} — or remove \"${id}\" from renown.adapters.`,\n error,\n );\n}\n\n// Dynamically import ONLY the adapters an operator configured; the wallet-lib\n// code and its peer dep load only when the matching dynamic import runs.\nexport async function resolveAdapters(\n config: WalletAdaptersConfig | undefined,\n): Promise<WalletAdapter[]> {\n const adapters: WalletAdapter[] = [];\n if (!config) return adapters;\n if (config.rainbow) {\n try {\n const mod = (await import(\"@renown/sdk/wallet/rainbow\")) as unknown as {\n createRainbowAdapter: WalletAdapterFactory<WalletRainbowConfig>;\n };\n adapters.push(mod.createRainbowAdapter(config.rainbow));\n } catch (error) {\n logAdapterLoadError(\"rainbow\", error);\n }\n }\n if (config.privy) {\n try {\n const mod = (await import(\"@renown/sdk/wallet/privy\")) as unknown as {\n createPrivyAdapter: WalletAdapterFactory<WalletPrivyConfig>;\n };\n adapters.push(mod.createPrivyAdapter(config.privy));\n } catch (error) {\n logAdapterLoadError(\"privy\", error);\n }\n }\n if (config.mock) {\n try {\n const mod = (await import(\"@renown/sdk/wallet/mock\")) as unknown as {\n createMockAdapter: WalletAdapterFactory<WalletMockConfig>;\n };\n adapters.push(mod.createMockAdapter(config.mock));\n } catch (error) {\n logAdapterLoadError(\"mock\", error);\n }\n }\n return adapters;\n}\n\n// Union of all login methods supported across the resolved adapters.\nexport function supportedMethods(adapters: WalletAdapter[]): LoginMethod[] {\n const methods = new Set<LoginMethod>();\n for (const adapter of adapters) {\n for (const method of adapter.supportedMethods) methods.add(method);\n }\n return Array.from(methods);\n}\n\n// Return the sole adapter that supports `method`; throws if none or more than one\n// does (ambiguous config — the caller must resolve the adapter explicitly).\nexport function resolveForMethod(\n adapters: WalletAdapter[],\n method: LoginMethod,\n): WalletAdapter {\n const matches = adapters.filter((a) => a.supportedMethods.includes(method));\n if (matches.length > 1) {\n throw new Error(\n `Multiple adapters support login method \"${method}\": ${matches\n .map((a) => a.id)\n .join(\", \")}. Resolve the adapter explicitly.`,\n );\n }\n const adapter = matches.at(0);\n if (!adapter) {\n throw new Error(`No adapter registered for login method \"${method}\"`);\n }\n return adapter;\n}\n"],"mappings":";;AAkCA,MAAM,oBAA8C;CAClD,SAAS;EAAC;EAAS;EAA0B;EAAyB;EAAO;CAC7E,OAAO,CAAC,wBAAwB,OAAO;CACvC,MAAM,CAAC,OAAO;CACf;AAID,SAAS,oBACP,IACA,OACM;CACN,MAAM,OAAO,kBAAkB,IAAI,KAAK,KAAK;AAC7C,SAAQ,MACN,gCAAgC,GAAG,0HAA0H,KAAK,gBAAgB,GAAG,0BACrL,MACD;;AAKH,eAAsB,gBACpB,QAC0B;CAC1B,MAAM,WAA4B,EAAE;AACpC,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,OAAO,QACT,KAAI;EACF,MAAM,MAAO,MAAM,OAAO;AAG1B,WAAS,KAAK,IAAI,qBAAqB,OAAO,QAAQ,CAAC;UAChD,OAAO;AACd,sBAAoB,WAAW,MAAM;;AAGzC,KAAI,OAAO,MACT,KAAI;EACF,MAAM,MAAO,MAAM,OAAO;AAG1B,WAAS,KAAK,IAAI,mBAAmB,OAAO,MAAM,CAAC;UAC5C,OAAO;AACd,sBAAoB,SAAS,MAAM;;AAGvC,KAAI,OAAO,KACT,KAAI;EACF,MAAM,MAAO,MAAM,OAAO;AAG1B,WAAS,KAAK,IAAI,kBAAkB,OAAO,KAAK,CAAC;UAC1C,OAAO;AACd,sBAAoB,QAAQ,MAAM;;AAGtC,QAAO;;AAIT,SAAgB,iBAAiB,UAA0C;CACzE,MAAM,0BAAU,IAAI,KAAkB;AACtC,MAAK,MAAM,WAAW,SACpB,MAAK,MAAM,UAAU,QAAQ,iBAAkB,SAAQ,IAAI,OAAO;AAEpE,QAAO,MAAM,KAAK,QAAQ;;AAK5B,SAAgB,iBACd,UACA,QACe;CACf,MAAM,UAAU,SAAS,QAAQ,MAAM,EAAE,iBAAiB,SAAS,OAAO,CAAC;AAC3E,KAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,MACR,2CAA2C,OAAO,KAAK,QACpD,KAAK,MAAM,EAAE,GAAG,CAChB,KAAK,KAAK,CAAC,mCACf;CAEH,MAAM,UAAU,QAAQ,GAAG,EAAE;AAC7B,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,2CAA2C,OAAO,GAAG;AAEvE,QAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/wallet/mock/meta.ts","../../src/wallet/privy/meta.ts","../../src/wallet/rainbow/meta.ts","../../src/wallet/controller.ts"],"sourcesContent":["import type { WalletAdapterMeta } from \"../types.js\";\n\n// Dependency-free descriptor (see privy/meta.ts). The mock signer has no\n// full-page OAuth redirect.\nexport const mockAdapterMeta: WalletAdapterMeta = {\n id: \"mock\",\n redirectReturnParams: [],\n};\n","import type { WalletAdapterMeta } from \"../types.js\";\n\n// Dependency-free descriptor, safe to import eagerly (pulls no wallet library);\n// the heavy createPrivyAdapter factory stays behind a dynamic import.\nexport const privyAdapterMeta: WalletAdapterMeta = {\n id: \"privy\",\n redirectReturnParams: [\"privy_oauth_code\", \"privy_oauth_state\"],\n};\n","import type { WalletAdapterMeta } from \"../types.js\";\n\n// Dependency-free descriptor (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};\n","import { mockAdapterMeta } from \"./mock/meta.js\";\nimport { privyAdapterMeta } from \"./privy/meta.js\";\nimport { rainbowAdapterMeta } from \"./rainbow/meta.js\";\nimport type {\n LoginMethod,\n WalletAdapter,\n WalletAdapterFactory,\n WalletAdapterMeta,\n} from \"./types.js\";\n\n// Structural config slices the core codes against; each adapter subexport accepts\n// a compatible config. Kept local so the core imports no wallet-lib or shared type.\nexport interface WalletRainbowConfig {\n walletConnectProjectId?: string;\n infuraProjectId?: string;\n // Set on 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 interface WalletPrivyConfig {\n appId: string;\n clientId?: string;\n methods?: string[];\n}\n\n// TEST/DEV only: a headless signer backed by a local key. Never enable in prod.\nexport interface WalletMockConfig {\n privateKey?: `0x${string}`;\n chainId?: number;\n methods?: string[];\n}\n\nexport interface WalletAdaptersConfig {\n rainbow?: WalletRainbowConfig;\n privy?: WalletPrivyConfig;\n mock?: WalletMockConfig;\n}\n\n// Adapter descriptors, imported eagerly (each is dependency-free — no wallet\n// library). Their factories still load lazily via resolveAdapters below.\nconst ADAPTER_METAS: WalletAdapterMeta[] = [\n rainbowAdapterMeta,\n privyAdapterMeta,\n mockAdapterMeta,\n];\n\n// True when a URL search string looks like a wallet OAuth redirect return, per\n// each adapter's own declared params — no adapter-specific strings live here.\nexport function isWalletRedirectReturn(search: string): boolean {\n const params = new URLSearchParams(search);\n return ADAPTER_METAS.some((meta) =>\n meta.redirectReturnParams.some((param) => params.has(param)),\n );\n}\n\n// Peer dependencies each adapter subexport imports; listed in the error message\n// when a dynamic import fails so operators know exactly what to install.\nconst ADAPTER_PEER_DEPS: Record<string, string[]> = {\n rainbow: [\"wagmi\", \"@rainbow-me/rainbowkit\", \"@tanstack/react-query\", \"viem\"],\n privy: [\"@privy-io/react-auth\", \"viem\"],\n mock: [\"viem\"],\n};\n\n// A module-not-found from a dynamic import means the adapter's optional peer\n// dependency isn't installed; explain it in plain language instead of the raw error.\nfunction logAdapterLoadError(\n id: \"rainbow\" | \"privy\" | \"mock\",\n error: unknown,\n): void {\n const deps = ADAPTER_PEER_DEPS[id].join(\", \");\n console.error(\n `[renown] Could not load the \"${id}\" wallet adapter. It is enabled in renown.adapters but its peer dependencies are not installed. Install them to use it: ${deps} — or remove \"${id}\" from renown.adapters.`,\n error,\n );\n}\n\n// Dynamically import ONLY the adapters an operator configured; the wallet-lib\n// code and its peer dep load only when the matching dynamic import runs.\nexport async function resolveAdapters(\n config: WalletAdaptersConfig | undefined,\n): Promise<WalletAdapter[]> {\n const adapters: WalletAdapter[] = [];\n if (!config) return adapters;\n if (config.rainbow) {\n try {\n const mod = (await import(\"@renown/sdk/wallet/rainbow\")) as unknown as {\n createRainbowAdapter: WalletAdapterFactory<WalletRainbowConfig>;\n };\n adapters.push(mod.createRainbowAdapter(config.rainbow));\n } catch (error) {\n logAdapterLoadError(\"rainbow\", error);\n }\n }\n if (config.privy) {\n try {\n const mod = (await import(\"@renown/sdk/wallet/privy\")) as unknown as {\n createPrivyAdapter: WalletAdapterFactory<WalletPrivyConfig>;\n };\n adapters.push(mod.createPrivyAdapter(config.privy));\n } catch (error) {\n logAdapterLoadError(\"privy\", error);\n }\n }\n if (config.mock) {\n try {\n const mod = (await import(\"@renown/sdk/wallet/mock\")) as unknown as {\n createMockAdapter: WalletAdapterFactory<WalletMockConfig>;\n };\n adapters.push(mod.createMockAdapter(config.mock));\n } catch (error) {\n logAdapterLoadError(\"mock\", error);\n }\n }\n return adapters;\n}\n\n// Union of all login methods supported across the resolved adapters.\nexport function supportedMethods(adapters: WalletAdapter[]): LoginMethod[] {\n const methods = new Set<LoginMethod>();\n for (const adapter of adapters) {\n for (const method of adapter.supportedMethods) methods.add(method);\n }\n return Array.from(methods);\n}\n\n// Return the sole adapter that supports `method`; throws if none or more than one\n// does (ambiguous config — the caller must resolve the adapter explicitly).\nexport function resolveForMethod(\n adapters: WalletAdapter[],\n method: LoginMethod,\n): WalletAdapter {\n const matches = adapters.filter((a) => a.supportedMethods.includes(method));\n if (matches.length > 1) {\n throw new Error(\n `Multiple adapters support login method \"${method}\": ${matches\n .map((a) => a.id)\n .join(\", \")}. Resolve the adapter explicitly.`,\n );\n }\n const adapter = matches.at(0);\n if (!adapter) {\n throw new Error(`No adapter registered for login method \"${method}\"`);\n }\n return adapter;\n}\n"],"mappings":";;;AGyCA,MAAM,gBAAqC;CDrCU;EACnD,IAAI;EACJ,sBAAsB,EAAE;EACzB;CDHkD;EACjD,IAAI;EACJ,sBAAsB,CAAC,oBAAoB,oBAAoB;EAChE;CDHiD;EAChD,IAAI;EACJ,sBAAsB,EAAE;EACzB;CGsCA;AAID,SAAgB,uBAAuB,QAAyB;CAC9D,MAAM,SAAS,IAAI,gBAAgB,OAAO;AAC1C,QAAO,cAAc,MAAM,SACzB,KAAK,qBAAqB,MAAM,UAAU,OAAO,IAAI,MAAM,CAAC,CAC7D;;AAKH,MAAM,oBAA8C;CAClD,SAAS;EAAC;EAAS;EAA0B;EAAyB;EAAO;CAC7E,OAAO,CAAC,wBAAwB,OAAO;CACvC,MAAM,CAAC,OAAO;CACf;AAID,SAAS,oBACP,IACA,OACM;CACN,MAAM,OAAO,kBAAkB,IAAI,KAAK,KAAK;AAC7C,SAAQ,MACN,gCAAgC,GAAG,0HAA0H,KAAK,gBAAgB,GAAG,0BACrL,MACD;;AAKH,eAAsB,gBACpB,QAC0B;CAC1B,MAAM,WAA4B,EAAE;AACpC,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,OAAO,QACT,KAAI;EACF,MAAM,MAAO,MAAM,OAAO;AAG1B,WAAS,KAAK,IAAI,qBAAqB,OAAO,QAAQ,CAAC;UAChD,OAAO;AACd,sBAAoB,WAAW,MAAM;;AAGzC,KAAI,OAAO,MACT,KAAI;EACF,MAAM,MAAO,MAAM,OAAO;AAG1B,WAAS,KAAK,IAAI,mBAAmB,OAAO,MAAM,CAAC;UAC5C,OAAO;AACd,sBAAoB,SAAS,MAAM;;AAGvC,KAAI,OAAO,KACT,KAAI;EACF,MAAM,MAAO,MAAM,OAAO;AAG1B,WAAS,KAAK,IAAI,kBAAkB,OAAO,KAAK,CAAC;UAC1C,OAAO;AACd,sBAAoB,QAAQ,MAAM;;AAGtC,QAAO;;AAIT,SAAgB,iBAAiB,UAA0C;CACzE,MAAM,0BAAU,IAAI,KAAkB;AACtC,MAAK,MAAM,WAAW,SACpB,MAAK,MAAM,UAAU,QAAQ,iBAAkB,SAAQ,IAAI,OAAO;AAEpE,QAAO,MAAM,KAAK,QAAQ;;AAK5B,SAAgB,iBACd,UACA,QACe;CACf,MAAM,UAAU,SAAS,QAAQ,MAAM,EAAE,iBAAiB,SAAS,OAAO,CAAC;AAC3E,KAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,MACR,2CAA2C,OAAO,KAAK,QACpD,KAAK,MAAM,EAAE,GAAG,CAChB,KAAK,KAAK,CAAC,mCACf;CAEH,MAAM,UAAU,QAAQ,GAAG,EAAE;AAC7B,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,2CAA2C,OAAO,GAAG;AAEvE,QAAO"}
@@ -1,4 +1,4 @@
1
- import { i as WalletAdapter } from "../../types-B5VOm-9h.js";
1
+ import { i as WalletAdapter } from "../../types-Z6jyeonm.js";
2
2
 
3
3
  //#region src/wallet/mock/index.d.ts
4
4
  type Hex = `0x${string}`;
@@ -1,5 +1,5 @@
1
1
  import { it as SignCredentialTypedData } from "../../types-DsF91dDF.js";
2
- import { c as WalletTheme, i as WalletAdapter, r as LoginMethod, s as WalletSession } from "../../types-B5VOm-9h.js";
2
+ import { c as WalletSession, i as WalletAdapter, l as WalletTheme, r as LoginMethod } from "../../types-Z6jyeonm.js";
3
3
  import { ComponentType, ReactNode } from "react";
4
4
  import { ConnectedWallet, LoginModalOptions } from "@privy-io/react-auth";
5
5
 
@@ -16,9 +16,12 @@ declare class PrivyCore {
16
16
  private bindings;
17
17
  private pending;
18
18
  private session;
19
+ private listeners;
19
20
  constructor(supportedMethods: LoginMethod[]);
20
21
  bind(bindings: PrivyBindings): () => void;
21
22
  getSession(): WalletSession | undefined;
23
+ subscribe(listener: (session: WalletSession | undefined) => void): () => void;
24
+ private emit;
22
25
  syncFromEmbeddedWallet(wallet: ConnectedWallet): void;
23
26
  clearSession(): void;
24
27
  handleLoginError(error: unknown): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/privy/adapter.ts","../../../src/wallet/privy/bridge.tsx","../../../src/wallet/privy/provider.tsx","../../../src/wallet/privy/index.ts"],"mappings":";;;;;;KAYK,GAAA;AAAA,iBAgBW,mBAAA,CAAoB,OAAA,cAAqB,WAAA;AAAA,UAexC,aAAA;EACf,cAAA,GAAiB,OAAA,GAAU,iBAAA;EAC3B,MAAA,QAAc,OAAA;EACd,aAAA,GACE,IAAA,EAAM,UAAA,CAAW,uBAAA,MACjB,OAAA,EAAS,GAAA,KACN,OAAA,CAAQ,GAAA;AAAA;AAAA,cAUF,SAAA;EAAA,SACF,gBAAA,EAAkB,WAAA;EAAA,QAEnB,QAAA;EAAA,QACA,OAAA;EAAA,QACA,OAAA;cAEI,gBAAA,EAAkB,WAAA;EAI9B,IAAA,CAAK,QAAA,EAAU,aAAA;EAOf,UAAA,CAAA,GAAc,aAAA;EAMd,sBAAA,CAAuB,MAAA,EAAQ,eAAA;EAmB/B,YAAA,CAAA;EAMA,gBAAA,CAAiB,KAAA;EAOX,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,aAAA;EA+BvC,UAAA,CAAA,GAAc,OAAA;AAAA;;;UCrIZ,uBAAA;EACR,IAAA,EAAM,SAAA;AAAA;AAAA,iBAKQ,kBAAA,CAAA;EAAqB;AAAA,GAAQ,uBAAA;;;UCbnC,mBAAA;EACR,KAAA;EACA,QAAA;AAAA;AAAA,iBAKc,mBAAA,CACd,IAAA,EAAM,SAAA,EACN,MAAA,EAAQ,mBAAA,GACP,aAAA;EAAgB,QAAA,EAAU,SAAA;EAAW,KAAA,GAAQ,WAAA;AAAA;;;UCV/B,0BAAA;EACf,KAAA;EACA,QAAA;EACA,OAAA;AAAA;AAAA,iBAKc,kBAAA,CACd,MAAA,EAAQ,0BAAA,GACP,aAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/privy/adapter.ts","../../../src/wallet/privy/bridge.tsx","../../../src/wallet/privy/provider.tsx","../../../src/wallet/privy/index.ts"],"mappings":";;;;;;KAYK,GAAA;AAAA,iBAgBW,mBAAA,CAAoB,OAAA,cAAqB,WAAA;AAAA,UAexC,aAAA;EACf,cAAA,GAAiB,OAAA,GAAU,iBAAA;EAC3B,MAAA,QAAc,OAAA;EACd,aAAA,GACE,IAAA,EAAM,UAAA,CAAW,uBAAA,MACjB,OAAA,EAAS,GAAA,KACN,OAAA,CAAQ,GAAA;AAAA;AAAA,cAUF,SAAA;EAAA,SACF,gBAAA,EAAkB,WAAA;EAAA,QAEnB,QAAA;EAAA,QACA,OAAA;EAAA,QACA,OAAA;EAAA,QACA,SAAA;cAEI,gBAAA,EAAkB,WAAA;EAI9B,IAAA,CAAK,QAAA,EAAU,aAAA;EAOf,UAAA,CAAA,GAAc,aAAA;EAMd,SAAA,CACE,QAAA,GAAW,OAAA,EAAS,aAAA;EAAA,QASd,IAAA;EAMR,sBAAA,CAAuB,MAAA,EAAQ,eAAA;EA8B/B,YAAA,CAAA;EAOA,gBAAA,CAAiB,KAAA;EAOX,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,aAAA;EA+BvC,UAAA,CAAA,GAAc,OAAA;AAAA;;;UClKZ,uBAAA;EACR,IAAA,EAAM,SAAA;AAAA;AAAA,iBAKQ,kBAAA,CAAA;EAAqB;AAAA,GAAQ,uBAAA;;;UCbnC,mBAAA;EACR,KAAA;EACA,QAAA;AAAA;AAAA,iBAKc,mBAAA,CACd,IAAA,EAAM,SAAA,EACN,MAAA,EAAQ,mBAAA,GACP,aAAA;EAAgB,QAAA,EAAU,SAAA;EAAW,KAAA,GAAQ,WAAA;AAAA;;;UCV/B,0BAAA;EACf,KAAA;EACA,QAAA;EACA,OAAA;AAAA;AAAA,iBAKc,kBAAA,CACd,MAAA,EAAQ,0BAAA,GACP,aAAA"}
@@ -24,6 +24,7 @@ var PrivyCore = class {
24
24
  bindings = null;
25
25
  pending = null;
26
26
  session = void 0;
27
+ listeners = /* @__PURE__ */ new Set();
27
28
  constructor(supportedMethods) {
28
29
  this.supportedMethods = supportedMethods;
29
30
  }
@@ -36,6 +37,16 @@ var PrivyCore = class {
36
37
  getSession() {
37
38
  return this.session;
38
39
  }
40
+ subscribe(listener) {
41
+ this.listeners.add(listener);
42
+ if (this.session) listener(this.session);
43
+ return () => {
44
+ this.listeners.delete(listener);
45
+ };
46
+ }
47
+ emit(session) {
48
+ for (const listener of this.listeners) listener(session);
49
+ }
39
50
  syncFromEmbeddedWallet(wallet) {
40
51
  const address = wallet.address;
41
52
  const chainId = parseCaip2ChainId(wallet.chainId);
@@ -46,16 +57,18 @@ var PrivyCore = class {
46
57
  const session = {
47
58
  address,
48
59
  chainId,
49
- signTypedData
60
+ signTypedData,
61
+ canSignSilently: true
50
62
  };
51
63
  this.session = session;
52
64
  if (this.pending) {
53
65
  this.pending.resolve(session);
54
66
  this.pending = null;
55
- }
67
+ } else this.emit(session);
56
68
  }
57
69
  clearSession() {
58
70
  this.session = void 0;
71
+ this.emit(void 0);
59
72
  }
60
73
  handleLoginError(error) {
61
74
  if (!this.pending) return;
@@ -158,6 +171,10 @@ function createPrivyProvider(core, config) {
158
171
  embeddedWallets: {
159
172
  ethereum: { createOnLogin: "users-without-wallets" },
160
173
  showWalletUIs: false
174
+ },
175
+ externalWallets: {
176
+ disableAllExternalWallets: true,
177
+ walletConnect: { enabled: false }
161
178
  }
162
179
  }), [mode]);
163
180
  return /* @__PURE__ */ jsxs(PrivyProvider, {
@@ -182,6 +199,7 @@ function createPrivyAdapter(config) {
182
199
  connect: (method) => core.connect(method),
183
200
  disconnect: () => core.disconnect(),
184
201
  getSession: () => core.getSession(),
202
+ subscribe: (listener) => core.subscribe(listener),
185
203
  supportedMethods
186
204
  };
187
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/privy/adapter.ts","../../../src/wallet/privy/bridge.tsx","../../../src/wallet/privy/provider.tsx","../../../src/wallet/privy/index.ts"],"sourcesContent":["import type {\n ConnectedWallet,\n LoginModalOptions,\n SignTypedDataParams,\n} from \"@privy-io/react-auth\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport {\n DEFAULT_PRIVY_METHODS,\n LoginMethod,\n type WalletSession,\n} from \"../types.js\";\n\ntype Hex = `0x${string}`;\ntype PrivyLoginMethodId = NonNullable<\n LoginModalOptions[\"loginMethods\"]\n>[number];\n\n// Login methods the Privy adapter can drive. Config `methods` is validated\n// against these; the default is [GOOGLE, EMAIL].\nconst PRIVY_METHOD_MAP: Partial<Record<LoginMethod, PrivyLoginMethodId>> = {\n [LoginMethod.WALLET]: \"wallet\",\n [LoginMethod.GOOGLE]: \"google\",\n [LoginMethod.APPLE]: \"apple\",\n [LoginMethod.EMAIL]: \"email\",\n};\n\n// Resolve config `methods` (LoginMethod string values) to the supported set,\n// falling back to the default when none are provided.\nexport function resolvePrivyMethods(methods?: string[]): LoginMethod[] {\n if (!methods || methods.length === 0) return [...DEFAULT_PRIVY_METHODS];\n const resolved: LoginMethod[] = [];\n for (const method of methods) {\n const value = method as LoginMethod;\n if (!(value in PRIVY_METHOD_MAP)) {\n throw new Error(`PrivyAdapter cannot support login method \"${method}\"`);\n }\n resolved.push(value);\n }\n return resolved;\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 logout: () => Promise<void>;\n signTypedData: (\n args: Parameters<SignCredentialTypedData>[0],\n address: Hex,\n ) => Promise<Hex>;\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\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 // 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 const session: WalletSession = { address, chainId, signTypedData };\n this.session = session;\n if (this.pending) {\n this.pending.resolve(session);\n this.pending = null;\n }\n }\n\n clearSession(): void {\n this.session = 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 async connect(method?: LoginMethod): Promise<WalletSession> {\n if (this.session) return this.session;\n if (!this.bindings) {\n throw new Error(\n \"PrivyAdapter not bound. Ensure the adapter Provider wraps the app.\",\n );\n }\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 const privyMethod = PRIVY_METHOD_MAP[chosen];\n if (!privyMethod || !this.supportedMethods.includes(chosen)) {\n throw new Error(`PrivyAdapter does not support login method \"${chosen}\"`);\n }\n\n // Open Privy's modal (social OAuth runs in a popup, keeping this page alive)\n // so the pending promise resolves in-page and Renown sign-in can run.\n const bindings = this.bindings;\n return new Promise<WalletSession>((resolve, reject) => {\n this.pending = { resolve, reject };\n try {\n bindings.openLoginModal({ loginMethods: [privyMethod] });\n } catch (error) {\n this.pending = null;\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n async disconnect(): Promise<void> {\n this.clearSession();\n if (!this.bindings) return;\n await this.bindings.logout();\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 useLogin,\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\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 } = usePrivy();\n const { wallets } = useWallets();\n const { signTypedData } = useSignTypedData();\n const { logout } = useLogout();\n const { login: openLoginModal } = useLogin({\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({ openLoginModal, logout, signTypedData });\n useEffect(() => {\n fnsRef.current = { openLoginModal, logout, signTypedData };\n }, [openLoginModal, logout, signTypedData]);\n\n useEffect(() => {\n return core.bind({\n openLoginModal: (opts) => fnsRef.current.openLoginModal(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 return;\n }\n const embedded = getEmbeddedConnectedWallet(wallets);\n if (embedded) core.syncFromEmbeddedWallet(embedded);\n }, [core, ready, authenticated, wallets]);\n\n return null;\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\";\n\ninterface PrivyProviderConfig {\n appId: string;\n clientId?: 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 } = normalizeWalletTheme(theme);\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 appearance: { theme: mode },\n embeddedWallets: {\n ethereum: { createOnLogin: \"users-without-wallets\" as const },\n showWalletUIs: false,\n },\n }),\n [mode],\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","import type { LoginMethod, WalletAdapter, WalletController } from \"../types.js\";\nimport { PrivyCore, resolvePrivyMethods } from \"./adapter.js\";\nimport { createPrivyProvider } from \"./provider.js\";\n\n// Config slice for the Privy adapter (mirrors connect.renown.adapters.privy).\n// `methods` defaults to [GOOGLE, EMAIL] when omitted.\nexport interface PHRenownPrivyAdapterConfig {\n appId: string;\n clientId?: string;\n methods?: string[];\n}\n\n// Build the Privy WalletAdapter. Provider mounts PrivyProvider + a bridge;\n// useController exposes imperative connect/disconnect over the shared core.\nexport function createPrivyAdapter(\n config: PHRenownPrivyAdapterConfig,\n): WalletAdapter {\n const supportedMethods: LoginMethod[] = resolvePrivyMethods(config.methods);\n const core = new PrivyCore(supportedMethods);\n const Provider = createPrivyProvider(core, {\n appId: config.appId,\n clientId: config.clientId,\n });\n\n function useController(): WalletController {\n return {\n connect: (method) => core.connect(method),\n disconnect: () => core.disconnect(),\n getSession: () => core.getSession(),\n supportedMethods,\n };\n }\n\n return {\n id: \"privy\",\n supportedMethods,\n Provider,\n useController,\n };\n}\n\nexport { PrivyCore, resolvePrivyMethods } from \"./adapter.js\";\nexport type { PrivyBindings } from \"./adapter.js\";\nexport { PrivyAdapterBridge } from \"./bridge.js\";\nexport { createPrivyProvider } from \"./provider.js\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/privy/adapter.ts","../../../src/wallet/privy/bridge.tsx","../../../src/wallet/privy/provider.tsx","../../../src/wallet/privy/index.ts"],"sourcesContent":["import type {\n ConnectedWallet,\n LoginModalOptions,\n SignTypedDataParams,\n} from \"@privy-io/react-auth\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport {\n DEFAULT_PRIVY_METHODS,\n LoginMethod,\n type WalletSession,\n} from \"../types.js\";\n\ntype Hex = `0x${string}`;\ntype PrivyLoginMethodId = NonNullable<\n LoginModalOptions[\"loginMethods\"]\n>[number];\n\n// Login methods the Privy adapter can drive. Config `methods` is validated\n// against these; the default is [GOOGLE, EMAIL].\nconst PRIVY_METHOD_MAP: Partial<Record<LoginMethod, PrivyLoginMethodId>> = {\n [LoginMethod.WALLET]: \"wallet\",\n [LoginMethod.GOOGLE]: \"google\",\n [LoginMethod.APPLE]: \"apple\",\n [LoginMethod.EMAIL]: \"email\",\n};\n\n// Resolve config `methods` (LoginMethod string values) to the supported set,\n// falling back to the default when none are provided.\nexport function resolvePrivyMethods(methods?: string[]): LoginMethod[] {\n if (!methods || methods.length === 0) return [...DEFAULT_PRIVY_METHODS];\n const resolved: LoginMethod[] = [];\n for (const method of methods) {\n const value = method as LoginMethod;\n if (!(value in PRIVY_METHOD_MAP)) {\n throw new Error(`PrivyAdapter cannot support login method \"${method}\"`);\n }\n resolved.push(value);\n }\n return resolved;\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 logout: () => Promise<void>;\n signTypedData: (\n args: Parameters<SignCredentialTypedData>[0],\n address: Hex,\n ) => Promise<Hex>;\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\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 // 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 async connect(method?: LoginMethod): Promise<WalletSession> {\n if (this.session) return this.session;\n if (!this.bindings) {\n throw new Error(\n \"PrivyAdapter not bound. Ensure the adapter Provider wraps the app.\",\n );\n }\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 const privyMethod = PRIVY_METHOD_MAP[chosen];\n if (!privyMethod || !this.supportedMethods.includes(chosen)) {\n throw new Error(`PrivyAdapter does not support login method \"${chosen}\"`);\n }\n\n // Open Privy's modal (social OAuth runs in a popup, keeping this page alive)\n // so the pending promise resolves in-page and Renown sign-in can run.\n const bindings = this.bindings;\n return new Promise<WalletSession>((resolve, reject) => {\n this.pending = { resolve, reject };\n try {\n bindings.openLoginModal({ loginMethods: [privyMethod] });\n } catch (error) {\n this.pending = null;\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n async disconnect(): Promise<void> {\n this.clearSession();\n if (!this.bindings) return;\n await this.bindings.logout();\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 useLogin,\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\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 } = usePrivy();\n const { wallets } = useWallets();\n const { signTypedData } = useSignTypedData();\n const { logout } = useLogout();\n const { login: openLoginModal } = useLogin({\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({ openLoginModal, logout, signTypedData });\n useEffect(() => {\n fnsRef.current = { openLoginModal, logout, signTypedData };\n }, [openLoginModal, logout, signTypedData]);\n\n useEffect(() => {\n return core.bind({\n openLoginModal: (opts) => fnsRef.current.openLoginModal(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 return;\n }\n const embedded = getEmbeddedConnectedWallet(wallets);\n if (embedded) core.syncFromEmbeddedWallet(embedded);\n }, [core, ready, authenticated, wallets]);\n\n return null;\n}\n","import { useMemo, type ComponentType, type ReactNode } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { normalizeWalletTheme, type WalletTheme } from \"../types.js\";\nimport type { PrivyCore } from \"./adapter.js\";\nimport { PrivyAdapterBridge } from \"./bridge.js\";\n\ninterface PrivyProviderConfig {\n appId: string;\n clientId?: 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 } = normalizeWalletTheme(theme);\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<PrivyClientConfig>(\n () => ({\n appearance: { theme: mode },\n embeddedWallets: {\n ethereum: { createOnLogin: \"users-without-wallets\" as const },\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 [mode],\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","import type { LoginMethod, WalletAdapter, WalletController } from \"../types.js\";\nimport { PrivyCore, resolvePrivyMethods } from \"./adapter.js\";\nimport { createPrivyProvider } from \"./provider.js\";\n\n// Config slice for the Privy adapter (mirrors connect.renown.adapters.privy).\n// `methods` defaults to [GOOGLE, EMAIL] when omitted.\nexport interface PHRenownPrivyAdapterConfig {\n appId: string;\n clientId?: string;\n methods?: string[];\n}\n\n// Build the Privy WalletAdapter. Provider mounts PrivyProvider + a bridge;\n// useController exposes imperative connect/disconnect over the shared core.\nexport function createPrivyAdapter(\n config: PHRenownPrivyAdapterConfig,\n): WalletAdapter {\n const supportedMethods: LoginMethod[] = resolvePrivyMethods(config.methods);\n const core = new PrivyCore(supportedMethods);\n const Provider = createPrivyProvider(core, {\n appId: config.appId,\n clientId: config.clientId,\n });\n\n function useController(): WalletController {\n return {\n connect: (method) => core.connect(method),\n disconnect: () => core.disconnect(),\n getSession: () => core.getSession(),\n subscribe: (listener) => core.subscribe(listener),\n supportedMethods,\n };\n }\n\n return {\n id: \"privy\",\n supportedMethods,\n Provider,\n useController,\n };\n}\n\nexport { PrivyCore, resolvePrivyMethods } from \"./adapter.js\";\nexport type { PrivyBindings } from \"./adapter.js\";\nexport { PrivyAdapterBridge } from \"./bridge.js\";\nexport { createPrivyProvider } from \"./provider.js\";\n"],"mappings":";;;;;AAmBA,MAAM,mBAAqE;EACxE,YAAY,SAAS;EACrB,YAAY,SAAS;EACrB,YAAY,QAAQ;EACpB,YAAY,QAAQ;CACtB;AAID,SAAgB,oBAAoB,SAAmC;AACrE,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,CAAC,GAAG,sBAAsB;CACvE,MAAM,WAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,QAAQ;AACd,MAAI,EAAE,SAAS,kBACb,OAAM,IAAI,MAAM,6CAA6C,OAAO,GAAG;AAEzE,WAAS,KAAK,MAAM;;AAEtB,QAAO;;AAqBT,IAAa,YAAb,MAAuB;CACrB;CAEA,WAAyC;CACzC,UAAuC;CACvC,UAA6C,KAAA;CAC7C,4BAAoB,IAAI,KAAmD;CAE3E,YAAY,kBAAiC;AAC3C,OAAK,mBAAmB;;CAG1B,KAAK,UAAqC;AACxC,OAAK,WAAW;AAChB,eAAa;AACX,OAAI,KAAK,aAAa,SAAU,MAAK,WAAW;;;CAIpD,aAAwC;AACtC,SAAO,KAAK;;CAKd,UACE,UACY;AACZ,OAAK,UAAU,IAAI,SAAS;AAC5B,MAAI,KAAK,QAAS,UAAS,KAAK,QAAQ;AACxC,eAAa;AACX,QAAK,UAAU,OAAO,SAAS;;;CAInC,KAAa,SAA0C;AACrD,OAAK,MAAM,YAAY,KAAK,UAAW,UAAS,QAAQ;;CAK1D,uBAAuB,QAA+B;EACpD,MAAM,UAAU,OAAO;EACvB,MAAM,UAAU,kBAAkB,OAAO,QAAQ;EAEjD,MAAM,gBAAyC,OAAO,SAAS;AAC7D,OAAI,CAAC,KAAK,SACR,OAAM,IAAI,MAAM,8CAA8C;AAEhE,UAAO,KAAK,SAAS,cAAc,MAAM,QAAQ;;EAKnD,MAAM,UAAyB;GAC7B;GACA;GACA;GACA,iBAAiB;GAClB;AACD,OAAK,UAAU;AAGf,MAAI,KAAK,SAAS;AAChB,QAAK,QAAQ,QAAQ,QAAQ;AAC7B,QAAK,UAAU;QAEf,MAAK,KAAK,QAAQ;;CAItB,eAAqB;AACnB,OAAK,UAAU,KAAA;AACf,OAAK,KAAK,KAAA,EAAU;;CAKtB,iBAAiB,OAAsB;AACrC,MAAI,CAAC,KAAK,QAAS;EACnB,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AACrE,OAAK,QAAQ,OAAO,IAAI;AACxB,OAAK,UAAU;;CAGjB,MAAM,QAAQ,QAA8C;AAC1D,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,MAAI,CAAC,KAAK,SACR,OAAM,IAAI,MACR,qEACD;EAGH,MAAM,SAAS,UAAU,KAAK,iBAAiB,GAAG,EAAE;AACpD,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,yDAAyD;EAE3E,MAAM,cAAc,iBAAiB;AACrC,MAAI,CAAC,eAAe,CAAC,KAAK,iBAAiB,SAAS,OAAO,CACzD,OAAM,IAAI,MAAM,+CAA+C,OAAO,GAAG;EAK3E,MAAM,WAAW,KAAK;AACtB,SAAO,IAAI,SAAwB,SAAS,WAAW;AACrD,QAAK,UAAU;IAAE;IAAS;IAAQ;AAClC,OAAI;AACF,aAAS,eAAe,EAAE,cAAc,CAAC,YAAY,EAAE,CAAC;YACjD,OAAO;AACd,SAAK,UAAU;AACf,WAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;IAEnE;;CAGJ,MAAM,aAA4B;AAChC,OAAK,cAAc;AACnB,MAAI,CAAC,KAAK,SAAU;AACpB,QAAM,KAAK,SAAS,QAAQ;;;AAIhC,SAAS,kBAAkB,OAAuB;CAChD,MAAM,OAAO,MAAM,MAAM,IAAI,CAAC,GAAG,GAAG;CACpC,MAAM,IAAI,OAAO,KAAK;AACtB,KAAI,CAAC,OAAO,SAAS,EAAE,CACrB,OAAM,IAAI,MACR,sDAAsD,MAAM,GAC7D;AAEH,QAAO;;;;AC3KT,SAAgB,mBAAmB,EAAE,QAAiC;CACpE,MAAM,EAAE,OAAO,kBAAkB,UAAU;CAC3C,MAAM,EAAE,YAAY,YAAY;CAChC,MAAM,EAAE,kBAAkB,kBAAkB;CAC5C,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,EAAE,OAAO,mBAAmB,SAAS,EACzC,UAAU,UAAU,KAAK,iBAAiB,MAAM,EACjD,CAAC;CAIF,MAAM,SAAS,OAAO;EAAE;EAAgB;EAAQ;EAAe,CAAC;AAChE,iBAAgB;AACd,SAAO,UAAU;GAAE;GAAgB;GAAQ;GAAe;IACzD;EAAC;EAAgB;EAAQ;EAAc,CAAC;AAE3C,iBAAgB;AACd,SAAO,KAAK,KAAK;GACf,iBAAiB,SAAS,OAAO,QAAQ,eAAe,KAAK;GAC7D,cAAc,OAAO,QAAQ,QAAQ;GAGrC,eAAe,OAAO,MAAM,YAAY;AAKtC,YAJe,MAAM,OAAO,QAAQ,cAClC,MACA;KAAE;KAAS,WAAW,EAAE,eAAe,OAAO;KAAE,CACjD,EACa;;GAEjB,CAAC;IACD,CAAC,KAAK,CAAC;AAEV,iBAAgB;AACd,MAAI,CAAC,MAAO;AACZ,MAAI,CAAC,eAAe;AAClB,QAAK,cAAc;AACnB;;EAEF,MAAM,WAAW,2BAA2B,QAAQ;AACpD,MAAI,SAAU,MAAK,uBAAuB,SAAS;IAClD;EAAC;EAAM;EAAO;EAAe;EAAQ,CAAC;AAEzC,QAAO;;;;AChDT,SAAgB,oBACd,MACA,QAC6D;AAC7D,QAAO,SAAS,kBAAkB,EAChC,UACA,SAIC;EACD,MAAM,EAAE,SAAS,qBAAqB,MAAM;EAG5C,MAAM,cAAc,eACX;GACL,YAAY,EAAE,OAAO,MAAM;GAC3B,iBAAiB;IACf,UAAU,EAAE,eAAe,yBAAkC;IAC7D,eAAe;IAChB;GAGD,iBAAiB;IACf,2BAA2B;IAC3B,eAAe,EAAE,SAAS,OAAO;IAClC;GACF,GACD,CAAC,KAAK,CACP;AAED,SACE,qBAAC,eAAD;GACE,OAAO,OAAO;GACd,UAAU,OAAO;GACjB,QAAQ;aAHV,CAKE,oBAAC,oBAAD,EAA0B,MAAQ,CAAA,EACjC,SACa;;;;;;ACtCtB,SAAgB,mBACd,QACe;CACf,MAAM,mBAAkC,oBAAoB,OAAO,QAAQ;CAC3E,MAAM,OAAO,IAAI,UAAU,iBAAiB;CAC5C,MAAM,WAAW,oBAAoB,MAAM;EACzC,OAAO,OAAO;EACd,UAAU,OAAO;EAClB,CAAC;CAEF,SAAS,gBAAkC;AACzC,SAAO;GACL,UAAU,WAAW,KAAK,QAAQ,OAAO;GACzC,kBAAkB,KAAK,YAAY;GACnC,kBAAkB,KAAK,YAAY;GACnC,YAAY,aAAa,KAAK,UAAU,SAAS;GACjD;GACD;;AAGH,QAAO;EACL,IAAI;EACJ;EACA;EACA;EACD"}
@@ -1,9 +1,10 @@
1
- import { i as WalletAdapter } from "../../types-B5VOm-9h.js";
1
+ import { i as WalletAdapter } from "../../types-Z6jyeonm.js";
2
2
  //#region src/wallet/rainbow/config.d.ts
3
3
  interface PHRenownRainbowAdapterConfig {
4
- walletConnectProjectId: string;
4
+ walletConnectProjectId?: string;
5
5
  infuraProjectId?: string;
6
6
  appName?: string;
7
+ ssr?: boolean;
7
8
  }
8
9
  //#endregion
9
10
  //#region src/wallet/rainbow/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/rainbow/config.ts","../../../src/wallet/rainbow/index.ts"],"mappings":";;UA+BiB,4BAAA;EACf,sBAAA;EACA,eAAA;EACA,OAAA;AAAA;;;iBCyBc,oBAAA,CACd,MAAA,EAAQ,4BAAA,GACP,aAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/rainbow/config.ts","../../../src/wallet/rainbow/index.ts"],"mappings":";;UAgCiB,4BAAA;EAGf,sBAAA;EACA,eAAA;EACA,OAAA;EAEA,GAAA;AAAA;;;iBCoBc,oBAAA,CACd,MAAA,EAAQ,4BAAA,GACP,aAAA"}
@@ -77,7 +77,7 @@ function walletsWithoutWalletConnect() {
77
77
  })).filter((group) => group.wallets.length > 0);
78
78
  }
79
79
  function buildWagmiConfig(config) {
80
- const { walletConnectProjectId, infuraProjectId, appName = "Renown" } = config;
80
+ const { walletConnectProjectId, infuraProjectId, appName = "Renown", ssr } = config;
81
81
  if (!walletConnectProjectId) console.debug("renown rainbow adapter: walletConnectProjectId is not set — hiding the WalletConnect option; only injected/browser wallets are offered.");
82
82
  const infuraUrl = (subdomain) => infuraProjectId ? `https://${subdomain}.infura.io/v3/${infuraProjectId}` : void 0;
83
83
  return getDefaultConfig$1({
@@ -91,6 +91,7 @@ function buildWagmiConfig(config) {
91
91
  arbitrum,
92
92
  base
93
93
  ],
94
+ ssr,
94
95
  ...walletConnectProjectId ? {} : { wallets: walletsWithoutWalletConnect() },
95
96
  transports: {
96
97
  [mainnet.id]: http(infuraUrl("mainnet")),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useConnectModal","rainbowUseConnectModal","getDefaultConfig","rainbowGetDefaultConfig","getDefaultWallets","rainbowGetDefaultWallets","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/index.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 {\n getDefaultConfig as rainbowGetDefaultConfig,\n getDefaultWallets as rainbowGetDefaultWallets,\n} from \"@rainbow-me/rainbowkit\";\nimport { http, type Config } from \"wagmi\";\nimport {\n arbitrum,\n base,\n mainnet,\n optimism,\n polygon,\n sepolia,\n} from \"wagmi/chains\";\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 = { name?: string };\ntype WalletGroup = { groupName: string; wallets: WalletCreator[] };\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}) => Config;\nconst getDefaultWallets = rainbowGetDefaultWallets as () => {\n wallets: WalletGroup[];\n};\n\n// Config slice this adapter consumes; mirrors WalletRainbowConfig in the core\n// controller so operators pass the same shape from powerhouse.config.json.\nexport interface PHRenownRainbowAdapterConfig {\n walletConnectProjectId: string;\n infuraProjectId?: string;\n appName?: string;\n}\n\n// RainbowKit's default wallet list minus the WalletConnect option, used when no\n// project id is set (WalletConnect can't work without one; injected wallets do).\nfunction walletsWithoutWalletConnect(): WalletGroup[] {\n return getDefaultWallets()\n .wallets.map((group) => ({\n ...group,\n wallets: group.wallets.filter((w) => w.name !== \"walletConnectWallet\"),\n }))\n .filter((group) => group.wallets.length > 0);\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 } = config;\n\n if (!walletConnectProjectId) {\n console.debug(\n \"renown rainbow adapter: walletConnectProjectId is not set — hiding the WalletConnect option; only injected/browser wallets are offered.\",\n );\n }\n\n const infuraUrl = (subdomain: string) =>\n infuraProjectId\n ? `https://${subdomain}.infura.io/v3/${infuraProjectId}`\n : undefined;\n\n return getDefaultConfig({\n appName,\n projectId: walletConnectProjectId || \"MISSING_WALLET_CONNECT_PROJECT_ID\",\n chains: [mainnet, sepolia, polygon, optimism, arbitrum, base],\n // Omit `wallets` to keep RainbowKit's default set when a project id exists;\n // otherwise drop only the WalletConnect option from that default set.\n ...(walletConnectProjectId\n ? {}\n : { wallets: walletsWithoutWalletConnect() }),\n transports: {\n [mainnet.id]: http(infuraUrl(\"mainnet\")),\n [sepolia.id]: http(infuraUrl(\"sepolia\")),\n [polygon.id]: http(infuraUrl(\"polygon-mainnet\")),\n [optimism.id]: http(infuraUrl(\"optimism-mainnet\")),\n [arbitrum.id]: http(infuraUrl(\"arbitrum-mainnet\")),\n [base.id]: http(infuraUrl(\"base-mainnet\")),\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","// 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 WalletAdapter,\n type WalletController,\n type WalletSession,\n} from \"../types.js\";\nimport { createRainbowBridge } from \"./bridge.js\";\nimport {\n buildWagmiConfig,\n type PHRenownRainbowAdapterConfig,\n} from \"./config.js\";\nimport { createRainbowProvider } from \"./provider.js\";\n\nexport type { PHRenownRainbowAdapterConfig } from \"./config.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): WalletAdapter {\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 supportedMethods: [LoginMethod.WALLET],\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 {\n id: \"rainbow\",\n supportedMethods: [LoginMethod.WALLET],\n Provider,\n useController: () => controller,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["useConnectModal","rainbowUseConnectModal","getDefaultConfig","rainbowGetDefaultConfig","getDefaultWallets","rainbowGetDefaultWallets","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/index.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 {\n getDefaultConfig as rainbowGetDefaultConfig,\n getDefaultWallets as rainbowGetDefaultWallets,\n} from \"@rainbow-me/rainbowkit\";\nimport { http, type Config } from \"wagmi\";\nimport {\n arbitrum,\n base,\n mainnet,\n optimism,\n polygon,\n sepolia,\n} from \"wagmi/chains\";\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 = { name?: string };\ntype WalletGroup = { groupName: string; wallets: WalletCreator[] };\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 getDefaultWallets = rainbowGetDefaultWallets as () => {\n wallets: WalletGroup[];\n};\n\n// Config slice this adapter consumes; mirrors WalletRainbowConfig in the core\n// controller so operators pass the same shape from powerhouse.config.json.\nexport interface PHRenownRainbowAdapterConfig {\n // Optional: when unset the WalletConnect option is hidden; injected/browser\n // wallets (MetaMask, etc.) still work. See buildWagmiConfig.\n walletConnectProjectId?: string;\n infuraProjectId?: string;\n appName?: string;\n // See WalletRainbowConfig.ssr: opt-in for server-rendered hosts.\n ssr?: boolean;\n}\n\n// RainbowKit's default wallet list minus the WalletConnect option, used when no\n// project id is set (WalletConnect can't work without one; injected wallets do).\nfunction walletsWithoutWalletConnect(): WalletGroup[] {\n return getDefaultWallets()\n .wallets.map((group) => ({\n ...group,\n wallets: group.wallets.filter((w) => w.name !== \"walletConnectWallet\"),\n }))\n .filter((group) => group.wallets.length > 0);\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 ssr,\n } = config;\n\n if (!walletConnectProjectId) {\n console.debug(\n \"renown rainbow adapter: walletConnectProjectId is not set — hiding the WalletConnect option; only injected/browser wallets are offered.\",\n );\n }\n\n const infuraUrl = (subdomain: string) =>\n infuraProjectId\n ? `https://${subdomain}.infura.io/v3/${infuraProjectId}`\n : undefined;\n\n return getDefaultConfig({\n appName,\n projectId: walletConnectProjectId || \"MISSING_WALLET_CONNECT_PROJECT_ID\",\n chains: [mainnet, sepolia, polygon, optimism, arbitrum, base],\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 when a project id exists;\n // otherwise drop only the WalletConnect option from that default set.\n ...(walletConnectProjectId\n ? {}\n : { wallets: walletsWithoutWalletConnect() }),\n transports: {\n [mainnet.id]: http(infuraUrl(\"mainnet\")),\n [sepolia.id]: http(infuraUrl(\"sepolia\")),\n [polygon.id]: http(infuraUrl(\"polygon-mainnet\")),\n [optimism.id]: http(infuraUrl(\"optimism-mainnet\")),\n [arbitrum.id]: http(infuraUrl(\"arbitrum-mainnet\")),\n [base.id]: http(infuraUrl(\"base-mainnet\")),\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","// 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 WalletAdapter,\n type WalletController,\n type WalletSession,\n} from \"../types.js\";\nimport { createRainbowBridge } from \"./bridge.js\";\nimport {\n buildWagmiConfig,\n type PHRenownRainbowAdapterConfig,\n} from \"./config.js\";\nimport { createRainbowProvider } from \"./provider.js\";\n\nexport type { PHRenownRainbowAdapterConfig } from \"./config.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): WalletAdapter {\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 supportedMethods: [LoginMethod.WALLET],\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 {\n id: \"rainbow\",\n supportedMethods: [LoginMethod.WALLET],\n Provider,\n useController: () => controller,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renown/sdk",
3
- "version": "6.2.2-dev.17",
3
+ "version": "6.2.2-dev.19",
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,
@@ -86,7 +86,7 @@
86
86
  "key-did-resolver": "^4.0.0",
87
87
  "uint8arrays": "^5.1.0",
88
88
  "viem": "~2.50.4",
89
- "@powerhousedao/shared": "6.2.2-dev.17"
89
+ "@powerhousedao/shared": "6.2.2-dev.19"
90
90
  },
91
91
  "peerDependencies": {
92
92
  "@privy-io/react-auth": "^3.25.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-B5VOm-9h.d.ts","names":[],"sources":["../src/wallet/types.ts"],"mappings":";;;;aAGY,WAAA;EACV,MAAA;EACA,MAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,cAKW,qBAAA,EAAuB,WAAA;AAAA,cAIvB,oBAAA,EAAsB,WAAA;AAAA,UAQlB,iBAAA;EACf,WAAA;EACA,qBAAA;AAAA;AAAA,KAIU,WAAA;EAGL,IAAA;AAAA,IAA2B,iBAAA;AAAA,iBAGlB,oBAAA,CAAqB,KAAA,EAAO,WAAA;EAC1C,IAAA;EACA,WAAA;EACA,qBAAA;AAAA;AAAA,UAYe,aAAA;EACf,OAAA;EACA,OAAA;EACA,aAAA,EAAe,uBAAA;AAAA;AAAA,UAIA,gBAAA;EACf,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,aAAA;EACvC,UAAA,IAAc,OAAA;EACd,UAAA,IAAc,aAAA;EACd,gBAAA,EAAkB,WAAA;AAAA;AAAA,UAIH,aAAA;EACf,EAAA;EACA,gBAAA,EAAkB,WAAA;EAGlB,QAAA,EAAU,aAAA;IAAgB,QAAA,EAAU,SAAA;IAAW,KAAA,GAAQ,WAAA;EAAA;EAEvD,aAAA,QAAqB,gBAAA;AAAA;AAAA,KAGX,oBAAA,sBACV,MAAA,EAAQ,MAAA,KACL,aAAA"}