@liberfi.io/wallet-connector-privy 1.1.70 → 1.1.71
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/dist/index.js +93 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +94 -32
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -6
package/dist/index.js
CHANGED
|
@@ -10,6 +10,41 @@ var solana = require('@privy-io/react-auth/solana');
|
|
|
10
10
|
var kit = require('@solana/kit');
|
|
11
11
|
|
|
12
12
|
// src/PrivyAuthProvider.tsx
|
|
13
|
+
|
|
14
|
+
// src/internal/privy-session-reducer.ts
|
|
15
|
+
var initialPrivySessionState = {
|
|
16
|
+
generation: 0,
|
|
17
|
+
identity: null,
|
|
18
|
+
status: "idle",
|
|
19
|
+
accessToken: null
|
|
20
|
+
};
|
|
21
|
+
function privySessionReducer(state, action) {
|
|
22
|
+
if (action.generation < state.generation) return state;
|
|
23
|
+
switch (action.type) {
|
|
24
|
+
case "begin":
|
|
25
|
+
return {
|
|
26
|
+
generation: action.generation,
|
|
27
|
+
identity: action.identity,
|
|
28
|
+
status: "pending",
|
|
29
|
+
accessToken: null
|
|
30
|
+
};
|
|
31
|
+
case "resolve":
|
|
32
|
+
if (action.generation !== state.generation || state.status !== "pending") {
|
|
33
|
+
return state;
|
|
34
|
+
}
|
|
35
|
+
return { ...state, status: "ready", accessToken: action.accessToken };
|
|
36
|
+
case "fail":
|
|
37
|
+
if (action.generation !== state.generation) return state;
|
|
38
|
+
return { ...state, status: "failed", accessToken: null };
|
|
39
|
+
case "reset":
|
|
40
|
+
return {
|
|
41
|
+
generation: action.generation,
|
|
42
|
+
identity: null,
|
|
43
|
+
status: "idle",
|
|
44
|
+
accessToken: null
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
13
48
|
function PrivyAuthProvider({
|
|
14
49
|
exchangeAccessToken,
|
|
15
50
|
onError,
|
|
@@ -24,31 +59,58 @@ function PrivyAuthProvider({
|
|
|
24
59
|
const { ready, authenticated, getAccessToken } = reactAuth.usePrivy();
|
|
25
60
|
const { user: privyUser, refreshUser } = reactAuth.useUser();
|
|
26
61
|
const { identityToken: privyIdentityToken } = reactAuth.useIdentityToken();
|
|
27
|
-
const [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
onError?.(error, "getAccessToken");
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}, [ready, authenticated, getAccessToken, onError]);
|
|
62
|
+
const [session, dispatch] = react.useReducer(
|
|
63
|
+
privySessionReducer,
|
|
64
|
+
initialPrivySessionState
|
|
65
|
+
);
|
|
66
|
+
const generationRef = react.useRef(0);
|
|
36
67
|
react.useEffect(() => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
onError?.(error, "exchangeAccessToken");
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
setAccessToken(token);
|
|
47
|
-
}).catch((error) => {
|
|
48
|
-
onError?.(error, "exchangeAccessToken");
|
|
49
|
-
});
|
|
68
|
+
const generation = ++generationRef.current;
|
|
69
|
+
const identity = privyUser?.id;
|
|
70
|
+
const identityToken = privyIdentityToken;
|
|
71
|
+
if (!ready || !authenticated || walletStatus !== "connected" || !identity || exchangeAccessToken && !identityToken) {
|
|
72
|
+
dispatch({ type: "reset", generation });
|
|
73
|
+
return;
|
|
50
74
|
}
|
|
51
|
-
|
|
75
|
+
dispatch({ type: "begin", generation, identity });
|
|
76
|
+
let failureSource = "getAccessToken";
|
|
77
|
+
void getAccessToken().then(async (privyToken) => {
|
|
78
|
+
if (!privyToken) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
"PrivyAuthProvider: getAccessToken returned empty token"
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
if (!exchangeAccessToken) return privyToken;
|
|
84
|
+
failureSource = "exchangeAccessToken";
|
|
85
|
+
const exchanged = await exchangeAccessToken(
|
|
86
|
+
privyToken,
|
|
87
|
+
identityToken
|
|
88
|
+
);
|
|
89
|
+
if (!exchanged) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
"PrivyAuthProvider: exchange access token returned empty token"
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
return exchanged;
|
|
95
|
+
}).then((accessToken) => {
|
|
96
|
+
dispatch({ type: "resolve", generation, accessToken });
|
|
97
|
+
}).catch((error) => {
|
|
98
|
+
dispatch({ type: "fail", generation });
|
|
99
|
+
onError?.(error, failureSource);
|
|
100
|
+
});
|
|
101
|
+
return () => {
|
|
102
|
+
if (generationRef.current === generation) generationRef.current += 1;
|
|
103
|
+
};
|
|
104
|
+
}, [
|
|
105
|
+
ready,
|
|
106
|
+
authenticated,
|
|
107
|
+
walletStatus,
|
|
108
|
+
privyUser?.id,
|
|
109
|
+
privyIdentityToken,
|
|
110
|
+
exchangeAccessToken,
|
|
111
|
+
getAccessToken,
|
|
112
|
+
onError
|
|
113
|
+
]);
|
|
52
114
|
const status = react.useMemo(() => {
|
|
53
115
|
switch (walletStatus) {
|
|
54
116
|
case "detecting":
|
|
@@ -56,23 +118,23 @@ function PrivyAuthProvider({
|
|
|
56
118
|
case "connecting":
|
|
57
119
|
return "authenticating";
|
|
58
120
|
case "connected":
|
|
59
|
-
return "authenticated";
|
|
121
|
+
return session.status === "ready" && privyUser ? "authenticated" : "authenticating";
|
|
60
122
|
case "disconnecting":
|
|
61
123
|
return "deauthenticating";
|
|
62
124
|
case "disconnected":
|
|
63
125
|
return "unauthenticated";
|
|
64
126
|
}
|
|
65
|
-
}, [walletStatus]);
|
|
127
|
+
}, [walletStatus, session.status, privyUser]);
|
|
66
128
|
const user = react.useMemo(() => {
|
|
67
|
-
if (!privyUser)
|
|
68
|
-
|
|
69
|
-
|
|
129
|
+
if (!privyUser || session.status !== "ready" || !session.accessToken) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
70
132
|
return {
|
|
71
133
|
id: privyUser.id,
|
|
72
|
-
accessToken:
|
|
134
|
+
accessToken: session.accessToken,
|
|
73
135
|
wallets
|
|
74
136
|
};
|
|
75
|
-
}, [privyUser,
|
|
137
|
+
}, [privyUser, session.status, session.accessToken, wallets]);
|
|
76
138
|
const refreshAccessToken = react.useCallback(async () => {
|
|
77
139
|
await refreshUser();
|
|
78
140
|
}, [refreshUser]);
|
|
@@ -379,7 +441,7 @@ function WalletConnectorAdapter({
|
|
|
379
441
|
setIsSigningOut(true);
|
|
380
442
|
logoutRequestedRef.current = true;
|
|
381
443
|
try {
|
|
382
|
-
logout();
|
|
444
|
+
void logout();
|
|
383
445
|
} catch (error) {
|
|
384
446
|
onError?.(error, "signOut");
|
|
385
447
|
logoutRequestedRef.current = false;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["useWalletConnector","usePrivy","useUser","useIdentityToken","useState","useEffect","useMemo","useCallback","jsx","AuthProvider","ChainNamespace","ethers","Chain","getBase58Decoder","useWallets","useSolanaWallets","useSignMessage","useSignTransaction","useSendTransaction","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useRef","useLogin","WalletConnectorProvider","PrivyProvider","toSolanaWalletConnectors"],"mappings":"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","file":"index.js","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useLogin,\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Use Privy's `useLogin` (instead of `usePrivy().login`) so we can observe the\n // login flow's completion AND failure. The failure path is critical: when the\n // user dismisses/cancels the Privy modal, Privy resolves the flow with an\n // error (`exited_auth_flow`) and `authenticated` never flips to true. Without\n // clearing `isSigningIn` here, the status would stay stuck on\n // `connecting` -> `authenticating` forever.\n const { login } = useLogin({\n onComplete: () => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n },\n onError: (error) => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n // User-initiated cancellation is not a real failure — don't surface it.\n if (String(error) === \"exited_auth_flow\") return;\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n },\n });\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/privy-session-reducer.ts","../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["useWalletConnector","usePrivy","useUser","useIdentityToken","useReducer","useRef","useEffect","useMemo","useCallback","jsx","AuthProvider","ChainNamespace","ethers","Chain","getBase58Decoder","useWallets","useSolanaWallets","useSignMessage","useSignTransaction","useSendTransaction","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useState","useLogin","WalletConnectorProvider","PrivyProvider","toSolanaWalletConnectors"],"mappings":"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","file":"index.js","sourcesContent":["export interface PrivySessionState {\n generation: number;\n identity: string | null;\n status: \"idle\" | \"pending\" | \"ready\" | \"failed\";\n accessToken: string | null;\n}\n\nexport type PrivySessionAction =\n | { type: \"begin\"; generation: number; identity: string }\n | { type: \"resolve\"; generation: number; accessToken: string }\n | { type: \"fail\"; generation: number }\n | { type: \"reset\"; generation: number };\n\nexport const initialPrivySessionState: PrivySessionState = {\n generation: 0,\n identity: null,\n status: \"idle\",\n accessToken: null,\n};\n\n/** Reduce token lifecycle events while rejecting stale asynchronous results. */\nexport function privySessionReducer(\n state: PrivySessionState,\n action: PrivySessionAction,\n): PrivySessionState {\n if (action.generation < state.generation) return state;\n\n switch (action.type) {\n case \"begin\":\n return {\n generation: action.generation,\n identity: action.identity,\n status: \"pending\",\n accessToken: null,\n };\n case \"resolve\":\n if (\n action.generation !== state.generation ||\n state.status !== \"pending\"\n ) {\n return state;\n }\n return { ...state, status: \"ready\", accessToken: action.accessToken };\n case \"fail\":\n if (action.generation !== state.generation) return state;\n return { ...state, status: \"failed\", accessToken: null };\n case \"reset\":\n return {\n generation: action.generation,\n identity: null,\n status: \"idle\",\n accessToken: null,\n };\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\nimport {\n initialPrivySessionState,\n privySessionReducer,\n} from \"./internal/privy-session-reducer\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n const [session, dispatch] = useReducer(\n privySessionReducer,\n initialPrivySessionState,\n );\n const generationRef = useRef(0);\n\n // Resolve one token generation for the current identity. Every dependency\n // transition invalidates older async completions before starting new work.\n useEffect(() => {\n const generation = ++generationRef.current;\n const identity = privyUser?.id;\n const identityToken = privyIdentityToken;\n if (\n !ready ||\n !authenticated ||\n walletStatus !== \"connected\" ||\n !identity ||\n (exchangeAccessToken && !identityToken)\n ) {\n dispatch({ type: \"reset\", generation });\n return;\n }\n\n dispatch({ type: \"begin\", generation, identity });\n let failureSource: PrivyAuthProviderErrorSource = \"getAccessToken\";\n void getAccessToken()\n .then(async (privyToken) => {\n if (!privyToken) {\n throw new Error(\n \"PrivyAuthProvider: getAccessToken returned empty token\",\n );\n }\n if (!exchangeAccessToken) return privyToken;\n failureSource = \"exchangeAccessToken\";\n const exchanged = await exchangeAccessToken(\n privyToken,\n identityToken as string,\n );\n if (!exchanged) {\n throw new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n }\n return exchanged;\n })\n .then((accessToken) => {\n dispatch({ type: \"resolve\", generation, accessToken });\n })\n .catch((error) => {\n dispatch({ type: \"fail\", generation });\n if (failureSource === \"getAccessToken\") {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n } else {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n }\n onError?.(error, failureSource);\n });\n\n return () => {\n if (generationRef.current === generation) generationRef.current += 1;\n };\n }, [\n ready,\n authenticated,\n walletStatus,\n privyUser?.id,\n privyIdentityToken,\n exchangeAccessToken,\n getAccessToken,\n onError,\n ]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return session.status === \"ready\" && privyUser\n ? \"authenticated\"\n : \"authenticating\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus, session.status, privyUser]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser || session.status !== \"ready\" || !session.accessToken) {\n return null;\n }\n\n return {\n id: privyUser.id,\n accessToken: session.accessToken,\n wallets,\n };\n }, [privyUser, session.status, session.accessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useLogin,\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Use Privy's `useLogin` (instead of `usePrivy().login`) so we can observe the\n // login flow's completion AND failure. The failure path is critical: when the\n // user dismisses/cancels the Privy modal, Privy resolves the flow with an\n // error (`exited_auth_flow`) and `authenticated` never flips to true. Without\n // clearing `isSigningIn` here, the status would stay stuck on\n // `connecting` -> `authenticating` forever.\n const { login } = useLogin({\n onComplete: () => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n },\n onError: (error) => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n // User-initiated cancellation is not a real failure — don't surface it.\n if (String(error) === \"exited_auth_flow\") return;\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n },\n });\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n void logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useReducer, useRef, useEffect, useMemo, useCallback, useState } from 'react';
|
|
2
2
|
import { usePrivy, useUser, useIdentityToken, PrivyProvider, useWallets, useSignMessage, useSignTransaction, useSendTransaction, useLogin } from '@privy-io/react-auth';
|
|
3
3
|
import { useWalletConnector, AuthProvider, WalletConnectorProvider } from '@liberfi.io/wallet-connector';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -8,6 +8,41 @@ import { toSolanaWalletConnectors, useWallets as useWallets$1, useSignMessage as
|
|
|
8
8
|
import { getBase58Decoder } from '@solana/kit';
|
|
9
9
|
|
|
10
10
|
// src/PrivyAuthProvider.tsx
|
|
11
|
+
|
|
12
|
+
// src/internal/privy-session-reducer.ts
|
|
13
|
+
var initialPrivySessionState = {
|
|
14
|
+
generation: 0,
|
|
15
|
+
identity: null,
|
|
16
|
+
status: "idle",
|
|
17
|
+
accessToken: null
|
|
18
|
+
};
|
|
19
|
+
function privySessionReducer(state, action) {
|
|
20
|
+
if (action.generation < state.generation) return state;
|
|
21
|
+
switch (action.type) {
|
|
22
|
+
case "begin":
|
|
23
|
+
return {
|
|
24
|
+
generation: action.generation,
|
|
25
|
+
identity: action.identity,
|
|
26
|
+
status: "pending",
|
|
27
|
+
accessToken: null
|
|
28
|
+
};
|
|
29
|
+
case "resolve":
|
|
30
|
+
if (action.generation !== state.generation || state.status !== "pending") {
|
|
31
|
+
return state;
|
|
32
|
+
}
|
|
33
|
+
return { ...state, status: "ready", accessToken: action.accessToken };
|
|
34
|
+
case "fail":
|
|
35
|
+
if (action.generation !== state.generation) return state;
|
|
36
|
+
return { ...state, status: "failed", accessToken: null };
|
|
37
|
+
case "reset":
|
|
38
|
+
return {
|
|
39
|
+
generation: action.generation,
|
|
40
|
+
identity: null,
|
|
41
|
+
status: "idle",
|
|
42
|
+
accessToken: null
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
11
46
|
function PrivyAuthProvider({
|
|
12
47
|
exchangeAccessToken,
|
|
13
48
|
onError,
|
|
@@ -22,31 +57,58 @@ function PrivyAuthProvider({
|
|
|
22
57
|
const { ready, authenticated, getAccessToken } = usePrivy();
|
|
23
58
|
const { user: privyUser, refreshUser } = useUser();
|
|
24
59
|
const { identityToken: privyIdentityToken } = useIdentityToken();
|
|
25
|
-
const [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
onError?.(error, "getAccessToken");
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}, [ready, authenticated, getAccessToken, onError]);
|
|
60
|
+
const [session, dispatch] = useReducer(
|
|
61
|
+
privySessionReducer,
|
|
62
|
+
initialPrivySessionState
|
|
63
|
+
);
|
|
64
|
+
const generationRef = useRef(0);
|
|
34
65
|
useEffect(() => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
onError?.(error, "exchangeAccessToken");
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
setAccessToken(token);
|
|
45
|
-
}).catch((error) => {
|
|
46
|
-
onError?.(error, "exchangeAccessToken");
|
|
47
|
-
});
|
|
66
|
+
const generation = ++generationRef.current;
|
|
67
|
+
const identity = privyUser?.id;
|
|
68
|
+
const identityToken = privyIdentityToken;
|
|
69
|
+
if (!ready || !authenticated || walletStatus !== "connected" || !identity || exchangeAccessToken && !identityToken) {
|
|
70
|
+
dispatch({ type: "reset", generation });
|
|
71
|
+
return;
|
|
48
72
|
}
|
|
49
|
-
|
|
73
|
+
dispatch({ type: "begin", generation, identity });
|
|
74
|
+
let failureSource = "getAccessToken";
|
|
75
|
+
void getAccessToken().then(async (privyToken) => {
|
|
76
|
+
if (!privyToken) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
"PrivyAuthProvider: getAccessToken returned empty token"
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
if (!exchangeAccessToken) return privyToken;
|
|
82
|
+
failureSource = "exchangeAccessToken";
|
|
83
|
+
const exchanged = await exchangeAccessToken(
|
|
84
|
+
privyToken,
|
|
85
|
+
identityToken
|
|
86
|
+
);
|
|
87
|
+
if (!exchanged) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
"PrivyAuthProvider: exchange access token returned empty token"
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
return exchanged;
|
|
93
|
+
}).then((accessToken) => {
|
|
94
|
+
dispatch({ type: "resolve", generation, accessToken });
|
|
95
|
+
}).catch((error) => {
|
|
96
|
+
dispatch({ type: "fail", generation });
|
|
97
|
+
onError?.(error, failureSource);
|
|
98
|
+
});
|
|
99
|
+
return () => {
|
|
100
|
+
if (generationRef.current === generation) generationRef.current += 1;
|
|
101
|
+
};
|
|
102
|
+
}, [
|
|
103
|
+
ready,
|
|
104
|
+
authenticated,
|
|
105
|
+
walletStatus,
|
|
106
|
+
privyUser?.id,
|
|
107
|
+
privyIdentityToken,
|
|
108
|
+
exchangeAccessToken,
|
|
109
|
+
getAccessToken,
|
|
110
|
+
onError
|
|
111
|
+
]);
|
|
50
112
|
const status = useMemo(() => {
|
|
51
113
|
switch (walletStatus) {
|
|
52
114
|
case "detecting":
|
|
@@ -54,23 +116,23 @@ function PrivyAuthProvider({
|
|
|
54
116
|
case "connecting":
|
|
55
117
|
return "authenticating";
|
|
56
118
|
case "connected":
|
|
57
|
-
return "authenticated";
|
|
119
|
+
return session.status === "ready" && privyUser ? "authenticated" : "authenticating";
|
|
58
120
|
case "disconnecting":
|
|
59
121
|
return "deauthenticating";
|
|
60
122
|
case "disconnected":
|
|
61
123
|
return "unauthenticated";
|
|
62
124
|
}
|
|
63
|
-
}, [walletStatus]);
|
|
125
|
+
}, [walletStatus, session.status, privyUser]);
|
|
64
126
|
const user = useMemo(() => {
|
|
65
|
-
if (!privyUser)
|
|
66
|
-
|
|
67
|
-
|
|
127
|
+
if (!privyUser || session.status !== "ready" || !session.accessToken) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
68
130
|
return {
|
|
69
131
|
id: privyUser.id,
|
|
70
|
-
accessToken:
|
|
132
|
+
accessToken: session.accessToken,
|
|
71
133
|
wallets
|
|
72
134
|
};
|
|
73
|
-
}, [privyUser,
|
|
135
|
+
}, [privyUser, session.status, session.accessToken, wallets]);
|
|
74
136
|
const refreshAccessToken = useCallback(async () => {
|
|
75
137
|
await refreshUser();
|
|
76
138
|
}, [refreshUser]);
|
|
@@ -377,7 +439,7 @@ function WalletConnectorAdapter({
|
|
|
377
439
|
setIsSigningOut(true);
|
|
378
440
|
logoutRequestedRef.current = true;
|
|
379
441
|
try {
|
|
380
|
-
logout();
|
|
442
|
+
void logout();
|
|
381
443
|
} catch (error) {
|
|
382
444
|
onError?.(error, "signOut");
|
|
383
445
|
logoutRequestedRef.current = false;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["ChainNamespace","Chain","usePrivy","useSolanaWallets","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useState","useEffect","useMemo","useCallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useLogin,\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Use Privy's `useLogin` (instead of `usePrivy().login`) so we can observe the\n // login flow's completion AND failure. The failure path is critical: when the\n // user dismisses/cancels the Privy modal, Privy resolves the flow with an\n // error (`exited_auth_flow`) and `authenticated` never flips to true. Without\n // clearing `isSigningIn` here, the status would stay stuck on\n // `connecting` -> `authenticating` forever.\n const { login } = useLogin({\n onComplete: () => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n },\n onError: (error) => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n // User-initiated cancellation is not a real failure — don't surface it.\n if (String(error) === \"exited_auth_flow\") return;\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n },\n });\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/privy-session-reducer.ts","../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["ChainNamespace","Chain","usePrivy","useSolanaWallets","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useRef","useEffect","useMemo","useCallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["export interface PrivySessionState {\n generation: number;\n identity: string | null;\n status: \"idle\" | \"pending\" | \"ready\" | \"failed\";\n accessToken: string | null;\n}\n\nexport type PrivySessionAction =\n | { type: \"begin\"; generation: number; identity: string }\n | { type: \"resolve\"; generation: number; accessToken: string }\n | { type: \"fail\"; generation: number }\n | { type: \"reset\"; generation: number };\n\nexport const initialPrivySessionState: PrivySessionState = {\n generation: 0,\n identity: null,\n status: \"idle\",\n accessToken: null,\n};\n\n/** Reduce token lifecycle events while rejecting stale asynchronous results. */\nexport function privySessionReducer(\n state: PrivySessionState,\n action: PrivySessionAction,\n): PrivySessionState {\n if (action.generation < state.generation) return state;\n\n switch (action.type) {\n case \"begin\":\n return {\n generation: action.generation,\n identity: action.identity,\n status: \"pending\",\n accessToken: null,\n };\n case \"resolve\":\n if (\n action.generation !== state.generation ||\n state.status !== \"pending\"\n ) {\n return state;\n }\n return { ...state, status: \"ready\", accessToken: action.accessToken };\n case \"fail\":\n if (action.generation !== state.generation) return state;\n return { ...state, status: \"failed\", accessToken: null };\n case \"reset\":\n return {\n generation: action.generation,\n identity: null,\n status: \"idle\",\n accessToken: null,\n };\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\nimport {\n initialPrivySessionState,\n privySessionReducer,\n} from \"./internal/privy-session-reducer\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n const [session, dispatch] = useReducer(\n privySessionReducer,\n initialPrivySessionState,\n );\n const generationRef = useRef(0);\n\n // Resolve one token generation for the current identity. Every dependency\n // transition invalidates older async completions before starting new work.\n useEffect(() => {\n const generation = ++generationRef.current;\n const identity = privyUser?.id;\n const identityToken = privyIdentityToken;\n if (\n !ready ||\n !authenticated ||\n walletStatus !== \"connected\" ||\n !identity ||\n (exchangeAccessToken && !identityToken)\n ) {\n dispatch({ type: \"reset\", generation });\n return;\n }\n\n dispatch({ type: \"begin\", generation, identity });\n let failureSource: PrivyAuthProviderErrorSource = \"getAccessToken\";\n void getAccessToken()\n .then(async (privyToken) => {\n if (!privyToken) {\n throw new Error(\n \"PrivyAuthProvider: getAccessToken returned empty token\",\n );\n }\n if (!exchangeAccessToken) return privyToken;\n failureSource = \"exchangeAccessToken\";\n const exchanged = await exchangeAccessToken(\n privyToken,\n identityToken as string,\n );\n if (!exchanged) {\n throw new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n }\n return exchanged;\n })\n .then((accessToken) => {\n dispatch({ type: \"resolve\", generation, accessToken });\n })\n .catch((error) => {\n dispatch({ type: \"fail\", generation });\n if (failureSource === \"getAccessToken\") {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n } else {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n }\n onError?.(error, failureSource);\n });\n\n return () => {\n if (generationRef.current === generation) generationRef.current += 1;\n };\n }, [\n ready,\n authenticated,\n walletStatus,\n privyUser?.id,\n privyIdentityToken,\n exchangeAccessToken,\n getAccessToken,\n onError,\n ]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return session.status === \"ready\" && privyUser\n ? \"authenticated\"\n : \"authenticating\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus, session.status, privyUser]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser || session.status !== \"ready\" || !session.accessToken) {\n return null;\n }\n\n return {\n id: privyUser.id,\n accessToken: session.accessToken,\n wallets,\n };\n }, [privyUser, session.status, session.accessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useLogin,\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Use Privy's `useLogin` (instead of `usePrivy().login`) so we can observe the\n // login flow's completion AND failure. The failure path is critical: when the\n // user dismisses/cancels the Privy modal, Privy resolves the flow with an\n // error (`exited_auth_flow`) and `authenticated` never flips to true. Without\n // clearing `isSigningIn` here, the status would stay stuck on\n // `connecting` -> `authenticating` forever.\n const { login } = useLogin({\n onComplete: () => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n },\n onError: (error) => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n // User-initiated cancellation is not a real failure — don't surface it.\n if (String(error) === \"exited_auth_flow\") return;\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n },\n });\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n void logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liberfi.io/wallet-connector-privy",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.71",
|
|
4
4
|
"description": "Privy wallet connector for Liberfi React SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"ethers": "^6.15.0",
|
|
16
16
|
"react": ">=18",
|
|
17
17
|
"react-dom": ">=18",
|
|
18
|
-
"@liberfi.io/wallet-connector": "0.2.
|
|
18
|
+
"@liberfi.io/wallet-connector": "0.2.73"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@liberfi.io/types": "0.4.
|
|
21
|
+
"@liberfi.io/types": "0.4.74"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@privy-io/react-auth": "^3.16.0",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"@testing-library/dom": "^10.4.1",
|
|
27
27
|
"@testing-library/react": "^16.3.0",
|
|
28
28
|
"@types/jest": "^29.5.3",
|
|
29
|
+
"@types/node": "^24.5.0",
|
|
29
30
|
"@types/react": "^19.1.13",
|
|
30
31
|
"@types/react-dom": "^19.1.9",
|
|
31
32
|
"ethers": "^6.15.0",
|
|
@@ -37,8 +38,8 @@
|
|
|
37
38
|
"ts-jest": "^29.4.6",
|
|
38
39
|
"tsup": "^8.5.0",
|
|
39
40
|
"typescript": "^5.9.2",
|
|
40
|
-
"@liberfi.io/wallet-connector": "0.2.
|
|
41
|
-
"tsconfig": "0.1.
|
|
41
|
+
"@liberfi.io/wallet-connector": "0.2.73",
|
|
42
|
+
"tsconfig": "0.1.257"
|
|
42
43
|
},
|
|
43
44
|
"publishConfig": {
|
|
44
45
|
"access": "public"
|
|
@@ -46,6 +47,8 @@
|
|
|
46
47
|
"scripts": {
|
|
47
48
|
"dev": "tsup --watch",
|
|
48
49
|
"build": "rimraf -rf dist && tsup",
|
|
49
|
-
"
|
|
50
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
51
|
+
"lint": "eslint src",
|
|
52
|
+
"test": "jest --detectOpenHandles"
|
|
50
53
|
}
|
|
51
54
|
}
|