@liberfi.io/wallet-connector-privy 0.1.190 → 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 +16 -27
- package/dist/index.d.mts +77 -19
- package/dist/index.d.ts +77 -19
- package/dist/index.js +58 -50
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -50
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -14
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
|
|
26
|
-
| `@solana/
|
|
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
|
|
40
|
-
| ------------------- |
|
|
41
|
-
| `privyAppId` | `string`
|
|
42
|
-
| `privyClientId` | `string`
|
|
43
|
-
| `privyClientConfig` | `PrivyClientConfig`
|
|
44
|
-
| `
|
|
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,20 +56,9 @@ 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
|
-
### Constants
|
|
56
|
-
|
|
57
|
-
#### `version`
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
import { version } from "@liberfi.io/wallet-connector-privy";
|
|
61
|
-
|
|
62
|
-
// "0.1.23"
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Current package version string. Also registered on `window.__LIBERFI_VERSION__` at import time.
|
|
66
|
-
|
|
67
62
|
### Internal Architecture (not exported)
|
|
68
63
|
|
|
69
64
|
| Module | Role |
|
|
@@ -173,14 +168,8 @@ function ConnectButton() {
|
|
|
173
168
|
|
|
174
169
|
## Future Improvements
|
|
175
170
|
|
|
176
|
-
- **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.
|
|
177
|
-
- **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.
|
|
178
|
-
- **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.
|
|
179
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.
|
|
180
|
-
- **
|
|
181
|
-
- **Deduplicate EVM tx parsing** — `PrivyEvmWalletAdapter.signTransaction` and `sendTransaction` share near-identical deserialization logic; extract a private helper method.
|
|
182
|
-
- **Tests** — Add unit tests for `PrivyEvmWalletAdapter` and `PrivySolanaWalletAdapter` with mocked Privy functions; consider integration tests for the adapter component.
|
|
183
|
-
- **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.
|
|
184
173
|
|
|
185
174
|
## Related Packages
|
|
186
175
|
|
package/dist/index.d.mts
CHANGED
|
@@ -2,39 +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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
declare const _default: "0.1.190";
|
|
13
|
-
|
|
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";
|
|
14
12
|
type PrivyAuthProviderProps = PropsWithChildren<{
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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;
|
|
21
29
|
}>;
|
|
22
30
|
/**
|
|
23
|
-
*
|
|
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}.
|
|
24
43
|
*/
|
|
25
|
-
declare function PrivyAuthProvider({ exchangeAccessToken, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function PrivyAuthProvider({ exchangeAccessToken, onError, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
26
45
|
declare namespace PrivyAuthProvider {
|
|
27
46
|
var displayName: string;
|
|
28
47
|
}
|
|
29
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
|
+
|
|
30
56
|
type PrivyWalletConnectorProviderProps = PropsWithChildren<{
|
|
57
|
+
/** Privy application ID. */
|
|
31
58
|
privyAppId: string;
|
|
59
|
+
/** Optional Privy client ID for non-default deployments. */
|
|
32
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
|
+
*/
|
|
33
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;
|
|
34
73
|
}>;
|
|
35
|
-
|
|
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;
|
|
36
94
|
declare namespace PrivyWalletConnectorProvider {
|
|
37
95
|
var displayName: string;
|
|
38
96
|
}
|
|
39
97
|
|
|
40
|
-
export { PrivyAuthProvider, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps
|
|
98
|
+
export { PrivyAuthProvider, type PrivyAuthProviderErrorSource, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,39 +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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
declare const _default: "0.1.190";
|
|
13
|
-
|
|
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";
|
|
14
12
|
type PrivyAuthProviderProps = PropsWithChildren<{
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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;
|
|
21
29
|
}>;
|
|
22
30
|
/**
|
|
23
|
-
*
|
|
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}.
|
|
24
43
|
*/
|
|
25
|
-
declare function PrivyAuthProvider({ exchangeAccessToken, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function PrivyAuthProvider({ exchangeAccessToken, onError, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
26
45
|
declare namespace PrivyAuthProvider {
|
|
27
46
|
var displayName: string;
|
|
28
47
|
}
|
|
29
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
|
+
|
|
30
56
|
type PrivyWalletConnectorProviderProps = PropsWithChildren<{
|
|
57
|
+
/** Privy application ID. */
|
|
31
58
|
privyAppId: string;
|
|
59
|
+
/** Optional Privy client ID for non-default deployments. */
|
|
32
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
|
+
*/
|
|
33
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;
|
|
34
73
|
}>;
|
|
35
|
-
|
|
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;
|
|
36
94
|
declare namespace PrivyWalletConnectorProvider {
|
|
37
95
|
var displayName: string;
|
|
38
96
|
}
|
|
39
97
|
|
|
40
|
-
export { PrivyAuthProvider, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps
|
|
98
|
+
export { PrivyAuthProvider, type PrivyAuthProviderErrorSource, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
|
package/dist/index.js
CHANGED
|
@@ -9,14 +9,10 @@ var ethers = require('ethers');
|
|
|
9
9
|
var types = require('@liberfi.io/types');
|
|
10
10
|
var kit = require('@solana/kit');
|
|
11
11
|
|
|
12
|
-
// src/
|
|
13
|
-
if (typeof window !== "undefined") {
|
|
14
|
-
window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};
|
|
15
|
-
window.__LIBERFI_VERSION__["@liberfi.io/wallet-connector-privy"] = "0.1.190";
|
|
16
|
-
}
|
|
17
|
-
var version_default = "0.1.190";
|
|
12
|
+
// src/PrivyAuthProvider.tsx
|
|
18
13
|
function PrivyAuthProvider({
|
|
19
14
|
exchangeAccessToken,
|
|
15
|
+
onError,
|
|
20
16
|
children
|
|
21
17
|
}) {
|
|
22
18
|
const {
|
|
@@ -32,20 +28,27 @@ function PrivyAuthProvider({
|
|
|
32
28
|
const [accessToken, setAccessToken] = react.useState(null);
|
|
33
29
|
react.useEffect(() => {
|
|
34
30
|
if (ready && authenticated) {
|
|
35
|
-
getAccessToken().then((token) => setPrivyAccessToken(token))
|
|
31
|
+
getAccessToken().then((token) => setPrivyAccessToken(token)).catch((error) => {
|
|
32
|
+
onError?.(error, "getAccessToken");
|
|
33
|
+
});
|
|
36
34
|
}
|
|
37
|
-
}, [ready, authenticated, getAccessToken]);
|
|
35
|
+
}, [ready, authenticated, getAccessToken, onError]);
|
|
38
36
|
react.useEffect(() => {
|
|
39
37
|
if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {
|
|
40
38
|
exchangeAccessToken(privyAccessToken, privyIdentityToken).then((token) => {
|
|
41
39
|
if (!token) {
|
|
40
|
+
const error = new Error(
|
|
41
|
+
"PrivyAuthProvider: exchange access token returned empty token"
|
|
42
|
+
);
|
|
43
|
+
onError?.(error, "exchangeAccessToken");
|
|
42
44
|
return;
|
|
43
45
|
}
|
|
44
46
|
setAccessToken(token);
|
|
45
47
|
}).catch((error) => {
|
|
48
|
+
onError?.(error, "exchangeAccessToken");
|
|
46
49
|
});
|
|
47
50
|
}
|
|
48
|
-
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);
|
|
51
|
+
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);
|
|
49
52
|
const status = react.useMemo(() => {
|
|
50
53
|
switch (walletStatus) {
|
|
51
54
|
case "detecting":
|
|
@@ -123,48 +126,41 @@ var PrivyEvmWalletAdapter = class {
|
|
|
123
126
|
);
|
|
124
127
|
return signature;
|
|
125
128
|
}
|
|
126
|
-
|
|
127
|
-
|
|
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) {
|
|
128
135
|
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
129
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");
|
|
130
154
|
const { signature } = await this.privySignTransaction(
|
|
131
|
-
|
|
132
|
-
from: tx.from ?? void 0,
|
|
133
|
-
to: tx.to ?? void 0,
|
|
134
|
-
value: tx.value,
|
|
135
|
-
gasLimit: tx.gasLimit,
|
|
136
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
137
|
-
nonce: tx.nonce,
|
|
138
|
-
data: tx.data,
|
|
139
|
-
type: tx.type ?? void 0,
|
|
140
|
-
accessList: tx.accessList ?? void 0,
|
|
141
|
-
chainId: Number(tx.chainId),
|
|
142
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
143
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
144
|
-
},
|
|
155
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
145
156
|
{ address: this.address }
|
|
146
157
|
);
|
|
147
158
|
return new Uint8Array(Buffer.from(signature.slice(2), "hex"));
|
|
148
159
|
}
|
|
149
160
|
async sendTransaction(serializedTx) {
|
|
150
161
|
if (!this.wallet) throw new Error("Wallet is not connected");
|
|
151
|
-
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
152
|
-
const tx = ethers.ethers.Transaction.from(serializedTxHex);
|
|
153
162
|
const { hash } = await this.privySendTransaction(
|
|
154
|
-
|
|
155
|
-
from: tx.from ?? void 0,
|
|
156
|
-
to: tx.to ?? void 0,
|
|
157
|
-
value: tx.value,
|
|
158
|
-
gasLimit: tx.gasLimit,
|
|
159
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
160
|
-
nonce: tx.nonce,
|
|
161
|
-
data: tx.data,
|
|
162
|
-
type: tx.type ?? void 0,
|
|
163
|
-
accessList: tx.accessList ?? void 0,
|
|
164
|
-
chainId: Number(tx.chainId),
|
|
165
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
166
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
167
|
-
},
|
|
163
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
168
164
|
{ address: this.address }
|
|
169
165
|
);
|
|
170
166
|
return hash;
|
|
@@ -228,7 +224,10 @@ var PrivySolanaWalletAdapter = class {
|
|
|
228
224
|
return kit.getBase58Decoder().decode(signature);
|
|
229
225
|
}
|
|
230
226
|
};
|
|
231
|
-
function WalletConnectorAdapter({
|
|
227
|
+
function WalletConnectorAdapter({
|
|
228
|
+
children,
|
|
229
|
+
onError
|
|
230
|
+
}) {
|
|
232
231
|
const { ready: authReady, user, authenticated, login, logout } = reactAuth.usePrivy();
|
|
233
232
|
const { ready: evmReady, wallets: evmWallets } = reactAuth.useWallets();
|
|
234
233
|
const { ready: solanaReady, wallets: solanaWallets } = solana.useWallets();
|
|
@@ -239,8 +238,15 @@ function WalletConnectorAdapter({ children }) {
|
|
|
239
238
|
const { signTransaction: signSolanaTransaction } = solana.useSignTransaction();
|
|
240
239
|
const { signAndSendTransaction: signAndSendSolanaTransaction } = solana.useSignAndSendTransaction();
|
|
241
240
|
const [isSigningIn, setIsSigningIn] = react.useState(false);
|
|
241
|
+
const loginRequestedRef = react.useRef(false);
|
|
242
242
|
const [isSigningOut, setIsSigningOut] = react.useState(false);
|
|
243
243
|
const logoutRequestedRef = react.useRef(false);
|
|
244
|
+
react.useEffect(() => {
|
|
245
|
+
if (loginRequestedRef.current && authenticated) {
|
|
246
|
+
loginRequestedRef.current = false;
|
|
247
|
+
setIsSigningIn(false);
|
|
248
|
+
}
|
|
249
|
+
}, [authenticated]);
|
|
244
250
|
react.useEffect(() => {
|
|
245
251
|
if (logoutRequestedRef.current && !authenticated) {
|
|
246
252
|
logoutRequestedRef.current = false;
|
|
@@ -275,8 +281,7 @@ function WalletConnectorAdapter({ children }) {
|
|
|
275
281
|
signAndSendSolanaTransaction
|
|
276
282
|
);
|
|
277
283
|
});
|
|
278
|
-
|
|
279
|
-
return walletAdapters;
|
|
284
|
+
return [...evmWalletAdapters, ...solanaWalletAdapters];
|
|
280
285
|
}, [
|
|
281
286
|
user?.linkedAccounts,
|
|
282
287
|
evmWallets,
|
|
@@ -302,27 +307,30 @@ function WalletConnectorAdapter({ children }) {
|
|
|
302
307
|
isSigningIn,
|
|
303
308
|
isSigningOut,
|
|
304
309
|
authenticated,
|
|
305
|
-
user
|
|
310
|
+
user
|
|
306
311
|
]);
|
|
307
312
|
const signIn = react.useCallback(async () => {
|
|
308
313
|
setIsSigningIn(true);
|
|
314
|
+
loginRequestedRef.current = true;
|
|
309
315
|
try {
|
|
310
316
|
login();
|
|
311
317
|
} catch (error) {
|
|
312
|
-
|
|
318
|
+
onError?.(error, "signIn");
|
|
319
|
+
loginRequestedRef.current = false;
|
|
313
320
|
setIsSigningIn(false);
|
|
314
321
|
}
|
|
315
|
-
}, [login]);
|
|
322
|
+
}, [login, onError]);
|
|
316
323
|
const signOut = react.useCallback(async () => {
|
|
317
324
|
setIsSigningOut(true);
|
|
318
325
|
logoutRequestedRef.current = true;
|
|
319
326
|
try {
|
|
320
327
|
logout();
|
|
321
328
|
} catch (error) {
|
|
329
|
+
onError?.(error, "signOut");
|
|
322
330
|
logoutRequestedRef.current = false;
|
|
323
331
|
setIsSigningOut(false);
|
|
324
332
|
}
|
|
325
|
-
}, [logout]);
|
|
333
|
+
}, [logout, onError]);
|
|
326
334
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
327
335
|
walletConnector.WalletConnectorProvider,
|
|
328
336
|
{
|
|
@@ -338,6 +346,7 @@ function PrivyWalletConnectorProvider({
|
|
|
338
346
|
privyAppId,
|
|
339
347
|
privyClientId,
|
|
340
348
|
privyClientConfig,
|
|
349
|
+
onError,
|
|
341
350
|
children
|
|
342
351
|
}) {
|
|
343
352
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -355,7 +364,7 @@ function PrivyWalletConnectorProvider({
|
|
|
355
364
|
},
|
|
356
365
|
...privyClientConfig
|
|
357
366
|
},
|
|
358
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(WalletConnectorAdapter, { children })
|
|
367
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(WalletConnectorAdapter, { onError, children })
|
|
359
368
|
}
|
|
360
369
|
);
|
|
361
370
|
}
|
|
@@ -363,6 +372,5 @@ PrivyWalletConnectorProvider.displayName = "PrivyWalletConnectorProvider";
|
|
|
363
372
|
|
|
364
373
|
exports.PrivyAuthProvider = PrivyAuthProvider;
|
|
365
374
|
exports.PrivyWalletConnectorProvider = PrivyWalletConnectorProvider;
|
|
366
|
-
exports.version = version_default;
|
|
367
375
|
//# sourceMappingURL=index.js.map
|
|
368
376
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../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":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/wallet-connector-privy\"] = \"0.1.190\";\n}\n\nexport default \"0.1.190\";\n","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
|
@@ -7,14 +7,10 @@ import { ethers } from 'ethers';
|
|
|
7
7
|
import { ChainNamespace, Chain } from '@liberfi.io/types';
|
|
8
8
|
import { getBase58Decoder } from '@solana/kit';
|
|
9
9
|
|
|
10
|
-
// src/
|
|
11
|
-
if (typeof window !== "undefined") {
|
|
12
|
-
window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};
|
|
13
|
-
window.__LIBERFI_VERSION__["@liberfi.io/wallet-connector-privy"] = "0.1.190";
|
|
14
|
-
}
|
|
15
|
-
var version_default = "0.1.190";
|
|
10
|
+
// src/PrivyAuthProvider.tsx
|
|
16
11
|
function PrivyAuthProvider({
|
|
17
12
|
exchangeAccessToken,
|
|
13
|
+
onError,
|
|
18
14
|
children
|
|
19
15
|
}) {
|
|
20
16
|
const {
|
|
@@ -30,20 +26,27 @@ function PrivyAuthProvider({
|
|
|
30
26
|
const [accessToken, setAccessToken] = useState(null);
|
|
31
27
|
useEffect(() => {
|
|
32
28
|
if (ready && authenticated) {
|
|
33
|
-
getAccessToken().then((token) => setPrivyAccessToken(token))
|
|
29
|
+
getAccessToken().then((token) => setPrivyAccessToken(token)).catch((error) => {
|
|
30
|
+
onError?.(error, "getAccessToken");
|
|
31
|
+
});
|
|
34
32
|
}
|
|
35
|
-
}, [ready, authenticated, getAccessToken]);
|
|
33
|
+
}, [ready, authenticated, getAccessToken, onError]);
|
|
36
34
|
useEffect(() => {
|
|
37
35
|
if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {
|
|
38
36
|
exchangeAccessToken(privyAccessToken, privyIdentityToken).then((token) => {
|
|
39
37
|
if (!token) {
|
|
38
|
+
const error = new Error(
|
|
39
|
+
"PrivyAuthProvider: exchange access token returned empty token"
|
|
40
|
+
);
|
|
41
|
+
onError?.(error, "exchangeAccessToken");
|
|
40
42
|
return;
|
|
41
43
|
}
|
|
42
44
|
setAccessToken(token);
|
|
43
45
|
}).catch((error) => {
|
|
46
|
+
onError?.(error, "exchangeAccessToken");
|
|
44
47
|
});
|
|
45
48
|
}
|
|
46
|
-
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);
|
|
49
|
+
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);
|
|
47
50
|
const status = useMemo(() => {
|
|
48
51
|
switch (walletStatus) {
|
|
49
52
|
case "detecting":
|
|
@@ -121,48 +124,41 @@ var PrivyEvmWalletAdapter = class {
|
|
|
121
124
|
);
|
|
122
125
|
return signature;
|
|
123
126
|
}
|
|
124
|
-
|
|
125
|
-
|
|
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) {
|
|
126
133
|
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
127
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");
|
|
128
152
|
const { signature } = await this.privySignTransaction(
|
|
129
|
-
|
|
130
|
-
from: tx.from ?? void 0,
|
|
131
|
-
to: tx.to ?? void 0,
|
|
132
|
-
value: tx.value,
|
|
133
|
-
gasLimit: tx.gasLimit,
|
|
134
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
135
|
-
nonce: tx.nonce,
|
|
136
|
-
data: tx.data,
|
|
137
|
-
type: tx.type ?? void 0,
|
|
138
|
-
accessList: tx.accessList ?? void 0,
|
|
139
|
-
chainId: Number(tx.chainId),
|
|
140
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
141
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
142
|
-
},
|
|
153
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
143
154
|
{ address: this.address }
|
|
144
155
|
);
|
|
145
156
|
return new Uint8Array(Buffer.from(signature.slice(2), "hex"));
|
|
146
157
|
}
|
|
147
158
|
async sendTransaction(serializedTx) {
|
|
148
159
|
if (!this.wallet) throw new Error("Wallet is not connected");
|
|
149
|
-
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
150
|
-
const tx = ethers.Transaction.from(serializedTxHex);
|
|
151
160
|
const { hash } = await this.privySendTransaction(
|
|
152
|
-
|
|
153
|
-
from: tx.from ?? void 0,
|
|
154
|
-
to: tx.to ?? void 0,
|
|
155
|
-
value: tx.value,
|
|
156
|
-
gasLimit: tx.gasLimit,
|
|
157
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
158
|
-
nonce: tx.nonce,
|
|
159
|
-
data: tx.data,
|
|
160
|
-
type: tx.type ?? void 0,
|
|
161
|
-
accessList: tx.accessList ?? void 0,
|
|
162
|
-
chainId: Number(tx.chainId),
|
|
163
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
164
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
165
|
-
},
|
|
161
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
166
162
|
{ address: this.address }
|
|
167
163
|
);
|
|
168
164
|
return hash;
|
|
@@ -226,7 +222,10 @@ var PrivySolanaWalletAdapter = class {
|
|
|
226
222
|
return getBase58Decoder().decode(signature);
|
|
227
223
|
}
|
|
228
224
|
};
|
|
229
|
-
function WalletConnectorAdapter({
|
|
225
|
+
function WalletConnectorAdapter({
|
|
226
|
+
children,
|
|
227
|
+
onError
|
|
228
|
+
}) {
|
|
230
229
|
const { ready: authReady, user, authenticated, login, logout } = usePrivy();
|
|
231
230
|
const { ready: evmReady, wallets: evmWallets } = useWallets();
|
|
232
231
|
const { ready: solanaReady, wallets: solanaWallets } = useWallets$1();
|
|
@@ -237,8 +236,15 @@ function WalletConnectorAdapter({ children }) {
|
|
|
237
236
|
const { signTransaction: signSolanaTransaction } = useSignTransaction$1();
|
|
238
237
|
const { signAndSendTransaction: signAndSendSolanaTransaction } = useSignAndSendTransaction();
|
|
239
238
|
const [isSigningIn, setIsSigningIn] = useState(false);
|
|
239
|
+
const loginRequestedRef = useRef(false);
|
|
240
240
|
const [isSigningOut, setIsSigningOut] = useState(false);
|
|
241
241
|
const logoutRequestedRef = useRef(false);
|
|
242
|
+
useEffect(() => {
|
|
243
|
+
if (loginRequestedRef.current && authenticated) {
|
|
244
|
+
loginRequestedRef.current = false;
|
|
245
|
+
setIsSigningIn(false);
|
|
246
|
+
}
|
|
247
|
+
}, [authenticated]);
|
|
242
248
|
useEffect(() => {
|
|
243
249
|
if (logoutRequestedRef.current && !authenticated) {
|
|
244
250
|
logoutRequestedRef.current = false;
|
|
@@ -273,8 +279,7 @@ function WalletConnectorAdapter({ children }) {
|
|
|
273
279
|
signAndSendSolanaTransaction
|
|
274
280
|
);
|
|
275
281
|
});
|
|
276
|
-
|
|
277
|
-
return walletAdapters;
|
|
282
|
+
return [...evmWalletAdapters, ...solanaWalletAdapters];
|
|
278
283
|
}, [
|
|
279
284
|
user?.linkedAccounts,
|
|
280
285
|
evmWallets,
|
|
@@ -300,27 +305,30 @@ function WalletConnectorAdapter({ children }) {
|
|
|
300
305
|
isSigningIn,
|
|
301
306
|
isSigningOut,
|
|
302
307
|
authenticated,
|
|
303
|
-
user
|
|
308
|
+
user
|
|
304
309
|
]);
|
|
305
310
|
const signIn = useCallback(async () => {
|
|
306
311
|
setIsSigningIn(true);
|
|
312
|
+
loginRequestedRef.current = true;
|
|
307
313
|
try {
|
|
308
314
|
login();
|
|
309
315
|
} catch (error) {
|
|
310
|
-
|
|
316
|
+
onError?.(error, "signIn");
|
|
317
|
+
loginRequestedRef.current = false;
|
|
311
318
|
setIsSigningIn(false);
|
|
312
319
|
}
|
|
313
|
-
}, [login]);
|
|
320
|
+
}, [login, onError]);
|
|
314
321
|
const signOut = useCallback(async () => {
|
|
315
322
|
setIsSigningOut(true);
|
|
316
323
|
logoutRequestedRef.current = true;
|
|
317
324
|
try {
|
|
318
325
|
logout();
|
|
319
326
|
} catch (error) {
|
|
327
|
+
onError?.(error, "signOut");
|
|
320
328
|
logoutRequestedRef.current = false;
|
|
321
329
|
setIsSigningOut(false);
|
|
322
330
|
}
|
|
323
|
-
}, [logout]);
|
|
331
|
+
}, [logout, onError]);
|
|
324
332
|
return /* @__PURE__ */ jsx(
|
|
325
333
|
WalletConnectorProvider,
|
|
326
334
|
{
|
|
@@ -336,6 +344,7 @@ function PrivyWalletConnectorProvider({
|
|
|
336
344
|
privyAppId,
|
|
337
345
|
privyClientId,
|
|
338
346
|
privyClientConfig,
|
|
347
|
+
onError,
|
|
339
348
|
children
|
|
340
349
|
}) {
|
|
341
350
|
return /* @__PURE__ */ jsx(
|
|
@@ -353,12 +362,12 @@ function PrivyWalletConnectorProvider({
|
|
|
353
362
|
},
|
|
354
363
|
...privyClientConfig
|
|
355
364
|
},
|
|
356
|
-
children: /* @__PURE__ */ jsx(WalletConnectorAdapter, { children })
|
|
365
|
+
children: /* @__PURE__ */ jsx(WalletConnectorAdapter, { onError, children })
|
|
357
366
|
}
|
|
358
367
|
);
|
|
359
368
|
}
|
|
360
369
|
PrivyWalletConnectorProvider.displayName = "PrivyWalletConnectorProvider";
|
|
361
370
|
|
|
362
|
-
export { PrivyAuthProvider, PrivyWalletConnectorProvider
|
|
371
|
+
export { PrivyAuthProvider, PrivyWalletConnectorProvider };
|
|
363
372
|
//# sourceMappingURL=index.mjs.map
|
|
364
373
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../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":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/wallet-connector-privy\"] = \"0.1.190\";\n}\n\nexport default \"0.1.190\";\n","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.
|
|
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.
|
|
18
|
+
"@liberfi.io/wallet-connector": "0.2.0"
|
|
23
19
|
},
|
|
24
20
|
"dependencies": {
|
|
25
|
-
"@liberfi.io/types": "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
|
-
"@
|
|
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
|
-
"
|
|
43
|
-
"
|
|
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": "
|
|
49
|
+
"test": "jest"
|
|
52
50
|
}
|
|
53
51
|
}
|