@renown/sdk 6.2.2-dev.12 → 6.2.2-dev.14

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 (45) hide show
  1. package/README.md +103 -1
  2. package/dist/crypto.d.ts +2 -2
  3. package/dist/index-25fTa4yI.d.ts +127 -0
  4. package/dist/index-25fTa4yI.d.ts.map +1 -0
  5. package/dist/index.d.ts +9 -8
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +16 -7
  8. package/dist/index.js.map +1 -1
  9. package/dist/node.d.ts +54 -11
  10. package/dist/node.d.ts.map +1 -1
  11. package/dist/node.js +93 -11
  12. package/dist/node.js.map +1 -1
  13. package/dist/renown-builder-BqWoYtBR.js +841 -0
  14. package/dist/renown-builder-BqWoYtBR.js.map +1 -0
  15. package/dist/types-B5VOm-9h.d.ts +48 -0
  16. package/dist/types-B5VOm-9h.d.ts.map +1 -0
  17. package/dist/types-DG816Qa8.js +27 -0
  18. package/dist/types-DG816Qa8.js.map +1 -0
  19. package/dist/{signer-DYKGoYHB.d.ts → types-DsF91dDF.d.ts} +121 -115
  20. package/dist/types-DsF91dDF.d.ts.map +1 -0
  21. package/dist/{utils-C9ZgMs_C.d.ts → utils-OOrVXHof.d.ts} +38 -96
  22. package/dist/utils-OOrVXHof.d.ts.map +1 -0
  23. package/dist/wallet/index.d.ts +28 -0
  24. package/dist/wallet/index.d.ts.map +1 -0
  25. package/dist/wallet/index.js +55 -0
  26. package/dist/wallet/index.js.map +1 -0
  27. package/dist/wallet/mock/index.d.ts +18 -0
  28. package/dist/wallet/mock/index.d.ts.map +1 -0
  29. package/dist/wallet/mock/index.js +38 -0
  30. package/dist/wallet/mock/index.js.map +1 -0
  31. package/dist/wallet/privy/index.d.ts +56 -0
  32. package/dist/wallet/privy/index.d.ts.map +1 -0
  33. package/dist/wallet/privy/index.js +198 -0
  34. package/dist/wallet/privy/index.js.map +1 -0
  35. package/dist/wallet/rainbow/index.d.ts +13 -0
  36. package/dist/wallet/rainbow/index.d.ts.map +1 -0
  37. package/dist/wallet/rainbow/index.js +217 -0
  38. package/dist/wallet/rainbow/index.js.map +1 -0
  39. package/package.json +57 -3
  40. package/dist/browser-key-storage-DSkDBAhU.d.ts +0 -14
  41. package/dist/browser-key-storage-DSkDBAhU.d.ts.map +0 -1
  42. package/dist/renown-builder-Sn_Y2Cb2.js +0 -496
  43. package/dist/renown-builder-Sn_Y2Cb2.js.map +0 -1
  44. package/dist/signer-DYKGoYHB.d.ts.map +0 -1
  45. package/dist/utils-C9ZgMs_C.d.ts.map +0 -1
@@ -1,117 +1,57 @@
1
- import { $ as User, A as ISigner, B as PKHDid, G as RenownEvents, H as ProfileFetcher, J as RenownStorageMap, M as InternalUser, N as Issuer, V as PowerhouseVerifiableCredential, W as RenownEventEmitter, f as IRenownCrypto, g as AuthVerifiedCredential, k as IRenown, nt as VerifiedCredential, ot as MemoryStorage, p as JsonWebKeyPairStorage, q as RenownStorage, v as CreateBearerTokenOptions, z as LoginStatus } from "./signer-DYKGoYHB.js";
1
+ import { A as LoginStatus, C as InternalUser, F as RenownEventEmitter, G as User$1, H as SignInParams, I as RenownEvents, J as VerifiedCredential, L as RenownProfile, M as PowerhouseVerifiableCredential, N as ProfileFetcher, Q as MemoryStorage, R as RenownStorage, b as IRenown, i as JsonWebKeyPairStorage, j as PKHDid, l as CreateBearerTokenOptions, r as IRenownCrypto, s as AuthVerifiedCredential, w as Issuer, x as ISigner$1, z as RenownStorageMap } from "./types-DsF91dDF.js";
2
+ import { Action } from "@powerhousedao/shared/document-model";
2
3
  import { Resolver } from "did-resolver";
3
4
 
5
+ //#region src/switchboard.d.ts
6
+ declare class SwitchboardClient {
7
+ #private;
8
+ constructor(endpoint: string);
9
+ get endpoint(): string;
10
+ getCredential(params: {
11
+ address: string;
12
+ chainId: number;
13
+ appDid: string;
14
+ }): Promise<PowerhouseVerifiableCredential | undefined>;
15
+ getProfileByAddress(address: string): Promise<RenownProfile | undefined>;
16
+ createEmptyDocument(documentType: string, parentIdentifier?: string): Promise<string>;
17
+ mutateDocument(documentIdentifier: string, actions: Action[]): Promise<string>;
18
+ issueCredential(credential: PowerhouseVerifiableCredential): Promise<string>;
19
+ findOrCreateUser(address: string, profile?: {
20
+ username?: string;
21
+ userImage?: string;
22
+ }): Promise<string>;
23
+ revokeCredential(documentId: string, reason?: string): Promise<void>;
24
+ profileFetcher: ProfileFetcher;
25
+ }
26
+ //#endregion
4
27
  //#region src/common.d.ts
5
28
  declare class RenownMemoryStorage extends MemoryStorage<RenownStorageMap> {}
6
29
  declare class Renown implements IRenown {
7
30
  #private;
8
- constructor(store: RenownStorage, eventEmitter: RenownEventEmitter, crypto: IRenownCrypto, appName: string, baseUrl?: string, profileFetcher?: ProfileFetcher);
31
+ constructor(store: RenownStorage, eventEmitter: RenownEventEmitter, crypto: IRenownCrypto, appName: string, baseUrl?: string, profileFetcher?: ProfileFetcher, switchboard?: SwitchboardClient);
9
32
  get baseUrl(): string;
10
33
  get user(): InternalUser | undefined;
11
34
  get status(): LoginStatus;
12
- get signer(): ISigner;
35
+ get signer(): ISigner$1;
13
36
  get crypto(): IRenownCrypto;
14
37
  get did(): `did:${string}`;
15
38
  get profileFetcher(): ProfileFetcher | undefined;
16
- login(userDid: string): Promise<User>;
39
+ login(userDid: string): Promise<User$1>;
40
+ signIn(params: SignInParams): Promise<User$1>;
17
41
  logout(): Promise<void>;
42
+ revalidate(): Promise<boolean>;
18
43
  on<K extends keyof RenownEvents>(event: K, listener: (data: RenownEvents[K]) => void): () => void;
19
44
  verifyBearerToken(token: string): Promise<false | AuthVerifiedCredential>;
20
45
  getBearerToken(options: CreateBearerTokenOptions): Promise<string>;
21
46
  }
22
47
  //#endregion
23
- //#region src/credential.d.ts
24
- type Hex = `0x${string}`;
25
- type TypedDataDomain = {
26
- name?: string;
27
- version?: string;
28
- chainId?: number;
29
- verifyingContract?: Hex;
30
- salt?: Hex;
31
- };
32
- type TypedDataParameter = {
33
- name: string;
34
- type: string;
35
- };
36
- /** EIP-712 domain as signed by the credential issuer. */
37
- type CredentialDomain = {
38
- version: string;
39
- chainId: number;
40
- };
41
- /** The credential body that is EIP-712 signed (everything except `proof`). */
42
- type CredentialMessage = {
43
- "@context": string[];
44
- type: string[];
45
- id: string;
46
- issuer: {
47
- id: string;
48
- ethereumAddress: Hex;
49
- };
50
- credentialSubject: {
51
- id: string;
52
- app: string;
53
- };
54
- credentialSchema: {
55
- id: string;
56
- type: string;
57
- };
58
- issuanceDate: string;
59
- expirationDate: string;
60
- };
61
- /** Typed-data signer; matches the loose shape used by wallet adapters. */
62
- type SignCredentialTypedData = (args: {
63
- domain: TypedDataDomain;
64
- types: Record<string, readonly TypedDataParameter[]>;
65
- primaryType: string;
66
- message: Record<string, unknown>;
67
- }) => Promise<Hex>;
68
- interface BuildCredentialParams {
69
- signTypedData: SignCredentialTypedData;
70
- address: Hex;
71
- chainId: number;
72
- app: string;
73
- /** Credential subject id: the app/client DID the credential delegates to. */
74
- appId: string;
75
- expiresInDays?: number;
76
- }
77
- /** Assemble a Renown delegation VC and sign it with the provided signer. */
78
- declare function buildAndSignCredential(params: BuildCredentialParams): Promise<PowerhouseVerifiableCredential>;
79
- /** Recover the address that signed a credential's EIP-712 proof. */
80
- declare function recoverCredentialSigner(credential: PowerhouseVerifiableCredential): Promise<Hex>;
81
- /** True when the proof was signed by the credential's declared issuer address. */
82
- declare function verifyCredentialSignature(credential: PowerhouseVerifiableCredential): Promise<boolean>;
83
- interface FetchDelegationCredentialOptions {
84
- /** Ethereum address that must have issued the credential. */
85
- address: string;
86
- /** Chain id the credential must be scoped to. */
87
- chainId: number;
88
- /** App/client DID the credential must delegate to (credentialSubject.id). */
89
- appDid: string;
90
- /** Renown service base URL. Defaults to DEFAULT_RENOWN_URL. */
48
+ //#region src/discovery.d.ts
49
+ interface ResolveSwitchboardEndpointOptions {
50
+ switchboardUrl?: string;
91
51
  baseUrl?: string;
92
- /** Re-verify the EIP-712 proof signature (default true). */
93
- verifySignature?: boolean;
94
- }
95
- declare function fetchDelegationCredential(options: FetchDelegationCredentialOptions): Promise<PowerhouseVerifiableCredential | undefined>;
96
- interface VerifiedAuthCredential {
97
- address: string;
98
- chainId: number;
99
- networkId: string;
100
- /** Owner identity: the pkh DID (did:pkh:<net>:<chainId>:<address>). */
101
- did: string;
102
- /** App/client DID the bearer token was issued by. */
103
- appDid: string;
104
- credential: PowerhouseVerifiableCredential;
105
- }
106
- interface VerifyAuthCredentialOptions {
107
- /** Expected `aud` claim on the bearer token. */
108
- audience?: string;
109
- /** Renown service base URL. */
110
- renownUrl?: string;
111
- /** Re-verify the credential's EIP-712 proof (default true). */
112
- verifySignature?: boolean;
52
+ timeoutMs?: number;
113
53
  }
114
- declare function verifyAuthCredential(jwt: string, options?: VerifyAuthCredentialOptions): Promise<VerifiedAuthCredential | undefined>;
54
+ declare function resolveSwitchboardEndpoint(options: ResolveSwitchboardEndpointOptions): Promise<string | undefined>;
115
55
  //#endregion
116
56
  //#region src/renown-builder.d.ts
117
57
  interface RenownBuilderOptions {
@@ -121,6 +61,7 @@ interface RenownBuilderOptions {
121
61
  crypto?: IRenownCrypto;
122
62
  keyPairStorage?: JsonWebKeyPairStorage;
123
63
  baseUrl?: string;
64
+ switchboardUrl?: string;
124
65
  profileFetcher?: ProfileFetcher;
125
66
  }
126
67
  /**
@@ -160,6 +101,7 @@ declare class BaseRenownBuilder {
160
101
  * Defaults to https://www.renown.id
161
102
  */
162
103
  withBaseUrl(baseUrl: string): this;
104
+ withSwitchboardUrl(switchboardUrl: string): this;
163
105
  /**
164
106
  * Set a profile fetcher strategy for enriching user data after login.
165
107
  * The fetcher receives the authenticated user and the base URL,
@@ -210,5 +152,5 @@ declare function assertIsAuthCredential(credential: VerifiedCredential): asserts
210
152
  declare function createAuthBearerToken(chainId: number, networkId: string, address: string, issuer: Issuer, options?: CreateBearerTokenOptions): Promise<string>;
211
153
  declare const getResolver: () => Resolver;
212
154
  //#endregion
213
- export { Renown as C, verifyCredentialSignature as S, VerifyAuthCredentialOptions as _, getResolver as a, recoverCredentialSigner as b, fetchRenownProfile as c, BuildCredentialParams as d, CredentialDomain as f, VerifiedAuthCredential as g, SignCredentialTypedData as h, createAuthBearerToken as i, BaseRenownBuilder as l, FetchDelegationCredentialOptions as m, VerifyAuthBearerTokenOptions as n, parsePkhDid as o, CredentialMessage as p, assertIsAuthCredential as r, verifyAuthBearerToken as s, ILogger as t, RenownBuilderOptions as u, buildAndSignCredential as v, RenownMemoryStorage as w, verifyAuthCredential as x, fetchDelegationCredential as y };
214
- //# sourceMappingURL=utils-C9ZgMs_C.d.ts.map
155
+ export { getResolver as a, fetchRenownProfile as c, ResolveSwitchboardEndpointOptions as d, resolveSwitchboardEndpoint as f, SwitchboardClient as h, createAuthBearerToken as i, BaseRenownBuilder as l, RenownMemoryStorage as m, VerifyAuthBearerTokenOptions as n, parsePkhDid as o, Renown as p, assertIsAuthCredential as r, verifyAuthBearerToken as s, ILogger as t, RenownBuilderOptions as u };
156
+ //# sourceMappingURL=utils-OOrVXHof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-OOrVXHof.d.ts","names":[],"sources":["../src/switchboard.ts","../src/common.ts","../src/discovery.ts","../src/renown-builder.ts","../src/profile.ts","../src/utils.ts"],"mappings":"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"}
@@ -0,0 +1,28 @@
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";
2
+
3
+ //#region src/wallet/controller.d.ts
4
+ interface WalletRainbowConfig {
5
+ walletConnectProjectId: string;
6
+ infuraProjectId?: string;
7
+ }
8
+ interface WalletPrivyConfig {
9
+ appId: string;
10
+ clientId?: string;
11
+ methods?: string[];
12
+ }
13
+ interface WalletMockConfig {
14
+ privateKey?: `0x${string}`;
15
+ chainId?: number;
16
+ methods?: string[];
17
+ }
18
+ interface WalletAdaptersConfig {
19
+ rainbow?: WalletRainbowConfig;
20
+ privy?: WalletPrivyConfig;
21
+ mock?: WalletMockConfig;
22
+ }
23
+ declare function resolveAdapters(config: WalletAdaptersConfig | undefined): Promise<WalletAdapter[]>;
24
+ declare function supportedMethods(adapters: WalletAdapter[]): LoginMethod[];
25
+ declare function resolveForMethod(adapters: WalletAdapter[], method: LoginMethod): WalletAdapter;
26
+ //#endregion
27
+ export { DEFAULT_MOCK_METHODS, DEFAULT_PRIVY_METHODS, LoginMethod, WalletAdapter, WalletAdapterFactory, WalletAdaptersConfig, WalletController, WalletMockConfig, WalletPrivyConfig, WalletRainbowConfig, WalletSession, WalletTheme, WalletThemeColors, normalizeWalletTheme, resolveAdapters, resolveForMethod, supportedMethods };
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,55 @@
1
+ import { i as normalizeWalletTheme, n as DEFAULT_PRIVY_METHODS, r as LoginMethod, t as DEFAULT_MOCK_METHODS } from "../types-DG816Qa8.js";
2
+ //#region src/wallet/controller.ts
3
+ const ADAPTER_PEER_DEPS = {
4
+ rainbow: [
5
+ "wagmi",
6
+ "@rainbow-me/rainbowkit",
7
+ "@tanstack/react-query",
8
+ "viem"
9
+ ],
10
+ privy: ["@privy-io/react-auth", "viem"],
11
+ mock: ["viem"]
12
+ };
13
+ function logAdapterLoadError(id, error) {
14
+ const deps = ADAPTER_PEER_DEPS[id].join(", ");
15
+ console.error(`[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.`, error);
16
+ }
17
+ async function resolveAdapters(config) {
18
+ const adapters = [];
19
+ if (!config) return adapters;
20
+ if (config.rainbow) try {
21
+ const mod = await import("@renown/sdk/wallet/rainbow");
22
+ adapters.push(mod.createRainbowAdapter(config.rainbow));
23
+ } catch (error) {
24
+ logAdapterLoadError("rainbow", error);
25
+ }
26
+ if (config.privy) try {
27
+ const mod = await import("@renown/sdk/wallet/privy");
28
+ adapters.push(mod.createPrivyAdapter(config.privy));
29
+ } catch (error) {
30
+ logAdapterLoadError("privy", error);
31
+ }
32
+ if (config.mock) try {
33
+ const mod = await import("@renown/sdk/wallet/mock");
34
+ adapters.push(mod.createMockAdapter(config.mock));
35
+ } catch (error) {
36
+ logAdapterLoadError("mock", error);
37
+ }
38
+ return adapters;
39
+ }
40
+ function supportedMethods(adapters) {
41
+ const methods = /* @__PURE__ */ new Set();
42
+ for (const adapter of adapters) for (const method of adapter.supportedMethods) methods.add(method);
43
+ return Array.from(methods);
44
+ }
45
+ function resolveForMethod(adapters, method) {
46
+ const matches = adapters.filter((a) => a.supportedMethods.includes(method));
47
+ if (matches.length > 1) throw new Error(`Multiple adapters support login method "${method}": ${matches.map((a) => a.id).join(", ")}. Resolve the adapter explicitly.`);
48
+ const adapter = matches.at(0);
49
+ if (!adapter) throw new Error(`No adapter registered for login method "${method}"`);
50
+ return adapter;
51
+ }
52
+ //#endregion
53
+ export { DEFAULT_MOCK_METHODS, DEFAULT_PRIVY_METHODS, LoginMethod, normalizeWalletTheme, resolveAdapters, resolveForMethod, supportedMethods };
54
+
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,18 @@
1
+ import { i as WalletAdapter } from "../../types-B5VOm-9h.js";
2
+
3
+ //#region src/wallet/mock/index.d.ts
4
+ type Hex = `0x${string}`;
5
+ /** Config for the mock wallet adapter. TEST/DEV ONLY — signs with a local key; never enable in production. */
6
+ interface PHRenownMockAdapterConfig {
7
+ /** Signing key; defaults to the well-known Anvil test account #0. */
8
+ privateKey?: Hex;
9
+ /** Chain id reported in the session (default 1). */
10
+ chainId?: number;
11
+ /** Methods this adapter answers for; defaults to wallet + google + email. */
12
+ methods?: string[];
13
+ }
14
+ /** Headless test/dev wallet adapter: `connect()` resolves immediately with a session backed by a viem local account (real EIP-712 signatures, no wallet UI or OAuth). Enable via `adapters.mock` to e2e-test sign-in deterministically. See the reactor-browser README "Testing" and the Academy Renown auth guide. */
15
+ declare function createMockAdapter(config: PHRenownMockAdapterConfig): WalletAdapter;
16
+ //#endregion
17
+ export { PHRenownMockAdapterConfig, createMockAdapter };
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/wallet/mock/index.ts"],"mappings":";;;KAWK,GAAA;;UAQY,yBAAA;EARZ;EAUH,UAAA,GAAa,GAAA;;EAEb,OAAA;EAZM;EAcN,OAAA;AAAA;;iBAOc,iBAAA,CACd,MAAA,EAAQ,yBAAA,GACP,aAAA"}
@@ -0,0 +1,38 @@
1
+ import { t as DEFAULT_MOCK_METHODS } from "../../types-DG816Qa8.js";
2
+ import { privateKeyToAccount } from "viem/accounts";
3
+ //#region src/wallet/mock/index.ts
4
+ const DEFAULT_TEST_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
5
+ const MockProvider = (props) => props.children;
6
+ /** Headless test/dev wallet adapter: `connect()` resolves immediately with a session backed by a viem local account (real EIP-712 signatures, no wallet UI or OAuth). Enable via `adapters.mock` to e2e-test sign-in deterministically. See the reactor-browser README "Testing" and the Academy Renown auth guide. */
7
+ function createMockAdapter(config) {
8
+ const account = privateKeyToAccount(config.privateKey ?? DEFAULT_TEST_KEY);
9
+ const chainId = config.chainId ?? 1;
10
+ const supportedMethods = config.methods?.length ? config.methods : DEFAULT_MOCK_METHODS;
11
+ const signTypedData = (args) => account.signTypedData({
12
+ domain: args.domain,
13
+ types: args.types,
14
+ primaryType: args.primaryType,
15
+ message: args.message
16
+ });
17
+ const session = {
18
+ address: account.address,
19
+ chainId,
20
+ signTypedData
21
+ };
22
+ const controller = {
23
+ supportedMethods,
24
+ connect: () => Promise.resolve(session),
25
+ disconnect: () => Promise.resolve(),
26
+ getSession: () => session
27
+ };
28
+ return {
29
+ id: "mock",
30
+ supportedMethods,
31
+ Provider: MockProvider,
32
+ useController: () => controller
33
+ };
34
+ }
35
+ //#endregion
36
+ export { createMockAdapter };
37
+
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/wallet/mock/index.ts"],"sourcesContent":["import { privateKeyToAccount } from \"viem/accounts\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport type { SignCredentialTypedData } from \"../../credential.js\";\nimport type { LoginMethod } from \"../types.js\";\nimport {\n DEFAULT_MOCK_METHODS,\n type WalletAdapter,\n type WalletController,\n type WalletSession,\n} from \"../types.js\";\n\ntype Hex = `0x${string}`;\n\n// Well-known Anvil/Hardhat test account #0 private key. Default so tests need no\n// key; every connect resolves to its deterministic address.\nconst DEFAULT_TEST_KEY: Hex =\n \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\";\n\n/** Config for the mock wallet adapter. TEST/DEV ONLY — signs with a local key; never enable in production. */\nexport interface PHRenownMockAdapterConfig {\n /** Signing key; defaults to the well-known Anvil test account #0. */\n privateKey?: Hex;\n /** Chain id reported in the session (default 1). */\n chainId?: number;\n /** Methods this adapter answers for; defaults to wallet + google + email. */\n methods?: string[];\n}\n\nconst MockProvider: ComponentType<{ children: ReactNode }> = (props) =>\n props.children;\n\n/** Headless test/dev wallet adapter: `connect()` resolves immediately with a session backed by a viem local account (real EIP-712 signatures, no wallet UI or OAuth). Enable via `adapters.mock` to e2e-test sign-in deterministically. See the reactor-browser README \"Testing\" and the Academy Renown auth guide. */\nexport function createMockAdapter(\n config: PHRenownMockAdapterConfig,\n): WalletAdapter {\n const account = privateKeyToAccount(config.privateKey ?? DEFAULT_TEST_KEY);\n const chainId = config.chainId ?? 1;\n const supportedMethods = config.methods?.length\n ? (config.methods as LoginMethod[])\n : DEFAULT_MOCK_METHODS;\n\n const signTypedData: SignCredentialTypedData = (args) =>\n account.signTypedData({\n domain: args.domain,\n types: args.types,\n primaryType: args.primaryType,\n message: args.message,\n } as unknown as Parameters<typeof account.signTypedData>[0]);\n\n const session: WalletSession = {\n address: account.address,\n chainId,\n signTypedData,\n };\n\n const controller: WalletController = {\n supportedMethods,\n connect: () => Promise.resolve(session),\n disconnect: () => Promise.resolve(),\n getSession: () => session,\n };\n\n return {\n id: \"mock\",\n supportedMethods,\n Provider: MockProvider,\n useController: () => controller,\n };\n}\n"],"mappings":";;;AAeA,MAAM,mBACJ;AAYF,MAAM,gBAAwD,UAC5D,MAAM;;AAGR,SAAgB,kBACd,QACe;CACf,MAAM,UAAU,oBAAoB,OAAO,cAAc,iBAAiB;CAC1E,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,mBAAmB,OAAO,SAAS,SACpC,OAAO,UACR;CAEJ,MAAM,iBAA0C,SAC9C,QAAQ,cAAc;EACpB,QAAQ,KAAK;EACb,OAAO,KAAK;EACZ,aAAa,KAAK;EAClB,SAAS,KAAK;EACf,CAA2D;CAE9D,MAAM,UAAyB;EAC7B,SAAS,QAAQ;EACjB;EACA;EACD;CAED,MAAM,aAA+B;EACnC;EACA,eAAe,QAAQ,QAAQ,QAAQ;EACvC,kBAAkB,QAAQ,SAAS;EACnC,kBAAkB;EACnB;AAED,QAAO;EACL,IAAI;EACJ;EACA,UAAU;EACV,qBAAqB;EACtB"}
@@ -0,0 +1,56 @@
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";
3
+ import { ComponentType, ReactNode } from "react";
4
+ import { ConnectedWallet, LoginModalOptions } from "@privy-io/react-auth";
5
+
6
+ //#region src/wallet/privy/adapter.d.ts
7
+ type Hex = `0x${string}`;
8
+ declare function resolvePrivyMethods(methods?: string[]): LoginMethod[];
9
+ interface PrivyBindings {
10
+ openLoginModal: (options?: LoginModalOptions) => void;
11
+ logout: () => Promise<void>;
12
+ signTypedData: (args: Parameters<SignCredentialTypedData>[0], address: Hex) => Promise<Hex>;
13
+ }
14
+ declare class PrivyCore {
15
+ readonly supportedMethods: LoginMethod[];
16
+ private bindings;
17
+ private pending;
18
+ private session;
19
+ constructor(supportedMethods: LoginMethod[]);
20
+ bind(bindings: PrivyBindings): () => void;
21
+ getSession(): WalletSession | undefined;
22
+ syncFromEmbeddedWallet(wallet: ConnectedWallet): void;
23
+ clearSession(): void;
24
+ handleLoginError(error: unknown): void;
25
+ connect(method?: LoginMethod): Promise<WalletSession>;
26
+ disconnect(): Promise<void>;
27
+ }
28
+ //#endregion
29
+ //#region src/wallet/privy/bridge.d.ts
30
+ interface PrivyAdapterBridgeProps {
31
+ core: PrivyCore;
32
+ }
33
+ declare function PrivyAdapterBridge({
34
+ core
35
+ }: PrivyAdapterBridgeProps): null;
36
+ //#endregion
37
+ //#region src/wallet/privy/provider.d.ts
38
+ interface PrivyProviderConfig {
39
+ appId: string;
40
+ clientId?: string;
41
+ }
42
+ declare function createPrivyProvider(core: PrivyCore, config: PrivyProviderConfig): ComponentType<{
43
+ children: ReactNode;
44
+ theme?: WalletTheme;
45
+ }>;
46
+ //#endregion
47
+ //#region src/wallet/privy/index.d.ts
48
+ interface PHRenownPrivyAdapterConfig {
49
+ appId: string;
50
+ clientId?: string;
51
+ methods?: string[];
52
+ }
53
+ declare function createPrivyAdapter(config: PHRenownPrivyAdapterConfig): WalletAdapter;
54
+ //#endregion
55
+ export { PHRenownPrivyAdapterConfig, PrivyAdapterBridge, type PrivyBindings, PrivyCore, createPrivyAdapter, createPrivyProvider, resolvePrivyMethods };
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,198 @@
1
+ import { i as normalizeWalletTheme, n as DEFAULT_PRIVY_METHODS, r as LoginMethod } from "../../types-DG816Qa8.js";
2
+ import { useEffect, useMemo, useRef } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { PrivyProvider, getEmbeddedConnectedWallet, useLogin, useLogout, usePrivy, useSignTypedData, useWallets } from "@privy-io/react-auth";
5
+ //#region src/wallet/privy/adapter.ts
6
+ const PRIVY_METHOD_MAP = {
7
+ [LoginMethod.WALLET]: "wallet",
8
+ [LoginMethod.GOOGLE]: "google",
9
+ [LoginMethod.APPLE]: "apple",
10
+ [LoginMethod.EMAIL]: "email"
11
+ };
12
+ function resolvePrivyMethods(methods) {
13
+ if (!methods || methods.length === 0) return [...DEFAULT_PRIVY_METHODS];
14
+ const resolved = [];
15
+ for (const method of methods) {
16
+ const value = method;
17
+ if (!(value in PRIVY_METHOD_MAP)) throw new Error(`PrivyAdapter cannot support login method "${method}"`);
18
+ resolved.push(value);
19
+ }
20
+ return resolved;
21
+ }
22
+ var PrivyCore = class {
23
+ supportedMethods;
24
+ bindings = null;
25
+ pending = null;
26
+ session = void 0;
27
+ constructor(supportedMethods) {
28
+ this.supportedMethods = supportedMethods;
29
+ }
30
+ bind(bindings) {
31
+ this.bindings = bindings;
32
+ return () => {
33
+ if (this.bindings === bindings) this.bindings = null;
34
+ };
35
+ }
36
+ getSession() {
37
+ return this.session;
38
+ }
39
+ syncFromEmbeddedWallet(wallet) {
40
+ const address = wallet.address;
41
+ const chainId = parseCaip2ChainId(wallet.chainId);
42
+ const signTypedData = async (args) => {
43
+ if (!this.bindings) throw new Error("PrivyAdapter not bound (bridge not mounted)");
44
+ return this.bindings.signTypedData(args, address);
45
+ };
46
+ const session = {
47
+ address,
48
+ chainId,
49
+ signTypedData
50
+ };
51
+ this.session = session;
52
+ if (this.pending) {
53
+ this.pending.resolve(session);
54
+ this.pending = null;
55
+ }
56
+ }
57
+ clearSession() {
58
+ this.session = void 0;
59
+ }
60
+ handleLoginError(error) {
61
+ if (!this.pending) return;
62
+ const err = error instanceof Error ? error : new Error(String(error));
63
+ this.pending.reject(err);
64
+ this.pending = null;
65
+ }
66
+ async connect(method) {
67
+ if (this.session) return this.session;
68
+ if (!this.bindings) throw new Error("PrivyAdapter not bound. Ensure the adapter Provider wraps the app.");
69
+ const chosen = method ?? this.supportedMethods.at(0);
70
+ if (!chosen) throw new Error("PrivyAdapter has no supported login methods configured");
71
+ const privyMethod = PRIVY_METHOD_MAP[chosen];
72
+ if (!privyMethod || !this.supportedMethods.includes(chosen)) throw new Error(`PrivyAdapter does not support login method "${chosen}"`);
73
+ const bindings = this.bindings;
74
+ return new Promise((resolve, reject) => {
75
+ this.pending = {
76
+ resolve,
77
+ reject
78
+ };
79
+ try {
80
+ bindings.openLoginModal({ loginMethods: [privyMethod] });
81
+ } catch (error) {
82
+ this.pending = null;
83
+ reject(error instanceof Error ? error : new Error(String(error)));
84
+ }
85
+ });
86
+ }
87
+ async disconnect() {
88
+ this.clearSession();
89
+ if (!this.bindings) return;
90
+ await this.bindings.logout();
91
+ }
92
+ };
93
+ function parseCaip2ChainId(caip2) {
94
+ const last = caip2.split(":").at(-1);
95
+ const n = Number(last);
96
+ if (!Number.isFinite(n)) throw new Error(`PrivyAdapter: could not parse chainId from CAIP-2 "${caip2}"`);
97
+ return n;
98
+ }
99
+ //#endregion
100
+ //#region src/wallet/privy/bridge.tsx
101
+ function PrivyAdapterBridge({ core }) {
102
+ const { ready, authenticated } = usePrivy();
103
+ const { wallets } = useWallets();
104
+ const { signTypedData } = useSignTypedData();
105
+ const { logout } = useLogout();
106
+ const { login: openLoginModal } = useLogin({ onError: (error) => core.handleLoginError(error) });
107
+ const fnsRef = useRef({
108
+ openLoginModal,
109
+ logout,
110
+ signTypedData
111
+ });
112
+ useEffect(() => {
113
+ fnsRef.current = {
114
+ openLoginModal,
115
+ logout,
116
+ signTypedData
117
+ };
118
+ }, [
119
+ openLoginModal,
120
+ logout,
121
+ signTypedData
122
+ ]);
123
+ useEffect(() => {
124
+ return core.bind({
125
+ openLoginModal: (opts) => fnsRef.current.openLoginModal(opts),
126
+ logout: () => fnsRef.current.logout(),
127
+ signTypedData: async (args, address) => {
128
+ return (await fnsRef.current.signTypedData(args, {
129
+ address,
130
+ uiOptions: { showWalletUIs: false }
131
+ })).signature;
132
+ }
133
+ });
134
+ }, [core]);
135
+ useEffect(() => {
136
+ if (!ready) return;
137
+ if (!authenticated) {
138
+ core.clearSession();
139
+ return;
140
+ }
141
+ const embedded = getEmbeddedConnectedWallet(wallets);
142
+ if (embedded) core.syncFromEmbeddedWallet(embedded);
143
+ }, [
144
+ core,
145
+ ready,
146
+ authenticated,
147
+ wallets
148
+ ]);
149
+ return null;
150
+ }
151
+ //#endregion
152
+ //#region src/wallet/privy/provider.tsx
153
+ function createPrivyProvider(core, config) {
154
+ return function PrivyAuthProvider({ children, theme }) {
155
+ const { mode } = normalizeWalletTheme(theme);
156
+ const privyConfig = useMemo(() => ({
157
+ appearance: { theme: mode },
158
+ embeddedWallets: {
159
+ ethereum: { createOnLogin: "users-without-wallets" },
160
+ showWalletUIs: false
161
+ }
162
+ }), [mode]);
163
+ return /* @__PURE__ */ jsxs(PrivyProvider, {
164
+ appId: config.appId,
165
+ clientId: config.clientId,
166
+ config: privyConfig,
167
+ children: [/* @__PURE__ */ jsx(PrivyAdapterBridge, { core }), children]
168
+ });
169
+ };
170
+ }
171
+ //#endregion
172
+ //#region src/wallet/privy/index.ts
173
+ function createPrivyAdapter(config) {
174
+ const supportedMethods = resolvePrivyMethods(config.methods);
175
+ const core = new PrivyCore(supportedMethods);
176
+ const Provider = createPrivyProvider(core, {
177
+ appId: config.appId,
178
+ clientId: config.clientId
179
+ });
180
+ function useController() {
181
+ return {
182
+ connect: (method) => core.connect(method),
183
+ disconnect: () => core.disconnect(),
184
+ getSession: () => core.getSession(),
185
+ supportedMethods
186
+ };
187
+ }
188
+ return {
189
+ id: "privy",
190
+ supportedMethods,
191
+ Provider,
192
+ useController
193
+ };
194
+ }
195
+ //#endregion
196
+ export { PrivyAdapterBridge, PrivyCore, createPrivyAdapter, createPrivyProvider, resolvePrivyMethods };
197
+
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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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"}