@liberfi.io/wallet-connector-privy 0.1.191 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,12 +22,17 @@ The consumer must provide:
22
22
  | Package | Version |
23
23
  | ------------------------------ | ------------- |
24
24
  | `@liberfi.io/wallet-connector` | `workspace:*` |
25
- | `@privy-io/react-auth` | `^3.0.1` |
26
- | `@solana/web3.js` | `^1.98.4` |
25
+ | `@privy-io/react-auth` | `^3.16.0` |
26
+ | `@solana/kit` | `^3.0.3` |
27
27
  | `ethers` | `^6.15.0` |
28
28
  | `react` | `>=18` |
29
29
  | `react-dom` | `>=18` |
30
30
 
31
+ > If you use Privy's Solana features, you may also need to install Privy's
32
+ > own optional Solana peers (`@solana-program/memo`, `@solana-program/system`,
33
+ > `@solana-program/token`). They are NOT redeclared here — install the
34
+ > versions specified in the `@privy-io/react-auth` documentation directly.
35
+
31
36
  ## API Reference
32
37
 
33
38
  ### Components
@@ -36,12 +41,13 @@ The consumer must provide:
36
41
 
37
42
  Top-level provider that wraps Privy's `PrivyProvider` and an internal `WalletConnectorAdapter`. Must be an ancestor of any component that uses `useWalletConnector` or `PrivyAuthProvider`.
38
43
 
39
- | Prop | Type | Required | Description |
40
- | ------------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
41
- | `privyAppId` | `string` | Yes | Your Privy application ID from the [Privy Dashboard](https://dashboard.privy.io/) (App Settings > Basics). |
42
- | `privyClientId` | `string` | No | Your app client ID from the [Privy Dashboard](https://dashboard.privy.io/) (App Settings > Clients). |
43
- | `privyClientConfig` | `PrivyClientConfig` | No | Configuration for the Privy SDK ([docs](https://docs.privy.io/basics/react/setup)). Merged with internal defaults (e.g. Solana wallet connectors with auto-connect). |
44
- | `children` | `ReactNode` | | Child components. |
44
+ | Prop | Type | Required | Description |
45
+ | ------------------- | --------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
46
+ | `privyAppId` | `string` | Yes | Your Privy application ID from the [Privy Dashboard](https://dashboard.privy.io/) (App Settings > Basics). |
47
+ | `privyClientId` | `string` | No | Your app client ID from the [Privy Dashboard](https://dashboard.privy.io/) (App Settings > Clients). |
48
+ | `privyClientConfig` | `PrivyClientConfig` | No | Configuration for the Privy SDK ([docs](https://docs.privy.io/basics/react/setup)). Merged with internal defaults (e.g. Solana wallet connectors with auto-connect). |
49
+ | `onError` | `(error: unknown, source: "signIn" \| "signOut") => void` | No | Optional error callback for sign-in / sign-out failures. Defaults to `console.error` only. |
50
+ | `children` | `ReactNode` | — | Child components. |
45
51
 
46
52
  #### `PrivyAuthProvider`
47
53
 
@@ -50,6 +56,7 @@ Authentication provider that maps Privy auth state into `AuthProvider` from `@li
50
56
  | Prop | Type | Required | Description |
51
57
  | --------------------- | -------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
52
58
  | `exchangeAccessToken` | `(accessToken: string, identityToken: string) => Promise<string \| undefined \| null>` | No | Callback to exchange Privy's access token and identity token for a custom access token. If not provided, Privy's own access token is used directly. |
59
+ | `onError` | `(error: unknown, source: "getAccessToken" \| "exchangeAccessToken") => void` | No | Optional error callback for token retrieval / exchange failures. Defaults to `console.error` only. |
53
60
  | `children` | `ReactNode` | — | Child components. |
54
61
 
55
62
  ### Internal Architecture (not exported)
@@ -161,14 +168,8 @@ function ConnectButton() {
161
168
 
162
169
  ## Future Improvements
163
170
 
164
- - **Remove unused dependencies** — `package.json` lists five unused `dependencies` (`@ethereumjs/tx`, `@solana-program/memo`, `@solana-program/system`, `@solana-program/token`, `@solana/kit`) and `tsup.config.ts` has an unused `jotai` external. Remove them to reduce install size.
165
- - **Error surfacing** — Add optional `onError` callbacks to both providers so callers can react to connection, auth, and token-exchange failures instead of relying on `console.error`. Also add a `.catch()` to the `getAccessToken()` call in `PrivyAuthProvider` to avoid unhandled Promise rejections.
166
- - **Observable signIn/signOut status** — `login()` and `logout()` from Privy are synchronous modal openers, so the current `isSigningIn`/`isSigningOut` state flips back immediately and the `connecting`/`disconnecting` status is never observable. Use Privy's `onSuccess`/`onError` callbacks or derive status from `ready`/`authenticated` transitions instead.
167
171
  - **Logout async behavior** — `logout()` is currently fire-and-forget due to a Privy SDK issue (`await logout` hangs). Revisit when Privy fixes the upstream behavior.
168
- - **Status `useMemo` dependencies** — The `status` memo in `WalletConnectorAdapter` includes `user?.linkedAccounts` in deps but doesn't read it; align deps with actual usage.
169
- - **Deduplicate EVM tx parsing** — `PrivyEvmWalletAdapter.signTransaction` and `sendTransaction` share near-identical deserialization logic; extract a private helper method.
170
- - **Tests** — Add unit tests for `PrivyEvmWalletAdapter` and `PrivySolanaWalletAdapter` with mocked Privy functions; consider integration tests for the adapter component.
171
- - **JSDoc** — Add JSDoc to `PrivyWalletConnectorProvider` and `PrivyWalletConnectorProviderProps` for IDE hover documentation.
172
+ - **Component smoke tests** — A render-time test for `PrivyWalletConnectorProvider` and `PrivyAuthProvider` would catch import-side regressions, but requires mocking the full Privy hook surface; deferred until the value justifies the maintenance.
172
173
 
173
174
  ## Related Packages
174
175
 
package/dist/index.d.mts CHANGED
@@ -2,30 +2,97 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { PrivyClientConfig } from '@privy-io/react-auth';
4
4
 
5
+ /**
6
+ * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.
7
+ * - `getAccessToken`: failed to obtain Privy's raw access token.
8
+ * - `exchangeAccessToken`: the consumer-supplied exchange function rejected
9
+ * or returned a falsy token.
10
+ */
11
+ type PrivyAuthProviderErrorSource = "getAccessToken" | "exchangeAccessToken";
5
12
  type PrivyAuthProviderProps = PropsWithChildren<{
6
- /** exchange privy's access token for a custom access token, if not provided, the privy's access token will be used as is */
7
- exchangeAccessToken?: (
8
- /** privy's access token */
9
- accessToken: string,
10
- /** privy's identity token */
11
- identityToken: string) => Promise<string | undefined | null>;
13
+ /**
14
+ * Exchange Privy's access token for a custom backend access token. If not
15
+ * provided, the Privy access token will be used as-is.
16
+ *
17
+ * @param accessToken - Privy's access token.
18
+ * @param identityToken - Privy's identity token.
19
+ * @returns A custom access token (string) or `null`/`undefined` to mark
20
+ * the exchange as failed.
21
+ */
22
+ exchangeAccessToken?: (accessToken: string, identityToken: string) => Promise<string | undefined | null>;
23
+ /**
24
+ * Optional error callback. Invoked when token retrieval or exchange fails.
25
+ * Defaults to `console.error` only — provide this to integrate with your
26
+ * app's notification or telemetry pipeline.
27
+ */
28
+ onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;
12
29
  }>;
13
30
  /**
14
- * PrivyAuthProvider must be a child of PrivyWalletConnectorProvider
31
+ * Bridges Privy's user/token hooks into an {@link AuthProvider}.
32
+ *
33
+ * Responsibilities:
34
+ * - Resolves Privy's access token (and optionally exchanges it for a backend
35
+ * token via `exchangeAccessToken`) into the `accessToken` field of the
36
+ * {@link AuthenticatedUser}.
37
+ * - Maps the wallet-connector status into the auth status machine
38
+ * (`authenticating | authenticated | deauthenticating | unauthenticated`).
39
+ * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as
40
+ * `signIn` / `signOut`.
41
+ *
42
+ * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.
15
43
  */
16
- declare function PrivyAuthProvider({ exchangeAccessToken, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
44
+ declare function PrivyAuthProvider({ exchangeAccessToken, onError, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
17
45
  declare namespace PrivyAuthProvider {
18
46
  var displayName: string;
19
47
  }
20
48
 
49
+ /**
50
+ * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.
51
+ * - `signIn`: thrown synchronously while invoking Privy's `login()`.
52
+ * - `signOut`: thrown synchronously while invoking Privy's `logout()`.
53
+ */
54
+ type WalletConnectorAdapterErrorSource = "signIn" | "signOut";
55
+
21
56
  type PrivyWalletConnectorProviderProps = PropsWithChildren<{
57
+ /** Privy application ID. */
22
58
  privyAppId: string;
59
+ /** Optional Privy client ID for non-default deployments. */
23
60
  privyClientId?: string;
61
+ /**
62
+ * Additional Privy client configuration. Merged on top of the defaults
63
+ * applied here (which auto-connect external Solana wallets).
64
+ */
24
65
  privyClientConfig?: PrivyClientConfig;
66
+ /**
67
+ * Optional error callback forwarded to the inner
68
+ * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out
69
+ * failure with the original error and a tag identifying the source.
70
+ * Defaults to `console.error` only.
71
+ */
72
+ onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;
25
73
  }>;
26
- declare function PrivyWalletConnectorProvider({ privyAppId, privyClientId, privyClientConfig, children, }: PrivyWalletConnectorProviderProps): react_jsx_runtime.JSX.Element;
74
+ /**
75
+ * Top-level provider wiring Privy into LiberFi's wallet-connector contract.
76
+ *
77
+ * Mount once near the React tree root, before any
78
+ * {@link import("@liberfi.io/wallet-connector").useWalletConnector | useWalletConnector}
79
+ * or {@link import("@liberfi.io/wallet-connector").useAuth | useAuth} consumer.
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * <PrivyWalletConnectorProvider
84
+ * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}
85
+ * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}
86
+ * >
87
+ * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>
88
+ * <App />
89
+ * </PrivyAuthProvider>
90
+ * </PrivyWalletConnectorProvider>
91
+ * ```
92
+ */
93
+ declare function PrivyWalletConnectorProvider({ privyAppId, privyClientId, privyClientConfig, onError, children, }: PrivyWalletConnectorProviderProps): react_jsx_runtime.JSX.Element;
27
94
  declare namespace PrivyWalletConnectorProvider {
28
95
  var displayName: string;
29
96
  }
30
97
 
31
- export { PrivyAuthProvider, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
98
+ export { PrivyAuthProvider, type PrivyAuthProviderErrorSource, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
package/dist/index.d.ts CHANGED
@@ -2,30 +2,97 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { PrivyClientConfig } from '@privy-io/react-auth';
4
4
 
5
+ /**
6
+ * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.
7
+ * - `getAccessToken`: failed to obtain Privy's raw access token.
8
+ * - `exchangeAccessToken`: the consumer-supplied exchange function rejected
9
+ * or returned a falsy token.
10
+ */
11
+ type PrivyAuthProviderErrorSource = "getAccessToken" | "exchangeAccessToken";
5
12
  type PrivyAuthProviderProps = PropsWithChildren<{
6
- /** exchange privy's access token for a custom access token, if not provided, the privy's access token will be used as is */
7
- exchangeAccessToken?: (
8
- /** privy's access token */
9
- accessToken: string,
10
- /** privy's identity token */
11
- identityToken: string) => Promise<string | undefined | null>;
13
+ /**
14
+ * Exchange Privy's access token for a custom backend access token. If not
15
+ * provided, the Privy access token will be used as-is.
16
+ *
17
+ * @param accessToken - Privy's access token.
18
+ * @param identityToken - Privy's identity token.
19
+ * @returns A custom access token (string) or `null`/`undefined` to mark
20
+ * the exchange as failed.
21
+ */
22
+ exchangeAccessToken?: (accessToken: string, identityToken: string) => Promise<string | undefined | null>;
23
+ /**
24
+ * Optional error callback. Invoked when token retrieval or exchange fails.
25
+ * Defaults to `console.error` only — provide this to integrate with your
26
+ * app's notification or telemetry pipeline.
27
+ */
28
+ onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;
12
29
  }>;
13
30
  /**
14
- * PrivyAuthProvider must be a child of PrivyWalletConnectorProvider
31
+ * Bridges Privy's user/token hooks into an {@link AuthProvider}.
32
+ *
33
+ * Responsibilities:
34
+ * - Resolves Privy's access token (and optionally exchanges it for a backend
35
+ * token via `exchangeAccessToken`) into the `accessToken` field of the
36
+ * {@link AuthenticatedUser}.
37
+ * - Maps the wallet-connector status into the auth status machine
38
+ * (`authenticating | authenticated | deauthenticating | unauthenticated`).
39
+ * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as
40
+ * `signIn` / `signOut`.
41
+ *
42
+ * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.
15
43
  */
16
- declare function PrivyAuthProvider({ exchangeAccessToken, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
44
+ declare function PrivyAuthProvider({ exchangeAccessToken, onError, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
17
45
  declare namespace PrivyAuthProvider {
18
46
  var displayName: string;
19
47
  }
20
48
 
49
+ /**
50
+ * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.
51
+ * - `signIn`: thrown synchronously while invoking Privy's `login()`.
52
+ * - `signOut`: thrown synchronously while invoking Privy's `logout()`.
53
+ */
54
+ type WalletConnectorAdapterErrorSource = "signIn" | "signOut";
55
+
21
56
  type PrivyWalletConnectorProviderProps = PropsWithChildren<{
57
+ /** Privy application ID. */
22
58
  privyAppId: string;
59
+ /** Optional Privy client ID for non-default deployments. */
23
60
  privyClientId?: string;
61
+ /**
62
+ * Additional Privy client configuration. Merged on top of the defaults
63
+ * applied here (which auto-connect external Solana wallets).
64
+ */
24
65
  privyClientConfig?: PrivyClientConfig;
66
+ /**
67
+ * Optional error callback forwarded to the inner
68
+ * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out
69
+ * failure with the original error and a tag identifying the source.
70
+ * Defaults to `console.error` only.
71
+ */
72
+ onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;
25
73
  }>;
26
- declare function PrivyWalletConnectorProvider({ privyAppId, privyClientId, privyClientConfig, children, }: PrivyWalletConnectorProviderProps): react_jsx_runtime.JSX.Element;
74
+ /**
75
+ * Top-level provider wiring Privy into LiberFi's wallet-connector contract.
76
+ *
77
+ * Mount once near the React tree root, before any
78
+ * {@link import("@liberfi.io/wallet-connector").useWalletConnector | useWalletConnector}
79
+ * or {@link import("@liberfi.io/wallet-connector").useAuth | useAuth} consumer.
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * <PrivyWalletConnectorProvider
84
+ * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}
85
+ * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}
86
+ * >
87
+ * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>
88
+ * <App />
89
+ * </PrivyAuthProvider>
90
+ * </PrivyWalletConnectorProvider>
91
+ * ```
92
+ */
93
+ declare function PrivyWalletConnectorProvider({ privyAppId, privyClientId, privyClientConfig, onError, children, }: PrivyWalletConnectorProviderProps): react_jsx_runtime.JSX.Element;
27
94
  declare namespace PrivyWalletConnectorProvider {
28
95
  var displayName: string;
29
96
  }
30
97
 
31
- export { PrivyAuthProvider, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
98
+ export { PrivyAuthProvider, type PrivyAuthProviderErrorSource, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ var kit = require('@solana/kit');
12
12
  // src/PrivyAuthProvider.tsx
13
13
  function PrivyAuthProvider({
14
14
  exchangeAccessToken,
15
+ onError,
15
16
  children
16
17
  }) {
17
18
  const {
@@ -27,20 +28,27 @@ function PrivyAuthProvider({
27
28
  const [accessToken, setAccessToken] = react.useState(null);
28
29
  react.useEffect(() => {
29
30
  if (ready && authenticated) {
30
- getAccessToken().then((token) => setPrivyAccessToken(token));
31
+ getAccessToken().then((token) => setPrivyAccessToken(token)).catch((error) => {
32
+ onError?.(error, "getAccessToken");
33
+ });
31
34
  }
32
- }, [ready, authenticated, getAccessToken]);
35
+ }, [ready, authenticated, getAccessToken, onError]);
33
36
  react.useEffect(() => {
34
37
  if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {
35
38
  exchangeAccessToken(privyAccessToken, privyIdentityToken).then((token) => {
36
39
  if (!token) {
40
+ const error = new Error(
41
+ "PrivyAuthProvider: exchange access token returned empty token"
42
+ );
43
+ onError?.(error, "exchangeAccessToken");
37
44
  return;
38
45
  }
39
46
  setAccessToken(token);
40
47
  }).catch((error) => {
48
+ onError?.(error, "exchangeAccessToken");
41
49
  });
42
50
  }
43
- }, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);
51
+ }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);
44
52
  const status = react.useMemo(() => {
45
53
  switch (walletStatus) {
46
54
  case "detecting":
@@ -118,48 +126,41 @@ var PrivyEvmWalletAdapter = class {
118
126
  );
119
127
  return signature;
120
128
  }
121
- async signTransaction(serializedTx) {
122
- if (!this.wallet) throw new Error("Wallet is not connected");
129
+ /**
130
+ * Parse a serialized EVM transaction into the field shape Privy's
131
+ * `signTransaction` / `sendTransaction` hooks accept. Centralized here so
132
+ * the two callers stay in sync when the field set evolves.
133
+ */
134
+ serializedTxToPrivyTx(serializedTx) {
123
135
  const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
124
136
  const tx = ethers.ethers.Transaction.from(serializedTxHex);
137
+ return {
138
+ from: tx.from ?? void 0,
139
+ to: tx.to ?? void 0,
140
+ value: tx.value,
141
+ gasLimit: tx.gasLimit,
142
+ gasPrice: tx.gasPrice ?? void 0,
143
+ nonce: tx.nonce,
144
+ data: tx.data,
145
+ type: tx.type ?? void 0,
146
+ accessList: tx.accessList ?? void 0,
147
+ chainId: Number(tx.chainId),
148
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
149
+ maxFeePerGas: tx.maxFeePerGas ?? void 0
150
+ };
151
+ }
152
+ async signTransaction(serializedTx) {
153
+ if (!this.wallet) throw new Error("Wallet is not connected");
125
154
  const { signature } = await this.privySignTransaction(
126
- {
127
- from: tx.from ?? void 0,
128
- to: tx.to ?? void 0,
129
- value: tx.value,
130
- gasLimit: tx.gasLimit,
131
- gasPrice: tx.gasPrice ?? void 0,
132
- nonce: tx.nonce,
133
- data: tx.data,
134
- type: tx.type ?? void 0,
135
- accessList: tx.accessList ?? void 0,
136
- chainId: Number(tx.chainId),
137
- maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
138
- maxFeePerGas: tx.maxFeePerGas ?? void 0
139
- },
155
+ this.serializedTxToPrivyTx(serializedTx),
140
156
  { address: this.address }
141
157
  );
142
158
  return new Uint8Array(Buffer.from(signature.slice(2), "hex"));
143
159
  }
144
160
  async sendTransaction(serializedTx) {
145
161
  if (!this.wallet) throw new Error("Wallet is not connected");
146
- const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
147
- const tx = ethers.ethers.Transaction.from(serializedTxHex);
148
162
  const { hash } = await this.privySendTransaction(
149
- {
150
- from: tx.from ?? void 0,
151
- to: tx.to ?? void 0,
152
- value: tx.value,
153
- gasLimit: tx.gasLimit,
154
- gasPrice: tx.gasPrice ?? void 0,
155
- nonce: tx.nonce,
156
- data: tx.data,
157
- type: tx.type ?? void 0,
158
- accessList: tx.accessList ?? void 0,
159
- chainId: Number(tx.chainId),
160
- maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
161
- maxFeePerGas: tx.maxFeePerGas ?? void 0
162
- },
163
+ this.serializedTxToPrivyTx(serializedTx),
163
164
  { address: this.address }
164
165
  );
165
166
  return hash;
@@ -223,7 +224,10 @@ var PrivySolanaWalletAdapter = class {
223
224
  return kit.getBase58Decoder().decode(signature);
224
225
  }
225
226
  };
226
- function WalletConnectorAdapter({ children }) {
227
+ function WalletConnectorAdapter({
228
+ children,
229
+ onError
230
+ }) {
227
231
  const { ready: authReady, user, authenticated, login, logout } = reactAuth.usePrivy();
228
232
  const { ready: evmReady, wallets: evmWallets } = reactAuth.useWallets();
229
233
  const { ready: solanaReady, wallets: solanaWallets } = solana.useWallets();
@@ -234,8 +238,15 @@ function WalletConnectorAdapter({ children }) {
234
238
  const { signTransaction: signSolanaTransaction } = solana.useSignTransaction();
235
239
  const { signAndSendTransaction: signAndSendSolanaTransaction } = solana.useSignAndSendTransaction();
236
240
  const [isSigningIn, setIsSigningIn] = react.useState(false);
241
+ const loginRequestedRef = react.useRef(false);
237
242
  const [isSigningOut, setIsSigningOut] = react.useState(false);
238
243
  const logoutRequestedRef = react.useRef(false);
244
+ react.useEffect(() => {
245
+ if (loginRequestedRef.current && authenticated) {
246
+ loginRequestedRef.current = false;
247
+ setIsSigningIn(false);
248
+ }
249
+ }, [authenticated]);
239
250
  react.useEffect(() => {
240
251
  if (logoutRequestedRef.current && !authenticated) {
241
252
  logoutRequestedRef.current = false;
@@ -270,8 +281,7 @@ function WalletConnectorAdapter({ children }) {
270
281
  signAndSendSolanaTransaction
271
282
  );
272
283
  });
273
- const walletAdapters = [...evmWalletAdapters, ...solanaWalletAdapters];
274
- return walletAdapters;
284
+ return [...evmWalletAdapters, ...solanaWalletAdapters];
275
285
  }, [
276
286
  user?.linkedAccounts,
277
287
  evmWallets,
@@ -297,27 +307,30 @@ function WalletConnectorAdapter({ children }) {
297
307
  isSigningIn,
298
308
  isSigningOut,
299
309
  authenticated,
300
- user?.linkedAccounts
310
+ user
301
311
  ]);
302
312
  const signIn = react.useCallback(async () => {
303
313
  setIsSigningIn(true);
314
+ loginRequestedRef.current = true;
304
315
  try {
305
316
  login();
306
317
  } catch (error) {
307
- } finally {
318
+ onError?.(error, "signIn");
319
+ loginRequestedRef.current = false;
308
320
  setIsSigningIn(false);
309
321
  }
310
- }, [login]);
322
+ }, [login, onError]);
311
323
  const signOut = react.useCallback(async () => {
312
324
  setIsSigningOut(true);
313
325
  logoutRequestedRef.current = true;
314
326
  try {
315
327
  logout();
316
328
  } catch (error) {
329
+ onError?.(error, "signOut");
317
330
  logoutRequestedRef.current = false;
318
331
  setIsSigningOut(false);
319
332
  }
320
- }, [logout]);
333
+ }, [logout, onError]);
321
334
  return /* @__PURE__ */ jsxRuntime.jsx(
322
335
  walletConnector.WalletConnectorProvider,
323
336
  {
@@ -333,6 +346,7 @@ function PrivyWalletConnectorProvider({
333
346
  privyAppId,
334
347
  privyClientId,
335
348
  privyClientConfig,
349
+ onError,
336
350
  children
337
351
  }) {
338
352
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -350,7 +364,7 @@ function PrivyWalletConnectorProvider({
350
364
  },
351
365
  ...privyClientConfig
352
366
  },
353
- children: /* @__PURE__ */ jsxRuntime.jsx(WalletConnectorAdapter, { children })
367
+ children: /* @__PURE__ */ jsxRuntime.jsx(WalletConnectorAdapter, { onError, children })
354
368
  }
355
369
  );
356
370
  }
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","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\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /** exchange privy's access token for a custom access token, if not provided, the privy's access token will be used as is */\n exchangeAccessToken?: (\n /** privy's access token */\n accessToken: string,\n /** privy's identity token */\n identityToken: string,\n ) => Promise<string | undefined | null>;\n}>;\n\n/**\n * PrivyAuthProvider must be a child of PrivyWalletConnectorProvider\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\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().then((token) => setPrivyAccessToken(token));\n }\n }, [ready, authenticated, getAccessToken]);\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 console.error(\"PrivyAuthProvider: exchange access token failed\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);\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 console.debug(\"[PrivyAuthProvider] building user:\", {\n privyUser: privyUser?.id,\n linkedAccounts: privyUser?.linkedAccounts?.map(\n (a) => `${a.type}:${(a as any).chainType ?? \"n/a\"}`,\n ),\n privyAccessToken: !!privyAccessToken,\n accessToken: !!accessToken,\n hasExchangeFn: !!exchangeAccessToken,\n walletCount: wallets.length,\n });\n\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 async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n const { signature } = await this.privySignTransaction(\n {\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 { 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 serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n const { hash } = await this.privySendTransaction(\n {\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 { address: this.address },\n );\n return hash;\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","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 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\nexport function WalletConnectorAdapter({ children }: PropsWithChildren) {\n // privy authentication states\n const { ready: authReady, user, authenticated, login, 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\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 // 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 const walletAdapters = [...evmWalletAdapters, ...solanaWalletAdapters];\n return walletAdapters;\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?.linkedAccounts,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n try {\n login();\n } catch (error) {\n // TODO make error human readable\n console.error(error);\n } finally {\n setIsSigningIn(false);\n }\n }, [login]);\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(error);\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout]);\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 { WalletConnectorAdapter } from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n privyAppId: string;\n privyClientId?: string;\n privyClientConfig?: PrivyClientConfig;\n}>;\n\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\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>{children}</WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
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","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 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","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 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, login, 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 // 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"]}
package/dist/index.mjs CHANGED
@@ -10,6 +10,7 @@ import { getBase58Decoder } from '@solana/kit';
10
10
  // src/PrivyAuthProvider.tsx
11
11
  function PrivyAuthProvider({
12
12
  exchangeAccessToken,
13
+ onError,
13
14
  children
14
15
  }) {
15
16
  const {
@@ -25,20 +26,27 @@ function PrivyAuthProvider({
25
26
  const [accessToken, setAccessToken] = useState(null);
26
27
  useEffect(() => {
27
28
  if (ready && authenticated) {
28
- getAccessToken().then((token) => setPrivyAccessToken(token));
29
+ getAccessToken().then((token) => setPrivyAccessToken(token)).catch((error) => {
30
+ onError?.(error, "getAccessToken");
31
+ });
29
32
  }
30
- }, [ready, authenticated, getAccessToken]);
33
+ }, [ready, authenticated, getAccessToken, onError]);
31
34
  useEffect(() => {
32
35
  if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {
33
36
  exchangeAccessToken(privyAccessToken, privyIdentityToken).then((token) => {
34
37
  if (!token) {
38
+ const error = new Error(
39
+ "PrivyAuthProvider: exchange access token returned empty token"
40
+ );
41
+ onError?.(error, "exchangeAccessToken");
35
42
  return;
36
43
  }
37
44
  setAccessToken(token);
38
45
  }).catch((error) => {
46
+ onError?.(error, "exchangeAccessToken");
39
47
  });
40
48
  }
41
- }, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);
49
+ }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);
42
50
  const status = useMemo(() => {
43
51
  switch (walletStatus) {
44
52
  case "detecting":
@@ -116,48 +124,41 @@ var PrivyEvmWalletAdapter = class {
116
124
  );
117
125
  return signature;
118
126
  }
119
- async signTransaction(serializedTx) {
120
- if (!this.wallet) throw new Error("Wallet is not connected");
127
+ /**
128
+ * Parse a serialized EVM transaction into the field shape Privy's
129
+ * `signTransaction` / `sendTransaction` hooks accept. Centralized here so
130
+ * the two callers stay in sync when the field set evolves.
131
+ */
132
+ serializedTxToPrivyTx(serializedTx) {
121
133
  const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
122
134
  const tx = ethers.Transaction.from(serializedTxHex);
135
+ return {
136
+ from: tx.from ?? void 0,
137
+ to: tx.to ?? void 0,
138
+ value: tx.value,
139
+ gasLimit: tx.gasLimit,
140
+ gasPrice: tx.gasPrice ?? void 0,
141
+ nonce: tx.nonce,
142
+ data: tx.data,
143
+ type: tx.type ?? void 0,
144
+ accessList: tx.accessList ?? void 0,
145
+ chainId: Number(tx.chainId),
146
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
147
+ maxFeePerGas: tx.maxFeePerGas ?? void 0
148
+ };
149
+ }
150
+ async signTransaction(serializedTx) {
151
+ if (!this.wallet) throw new Error("Wallet is not connected");
123
152
  const { signature } = await this.privySignTransaction(
124
- {
125
- from: tx.from ?? void 0,
126
- to: tx.to ?? void 0,
127
- value: tx.value,
128
- gasLimit: tx.gasLimit,
129
- gasPrice: tx.gasPrice ?? void 0,
130
- nonce: tx.nonce,
131
- data: tx.data,
132
- type: tx.type ?? void 0,
133
- accessList: tx.accessList ?? void 0,
134
- chainId: Number(tx.chainId),
135
- maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
136
- maxFeePerGas: tx.maxFeePerGas ?? void 0
137
- },
153
+ this.serializedTxToPrivyTx(serializedTx),
138
154
  { address: this.address }
139
155
  );
140
156
  return new Uint8Array(Buffer.from(signature.slice(2), "hex"));
141
157
  }
142
158
  async sendTransaction(serializedTx) {
143
159
  if (!this.wallet) throw new Error("Wallet is not connected");
144
- const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
145
- const tx = ethers.Transaction.from(serializedTxHex);
146
160
  const { hash } = await this.privySendTransaction(
147
- {
148
- from: tx.from ?? void 0,
149
- to: tx.to ?? void 0,
150
- value: tx.value,
151
- gasLimit: tx.gasLimit,
152
- gasPrice: tx.gasPrice ?? void 0,
153
- nonce: tx.nonce,
154
- data: tx.data,
155
- type: tx.type ?? void 0,
156
- accessList: tx.accessList ?? void 0,
157
- chainId: Number(tx.chainId),
158
- maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
159
- maxFeePerGas: tx.maxFeePerGas ?? void 0
160
- },
161
+ this.serializedTxToPrivyTx(serializedTx),
161
162
  { address: this.address }
162
163
  );
163
164
  return hash;
@@ -221,7 +222,10 @@ var PrivySolanaWalletAdapter = class {
221
222
  return getBase58Decoder().decode(signature);
222
223
  }
223
224
  };
224
- function WalletConnectorAdapter({ children }) {
225
+ function WalletConnectorAdapter({
226
+ children,
227
+ onError
228
+ }) {
225
229
  const { ready: authReady, user, authenticated, login, logout } = usePrivy();
226
230
  const { ready: evmReady, wallets: evmWallets } = useWallets();
227
231
  const { ready: solanaReady, wallets: solanaWallets } = useWallets$1();
@@ -232,8 +236,15 @@ function WalletConnectorAdapter({ children }) {
232
236
  const { signTransaction: signSolanaTransaction } = useSignTransaction$1();
233
237
  const { signAndSendTransaction: signAndSendSolanaTransaction } = useSignAndSendTransaction();
234
238
  const [isSigningIn, setIsSigningIn] = useState(false);
239
+ const loginRequestedRef = useRef(false);
235
240
  const [isSigningOut, setIsSigningOut] = useState(false);
236
241
  const logoutRequestedRef = useRef(false);
242
+ useEffect(() => {
243
+ if (loginRequestedRef.current && authenticated) {
244
+ loginRequestedRef.current = false;
245
+ setIsSigningIn(false);
246
+ }
247
+ }, [authenticated]);
237
248
  useEffect(() => {
238
249
  if (logoutRequestedRef.current && !authenticated) {
239
250
  logoutRequestedRef.current = false;
@@ -268,8 +279,7 @@ function WalletConnectorAdapter({ children }) {
268
279
  signAndSendSolanaTransaction
269
280
  );
270
281
  });
271
- const walletAdapters = [...evmWalletAdapters, ...solanaWalletAdapters];
272
- return walletAdapters;
282
+ return [...evmWalletAdapters, ...solanaWalletAdapters];
273
283
  }, [
274
284
  user?.linkedAccounts,
275
285
  evmWallets,
@@ -295,27 +305,30 @@ function WalletConnectorAdapter({ children }) {
295
305
  isSigningIn,
296
306
  isSigningOut,
297
307
  authenticated,
298
- user?.linkedAccounts
308
+ user
299
309
  ]);
300
310
  const signIn = useCallback(async () => {
301
311
  setIsSigningIn(true);
312
+ loginRequestedRef.current = true;
302
313
  try {
303
314
  login();
304
315
  } catch (error) {
305
- } finally {
316
+ onError?.(error, "signIn");
317
+ loginRequestedRef.current = false;
306
318
  setIsSigningIn(false);
307
319
  }
308
- }, [login]);
320
+ }, [login, onError]);
309
321
  const signOut = useCallback(async () => {
310
322
  setIsSigningOut(true);
311
323
  logoutRequestedRef.current = true;
312
324
  try {
313
325
  logout();
314
326
  } catch (error) {
327
+ onError?.(error, "signOut");
315
328
  logoutRequestedRef.current = false;
316
329
  setIsSigningOut(false);
317
330
  }
318
- }, [logout]);
331
+ }, [logout, onError]);
319
332
  return /* @__PURE__ */ jsx(
320
333
  WalletConnectorProvider,
321
334
  {
@@ -331,6 +344,7 @@ function PrivyWalletConnectorProvider({
331
344
  privyAppId,
332
345
  privyClientId,
333
346
  privyClientConfig,
347
+ onError,
334
348
  children
335
349
  }) {
336
350
  return /* @__PURE__ */ jsx(
@@ -348,7 +362,7 @@ function PrivyWalletConnectorProvider({
348
362
  },
349
363
  ...privyClientConfig
350
364
  },
351
- children: /* @__PURE__ */ jsx(WalletConnectorAdapter, { children })
365
+ children: /* @__PURE__ */ jsx(WalletConnectorAdapter, { onError, children })
352
366
  }
353
367
  );
354
368
  }
@@ -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\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /** exchange privy's access token for a custom access token, if not provided, the privy's access token will be used as is */\n exchangeAccessToken?: (\n /** privy's access token */\n accessToken: string,\n /** privy's identity token */\n identityToken: string,\n ) => Promise<string | undefined | null>;\n}>;\n\n/**\n * PrivyAuthProvider must be a child of PrivyWalletConnectorProvider\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\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().then((token) => setPrivyAccessToken(token));\n }\n }, [ready, authenticated, getAccessToken]);\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 console.error(\"PrivyAuthProvider: exchange access token failed\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);\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 console.debug(\"[PrivyAuthProvider] building user:\", {\n privyUser: privyUser?.id,\n linkedAccounts: privyUser?.linkedAccounts?.map(\n (a) => `${a.type}:${(a as any).chainType ?? \"n/a\"}`,\n ),\n privyAccessToken: !!privyAccessToken,\n accessToken: !!accessToken,\n hasExchangeFn: !!exchangeAccessToken,\n walletCount: wallets.length,\n });\n\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 async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n const { signature } = await this.privySignTransaction(\n {\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 { 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 serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n const { hash } = await this.privySendTransaction(\n {\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 { address: this.address },\n );\n return hash;\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","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 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\nexport function WalletConnectorAdapter({ children }: PropsWithChildren) {\n // privy authentication states\n const { ready: authReady, user, authenticated, login, 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\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 // 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 const walletAdapters = [...evmWalletAdapters, ...solanaWalletAdapters];\n return walletAdapters;\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?.linkedAccounts,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n try {\n login();\n } catch (error) {\n // TODO make error human readable\n console.error(error);\n } finally {\n setIsSigningIn(false);\n }\n }, [login]);\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(error);\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout]);\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 { WalletConnectorAdapter } from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n privyAppId: string;\n privyClientId?: string;\n privyClientConfig?: PrivyClientConfig;\n}>;\n\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\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>{children}</WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
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 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","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 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, login, 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 // 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/wallet-connector-privy",
3
- "version": "0.1.191",
3
+ "version": "1.0.0",
4
4
  "description": "Privy wallet connector for Liberfi React SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,36 +11,34 @@
11
11
  ],
12
12
  "peerDependencies": {
13
13
  "@privy-io/react-auth": "^3.16.0",
14
- "@solana-program/memo": "^0.8.0",
15
- "@solana-program/system": "^0.8.0",
16
- "@solana-program/token": "^0.6.0",
17
14
  "@solana/kit": "^3.0.3",
18
- "@solana/web3.js": "^1.98.4",
19
15
  "ethers": "^6.15.0",
20
16
  "react": ">=18",
21
17
  "react-dom": ">=18",
22
- "@liberfi.io/wallet-connector": "0.1.186"
18
+ "@liberfi.io/wallet-connector": "0.2.0"
23
19
  },
24
20
  "dependencies": {
25
- "@liberfi.io/types": "0.4.0"
21
+ "@liberfi.io/types": "0.4.1"
26
22
  },
27
23
  "devDependencies": {
28
24
  "@privy-io/react-auth": "^3.16.0",
29
- "@solana-program/memo": "^0.8.0",
30
- "@solana-program/system": "^0.8.0",
31
- "@solana-program/token": "^0.6.0",
32
25
  "@solana/kit": "^3.0.3",
33
- "@solana/web3.js": "^1.98.4",
26
+ "@testing-library/dom": "^10.4.1",
27
+ "@testing-library/react": "^16.3.0",
28
+ "@types/jest": "^29.5.3",
34
29
  "@types/react": "^19.1.13",
35
30
  "@types/react-dom": "^19.1.9",
36
31
  "ethers": "^6.15.0",
32
+ "jest": "^29.6.1",
33
+ "jest-environment-jsdom": "^29.7.0",
37
34
  "react": "^19.1.1",
38
35
  "react-dom": "^19.1.1",
39
36
  "rimraf": "^5.0.5",
37
+ "ts-jest": "^29.4.6",
40
38
  "tsup": "^8.5.0",
41
39
  "typescript": "^5.9.2",
42
- "tsconfig": "0.1.183",
43
- "@liberfi.io/wallet-connector": "0.1.186"
40
+ "@liberfi.io/wallet-connector": "0.2.0",
41
+ "tsconfig": "0.1.184"
44
42
  },
45
43
  "publishConfig": {
46
44
  "access": "public"
@@ -48,6 +46,6 @@
48
46
  "scripts": {
49
47
  "dev": "tsup --watch",
50
48
  "build": "rimraf -rf dist && tsup",
51
- "test": "echo \"Error: no test specified\" && exit 1"
49
+ "test": "jest"
52
50
  }
53
51
  }