@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.
- package/README.md +103 -1
- package/dist/crypto.d.ts +2 -2
- package/dist/index-25fTa4yI.d.ts +127 -0
- package/dist/index-25fTa4yI.d.ts.map +1 -0
- package/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -7
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +54 -11
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +93 -11
- package/dist/node.js.map +1 -1
- package/dist/renown-builder-BqWoYtBR.js +841 -0
- package/dist/renown-builder-BqWoYtBR.js.map +1 -0
- package/dist/types-B5VOm-9h.d.ts +48 -0
- package/dist/types-B5VOm-9h.d.ts.map +1 -0
- package/dist/types-DG816Qa8.js +27 -0
- package/dist/types-DG816Qa8.js.map +1 -0
- package/dist/{signer-DYKGoYHB.d.ts → types-DsF91dDF.d.ts} +121 -115
- package/dist/types-DsF91dDF.d.ts.map +1 -0
- package/dist/{utils-C9ZgMs_C.d.ts → utils-OOrVXHof.d.ts} +38 -96
- package/dist/utils-OOrVXHof.d.ts.map +1 -0
- package/dist/wallet/index.d.ts +28 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +55 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/mock/index.d.ts +18 -0
- package/dist/wallet/mock/index.d.ts.map +1 -0
- package/dist/wallet/mock/index.js +38 -0
- package/dist/wallet/mock/index.js.map +1 -0
- package/dist/wallet/privy/index.d.ts +56 -0
- package/dist/wallet/privy/index.d.ts.map +1 -0
- package/dist/wallet/privy/index.js +198 -0
- package/dist/wallet/privy/index.js.map +1 -0
- package/dist/wallet/rainbow/index.d.ts +13 -0
- package/dist/wallet/rainbow/index.d.ts.map +1 -0
- package/dist/wallet/rainbow/index.js +217 -0
- package/dist/wallet/rainbow/index.js.map +1 -0
- package/package.json +57 -3
- package/dist/browser-key-storage-DSkDBAhU.d.ts +0 -14
- package/dist/browser-key-storage-DSkDBAhU.d.ts.map +0 -1
- package/dist/renown-builder-Sn_Y2Cb2.js +0 -496
- package/dist/renown-builder-Sn_Y2Cb2.js.map +0 -1
- package/dist/signer-DYKGoYHB.d.ts.map +0 -1
- package/dist/utils-C9ZgMs_C.d.ts.map +0 -1
|
@@ -1,117 +1,57 @@
|
|
|
1
|
-
import {
|
|
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/
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
|
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 {
|
|
214
|
-
//# sourceMappingURL=utils-
|
|
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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"}
|