@liberfi.io/wallet-connector-privy 0.1.191 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -15
- package/dist/index.d.mts +77 -10
- package/dist/index.d.ts +77 -10
- package/dist/index.js +57 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +57 -43
- 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,6 +56,7 @@ Authentication provider that maps Privy auth state into `AuthProvider` from `@li
|
|
|
50
56
|
| Prop | Type | Required | Description |
|
|
51
57
|
| --------------------- | -------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
58
|
| `exchangeAccessToken` | `(accessToken: string, identityToken: string) => Promise<string \| undefined \| null>` | No | Callback to exchange Privy's access token and identity token for a custom access token. If not provided, Privy's own access token is used directly. |
|
|
59
|
+
| `onError` | `(error: unknown, source: "getAccessToken" \| "exchangeAccessToken") => void` | No | Optional error callback for token retrieval / exchange failures. Defaults to `console.error` only. |
|
|
53
60
|
| `children` | `ReactNode` | — | Child components. |
|
|
54
61
|
|
|
55
62
|
### Internal Architecture (not exported)
|
|
@@ -161,14 +168,8 @@ function ConnectButton() {
|
|
|
161
168
|
|
|
162
169
|
## Future Improvements
|
|
163
170
|
|
|
164
|
-
- **Remove unused dependencies** — `package.json` lists five unused `dependencies` (`@ethereumjs/tx`, `@solana-program/memo`, `@solana-program/system`, `@solana-program/token`, `@solana/kit`) and `tsup.config.ts` has an unused `jotai` external. Remove them to reduce install size.
|
|
165
|
-
- **Error surfacing** — Add optional `onError` callbacks to both providers so callers can react to connection, auth, and token-exchange failures instead of relying on `console.error`. Also add a `.catch()` to the `getAccessToken()` call in `PrivyAuthProvider` to avoid unhandled Promise rejections.
|
|
166
|
-
- **Observable signIn/signOut status** — `login()` and `logout()` from Privy are synchronous modal openers, so the current `isSigningIn`/`isSigningOut` state flips back immediately and the `connecting`/`disconnecting` status is never observable. Use Privy's `onSuccess`/`onError` callbacks or derive status from `ready`/`authenticated` transitions instead.
|
|
167
171
|
- **Logout async behavior** — `logout()` is currently fire-and-forget due to a Privy SDK issue (`await logout` hangs). Revisit when Privy fixes the upstream behavior.
|
|
168
|
-
- **
|
|
169
|
-
- **Deduplicate EVM tx parsing** — `PrivyEvmWalletAdapter.signTransaction` and `sendTransaction` share near-identical deserialization logic; extract a private helper method.
|
|
170
|
-
- **Tests** — Add unit tests for `PrivyEvmWalletAdapter` and `PrivySolanaWalletAdapter` with mocked Privy functions; consider integration tests for the adapter component.
|
|
171
|
-
- **JSDoc** — Add JSDoc to `PrivyWalletConnectorProvider` and `PrivyWalletConnectorProviderProps` for IDE hover documentation.
|
|
172
|
+
- **Component smoke tests** — A render-time test for `PrivyWalletConnectorProvider` and `PrivyAuthProvider` would catch import-side regressions, but requires mocking the full Privy hook surface; deferred until the value justifies the maintenance.
|
|
172
173
|
|
|
173
174
|
## Related Packages
|
|
174
175
|
|
package/dist/index.d.mts
CHANGED
|
@@ -2,30 +2,97 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import { PropsWithChildren } from 'react';
|
|
3
3
|
import { PrivyClientConfig } from '@privy-io/react-auth';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.
|
|
7
|
+
* - `getAccessToken`: failed to obtain Privy's raw access token.
|
|
8
|
+
* - `exchangeAccessToken`: the consumer-supplied exchange function rejected
|
|
9
|
+
* or returned a falsy token.
|
|
10
|
+
*/
|
|
11
|
+
type PrivyAuthProviderErrorSource = "getAccessToken" | "exchangeAccessToken";
|
|
5
12
|
type PrivyAuthProviderProps = PropsWithChildren<{
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Exchange Privy's access token for a custom backend access token. If not
|
|
15
|
+
* provided, the Privy access token will be used as-is.
|
|
16
|
+
*
|
|
17
|
+
* @param accessToken - Privy's access token.
|
|
18
|
+
* @param identityToken - Privy's identity token.
|
|
19
|
+
* @returns A custom access token (string) or `null`/`undefined` to mark
|
|
20
|
+
* the exchange as failed.
|
|
21
|
+
*/
|
|
22
|
+
exchangeAccessToken?: (accessToken: string, identityToken: string) => Promise<string | undefined | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Optional error callback. Invoked when token retrieval or exchange fails.
|
|
25
|
+
* Defaults to `console.error` only — provide this to integrate with your
|
|
26
|
+
* app's notification or telemetry pipeline.
|
|
27
|
+
*/
|
|
28
|
+
onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;
|
|
12
29
|
}>;
|
|
13
30
|
/**
|
|
14
|
-
*
|
|
31
|
+
* Bridges Privy's user/token hooks into an {@link AuthProvider}.
|
|
32
|
+
*
|
|
33
|
+
* Responsibilities:
|
|
34
|
+
* - Resolves Privy's access token (and optionally exchanges it for a backend
|
|
35
|
+
* token via `exchangeAccessToken`) into the `accessToken` field of the
|
|
36
|
+
* {@link AuthenticatedUser}.
|
|
37
|
+
* - Maps the wallet-connector status into the auth status machine
|
|
38
|
+
* (`authenticating | authenticated | deauthenticating | unauthenticated`).
|
|
39
|
+
* - Forwards `connect` / `disconnect` from {@link useWalletConnector} as
|
|
40
|
+
* `signIn` / `signOut`.
|
|
41
|
+
*
|
|
42
|
+
* Must be rendered as a child of {@link PrivyWalletConnectorProvider}.
|
|
15
43
|
*/
|
|
16
|
-
declare function PrivyAuthProvider({ exchangeAccessToken, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function PrivyAuthProvider({ exchangeAccessToken, onError, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
17
45
|
declare namespace PrivyAuthProvider {
|
|
18
46
|
var displayName: string;
|
|
19
47
|
}
|
|
20
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.
|
|
51
|
+
* - `signIn`: thrown synchronously while invoking Privy's `login()`.
|
|
52
|
+
* - `signOut`: thrown synchronously while invoking Privy's `logout()`.
|
|
53
|
+
*/
|
|
54
|
+
type WalletConnectorAdapterErrorSource = "signIn" | "signOut";
|
|
55
|
+
|
|
21
56
|
type PrivyWalletConnectorProviderProps = PropsWithChildren<{
|
|
57
|
+
/** Privy application ID. */
|
|
22
58
|
privyAppId: string;
|
|
59
|
+
/** Optional Privy client ID for non-default deployments. */
|
|
23
60
|
privyClientId?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Additional Privy client configuration. Merged on top of the defaults
|
|
63
|
+
* applied here (which auto-connect external Solana wallets).
|
|
64
|
+
*/
|
|
24
65
|
privyClientConfig?: PrivyClientConfig;
|
|
66
|
+
/**
|
|
67
|
+
* Optional error callback forwarded to the inner
|
|
68
|
+
* {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out
|
|
69
|
+
* failure with the original error and a tag identifying the source.
|
|
70
|
+
* Defaults to `console.error` only.
|
|
71
|
+
*/
|
|
72
|
+
onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;
|
|
25
73
|
}>;
|
|
26
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Top-level provider wiring Privy into LiberFi's wallet-connector contract.
|
|
76
|
+
*
|
|
77
|
+
* Mount once near the React tree root, before any
|
|
78
|
+
* {@link import("@liberfi.io/wallet-connector").useWalletConnector | useWalletConnector}
|
|
79
|
+
* or {@link import("@liberfi.io/wallet-connector").useAuth | useAuth} consumer.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* <PrivyWalletConnectorProvider
|
|
84
|
+
* privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}
|
|
85
|
+
* onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}
|
|
86
|
+
* >
|
|
87
|
+
* <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>
|
|
88
|
+
* <App />
|
|
89
|
+
* </PrivyAuthProvider>
|
|
90
|
+
* </PrivyWalletConnectorProvider>
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
declare function PrivyWalletConnectorProvider({ privyAppId, privyClientId, privyClientConfig, onError, children, }: PrivyWalletConnectorProviderProps): react_jsx_runtime.JSX.Element;
|
|
27
94
|
declare namespace PrivyWalletConnectorProvider {
|
|
28
95
|
var displayName: string;
|
|
29
96
|
}
|
|
30
97
|
|
|
31
|
-
export { PrivyAuthProvider, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
|
|
98
|
+
export { PrivyAuthProvider, type PrivyAuthProviderErrorSource, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,30 +2,97 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import { PropsWithChildren } from 'react';
|
|
3
3
|
import { PrivyClientConfig } from '@privy-io/react-auth';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.
|
|
7
|
+
* - `getAccessToken`: failed to obtain Privy's raw access token.
|
|
8
|
+
* - `exchangeAccessToken`: the consumer-supplied exchange function rejected
|
|
9
|
+
* or returned a falsy token.
|
|
10
|
+
*/
|
|
11
|
+
type PrivyAuthProviderErrorSource = "getAccessToken" | "exchangeAccessToken";
|
|
5
12
|
type PrivyAuthProviderProps = PropsWithChildren<{
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Exchange Privy's access token for a custom backend access token. If not
|
|
15
|
+
* provided, the Privy access token will be used as-is.
|
|
16
|
+
*
|
|
17
|
+
* @param accessToken - Privy's access token.
|
|
18
|
+
* @param identityToken - Privy's identity token.
|
|
19
|
+
* @returns A custom access token (string) or `null`/`undefined` to mark
|
|
20
|
+
* the exchange as failed.
|
|
21
|
+
*/
|
|
22
|
+
exchangeAccessToken?: (accessToken: string, identityToken: string) => Promise<string | undefined | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Optional error callback. Invoked when token retrieval or exchange fails.
|
|
25
|
+
* Defaults to `console.error` only — provide this to integrate with your
|
|
26
|
+
* app's notification or telemetry pipeline.
|
|
27
|
+
*/
|
|
28
|
+
onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;
|
|
12
29
|
}>;
|
|
13
30
|
/**
|
|
14
|
-
*
|
|
31
|
+
* Bridges Privy's user/token hooks into an {@link AuthProvider}.
|
|
32
|
+
*
|
|
33
|
+
* Responsibilities:
|
|
34
|
+
* - Resolves Privy's access token (and optionally exchanges it for a backend
|
|
35
|
+
* token via `exchangeAccessToken`) into the `accessToken` field of the
|
|
36
|
+
* {@link AuthenticatedUser}.
|
|
37
|
+
* - Maps the wallet-connector status into the auth status machine
|
|
38
|
+
* (`authenticating | authenticated | deauthenticating | unauthenticated`).
|
|
39
|
+
* - Forwards `connect` / `disconnect` from {@link useWalletConnector} as
|
|
40
|
+
* `signIn` / `signOut`.
|
|
41
|
+
*
|
|
42
|
+
* Must be rendered as a child of {@link PrivyWalletConnectorProvider}.
|
|
15
43
|
*/
|
|
16
|
-
declare function PrivyAuthProvider({ exchangeAccessToken, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function PrivyAuthProvider({ exchangeAccessToken, onError, children, }: PrivyAuthProviderProps): react_jsx_runtime.JSX.Element;
|
|
17
45
|
declare namespace PrivyAuthProvider {
|
|
18
46
|
var displayName: string;
|
|
19
47
|
}
|
|
20
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.
|
|
51
|
+
* - `signIn`: thrown synchronously while invoking Privy's `login()`.
|
|
52
|
+
* - `signOut`: thrown synchronously while invoking Privy's `logout()`.
|
|
53
|
+
*/
|
|
54
|
+
type WalletConnectorAdapterErrorSource = "signIn" | "signOut";
|
|
55
|
+
|
|
21
56
|
type PrivyWalletConnectorProviderProps = PropsWithChildren<{
|
|
57
|
+
/** Privy application ID. */
|
|
22
58
|
privyAppId: string;
|
|
59
|
+
/** Optional Privy client ID for non-default deployments. */
|
|
23
60
|
privyClientId?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Additional Privy client configuration. Merged on top of the defaults
|
|
63
|
+
* applied here (which auto-connect external Solana wallets).
|
|
64
|
+
*/
|
|
24
65
|
privyClientConfig?: PrivyClientConfig;
|
|
66
|
+
/**
|
|
67
|
+
* Optional error callback forwarded to the inner
|
|
68
|
+
* {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out
|
|
69
|
+
* failure with the original error and a tag identifying the source.
|
|
70
|
+
* Defaults to `console.error` only.
|
|
71
|
+
*/
|
|
72
|
+
onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;
|
|
25
73
|
}>;
|
|
26
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Top-level provider wiring Privy into LiberFi's wallet-connector contract.
|
|
76
|
+
*
|
|
77
|
+
* Mount once near the React tree root, before any
|
|
78
|
+
* {@link import("@liberfi.io/wallet-connector").useWalletConnector | useWalletConnector}
|
|
79
|
+
* or {@link import("@liberfi.io/wallet-connector").useAuth | useAuth} consumer.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* <PrivyWalletConnectorProvider
|
|
84
|
+
* privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}
|
|
85
|
+
* onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}
|
|
86
|
+
* >
|
|
87
|
+
* <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>
|
|
88
|
+
* <App />
|
|
89
|
+
* </PrivyAuthProvider>
|
|
90
|
+
* </PrivyWalletConnectorProvider>
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
declare function PrivyWalletConnectorProvider({ privyAppId, privyClientId, privyClientConfig, onError, children, }: PrivyWalletConnectorProviderProps): react_jsx_runtime.JSX.Element;
|
|
27
94
|
declare namespace PrivyWalletConnectorProvider {
|
|
28
95
|
var displayName: string;
|
|
29
96
|
}
|
|
30
97
|
|
|
31
|
-
export { PrivyAuthProvider, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
|
|
98
|
+
export { PrivyAuthProvider, type PrivyAuthProviderErrorSource, type PrivyAuthProviderProps, PrivyWalletConnectorProvider, type PrivyWalletConnectorProviderProps };
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ var kit = require('@solana/kit');
|
|
|
12
12
|
// src/PrivyAuthProvider.tsx
|
|
13
13
|
function PrivyAuthProvider({
|
|
14
14
|
exchangeAccessToken,
|
|
15
|
+
onError,
|
|
15
16
|
children
|
|
16
17
|
}) {
|
|
17
18
|
const {
|
|
@@ -27,20 +28,27 @@ function PrivyAuthProvider({
|
|
|
27
28
|
const [accessToken, setAccessToken] = react.useState(null);
|
|
28
29
|
react.useEffect(() => {
|
|
29
30
|
if (ready && authenticated) {
|
|
30
|
-
getAccessToken().then((token) => setPrivyAccessToken(token))
|
|
31
|
+
getAccessToken().then((token) => setPrivyAccessToken(token)).catch((error) => {
|
|
32
|
+
onError?.(error, "getAccessToken");
|
|
33
|
+
});
|
|
31
34
|
}
|
|
32
|
-
}, [ready, authenticated, getAccessToken]);
|
|
35
|
+
}, [ready, authenticated, getAccessToken, onError]);
|
|
33
36
|
react.useEffect(() => {
|
|
34
37
|
if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {
|
|
35
38
|
exchangeAccessToken(privyAccessToken, privyIdentityToken).then((token) => {
|
|
36
39
|
if (!token) {
|
|
40
|
+
const error = new Error(
|
|
41
|
+
"PrivyAuthProvider: exchange access token returned empty token"
|
|
42
|
+
);
|
|
43
|
+
onError?.(error, "exchangeAccessToken");
|
|
37
44
|
return;
|
|
38
45
|
}
|
|
39
46
|
setAccessToken(token);
|
|
40
47
|
}).catch((error) => {
|
|
48
|
+
onError?.(error, "exchangeAccessToken");
|
|
41
49
|
});
|
|
42
50
|
}
|
|
43
|
-
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);
|
|
51
|
+
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);
|
|
44
52
|
const status = react.useMemo(() => {
|
|
45
53
|
switch (walletStatus) {
|
|
46
54
|
case "detecting":
|
|
@@ -118,48 +126,41 @@ var PrivyEvmWalletAdapter = class {
|
|
|
118
126
|
);
|
|
119
127
|
return signature;
|
|
120
128
|
}
|
|
121
|
-
|
|
122
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Parse a serialized EVM transaction into the field shape Privy's
|
|
131
|
+
* `signTransaction` / `sendTransaction` hooks accept. Centralized here so
|
|
132
|
+
* the two callers stay in sync when the field set evolves.
|
|
133
|
+
*/
|
|
134
|
+
serializedTxToPrivyTx(serializedTx) {
|
|
123
135
|
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
124
136
|
const tx = ethers.ethers.Transaction.from(serializedTxHex);
|
|
137
|
+
return {
|
|
138
|
+
from: tx.from ?? void 0,
|
|
139
|
+
to: tx.to ?? void 0,
|
|
140
|
+
value: tx.value,
|
|
141
|
+
gasLimit: tx.gasLimit,
|
|
142
|
+
gasPrice: tx.gasPrice ?? void 0,
|
|
143
|
+
nonce: tx.nonce,
|
|
144
|
+
data: tx.data,
|
|
145
|
+
type: tx.type ?? void 0,
|
|
146
|
+
accessList: tx.accessList ?? void 0,
|
|
147
|
+
chainId: Number(tx.chainId),
|
|
148
|
+
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
149
|
+
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async signTransaction(serializedTx) {
|
|
153
|
+
if (!this.wallet) throw new Error("Wallet is not connected");
|
|
125
154
|
const { signature } = await this.privySignTransaction(
|
|
126
|
-
|
|
127
|
-
from: tx.from ?? void 0,
|
|
128
|
-
to: tx.to ?? void 0,
|
|
129
|
-
value: tx.value,
|
|
130
|
-
gasLimit: tx.gasLimit,
|
|
131
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
132
|
-
nonce: tx.nonce,
|
|
133
|
-
data: tx.data,
|
|
134
|
-
type: tx.type ?? void 0,
|
|
135
|
-
accessList: tx.accessList ?? void 0,
|
|
136
|
-
chainId: Number(tx.chainId),
|
|
137
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
138
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
139
|
-
},
|
|
155
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
140
156
|
{ address: this.address }
|
|
141
157
|
);
|
|
142
158
|
return new Uint8Array(Buffer.from(signature.slice(2), "hex"));
|
|
143
159
|
}
|
|
144
160
|
async sendTransaction(serializedTx) {
|
|
145
161
|
if (!this.wallet) throw new Error("Wallet is not connected");
|
|
146
|
-
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
147
|
-
const tx = ethers.ethers.Transaction.from(serializedTxHex);
|
|
148
162
|
const { hash } = await this.privySendTransaction(
|
|
149
|
-
|
|
150
|
-
from: tx.from ?? void 0,
|
|
151
|
-
to: tx.to ?? void 0,
|
|
152
|
-
value: tx.value,
|
|
153
|
-
gasLimit: tx.gasLimit,
|
|
154
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
155
|
-
nonce: tx.nonce,
|
|
156
|
-
data: tx.data,
|
|
157
|
-
type: tx.type ?? void 0,
|
|
158
|
-
accessList: tx.accessList ?? void 0,
|
|
159
|
-
chainId: Number(tx.chainId),
|
|
160
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
161
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
162
|
-
},
|
|
163
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
163
164
|
{ address: this.address }
|
|
164
165
|
);
|
|
165
166
|
return hash;
|
|
@@ -223,7 +224,10 @@ var PrivySolanaWalletAdapter = class {
|
|
|
223
224
|
return kit.getBase58Decoder().decode(signature);
|
|
224
225
|
}
|
|
225
226
|
};
|
|
226
|
-
function WalletConnectorAdapter({
|
|
227
|
+
function WalletConnectorAdapter({
|
|
228
|
+
children,
|
|
229
|
+
onError
|
|
230
|
+
}) {
|
|
227
231
|
const { ready: authReady, user, authenticated, login, logout } = reactAuth.usePrivy();
|
|
228
232
|
const { ready: evmReady, wallets: evmWallets } = reactAuth.useWallets();
|
|
229
233
|
const { ready: solanaReady, wallets: solanaWallets } = solana.useWallets();
|
|
@@ -234,8 +238,15 @@ function WalletConnectorAdapter({ children }) {
|
|
|
234
238
|
const { signTransaction: signSolanaTransaction } = solana.useSignTransaction();
|
|
235
239
|
const { signAndSendTransaction: signAndSendSolanaTransaction } = solana.useSignAndSendTransaction();
|
|
236
240
|
const [isSigningIn, setIsSigningIn] = react.useState(false);
|
|
241
|
+
const loginRequestedRef = react.useRef(false);
|
|
237
242
|
const [isSigningOut, setIsSigningOut] = react.useState(false);
|
|
238
243
|
const logoutRequestedRef = react.useRef(false);
|
|
244
|
+
react.useEffect(() => {
|
|
245
|
+
if (loginRequestedRef.current && authenticated) {
|
|
246
|
+
loginRequestedRef.current = false;
|
|
247
|
+
setIsSigningIn(false);
|
|
248
|
+
}
|
|
249
|
+
}, [authenticated]);
|
|
239
250
|
react.useEffect(() => {
|
|
240
251
|
if (logoutRequestedRef.current && !authenticated) {
|
|
241
252
|
logoutRequestedRef.current = false;
|
|
@@ -270,8 +281,7 @@ function WalletConnectorAdapter({ children }) {
|
|
|
270
281
|
signAndSendSolanaTransaction
|
|
271
282
|
);
|
|
272
283
|
});
|
|
273
|
-
|
|
274
|
-
return walletAdapters;
|
|
284
|
+
return [...evmWalletAdapters, ...solanaWalletAdapters];
|
|
275
285
|
}, [
|
|
276
286
|
user?.linkedAccounts,
|
|
277
287
|
evmWallets,
|
|
@@ -297,27 +307,30 @@ function WalletConnectorAdapter({ children }) {
|
|
|
297
307
|
isSigningIn,
|
|
298
308
|
isSigningOut,
|
|
299
309
|
authenticated,
|
|
300
|
-
user
|
|
310
|
+
user
|
|
301
311
|
]);
|
|
302
312
|
const signIn = react.useCallback(async () => {
|
|
303
313
|
setIsSigningIn(true);
|
|
314
|
+
loginRequestedRef.current = true;
|
|
304
315
|
try {
|
|
305
316
|
login();
|
|
306
317
|
} catch (error) {
|
|
307
|
-
|
|
318
|
+
onError?.(error, "signIn");
|
|
319
|
+
loginRequestedRef.current = false;
|
|
308
320
|
setIsSigningIn(false);
|
|
309
321
|
}
|
|
310
|
-
}, [login]);
|
|
322
|
+
}, [login, onError]);
|
|
311
323
|
const signOut = react.useCallback(async () => {
|
|
312
324
|
setIsSigningOut(true);
|
|
313
325
|
logoutRequestedRef.current = true;
|
|
314
326
|
try {
|
|
315
327
|
logout();
|
|
316
328
|
} catch (error) {
|
|
329
|
+
onError?.(error, "signOut");
|
|
317
330
|
logoutRequestedRef.current = false;
|
|
318
331
|
setIsSigningOut(false);
|
|
319
332
|
}
|
|
320
|
-
}, [logout]);
|
|
333
|
+
}, [logout, onError]);
|
|
321
334
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
322
335
|
walletConnector.WalletConnectorProvider,
|
|
323
336
|
{
|
|
@@ -333,6 +346,7 @@ function PrivyWalletConnectorProvider({
|
|
|
333
346
|
privyAppId,
|
|
334
347
|
privyClientId,
|
|
335
348
|
privyClientConfig,
|
|
349
|
+
onError,
|
|
336
350
|
children
|
|
337
351
|
}) {
|
|
338
352
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -350,7 +364,7 @@ function PrivyWalletConnectorProvider({
|
|
|
350
364
|
},
|
|
351
365
|
...privyClientConfig
|
|
352
366
|
},
|
|
353
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(WalletConnectorAdapter, { children })
|
|
367
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(WalletConnectorAdapter, { onError, children })
|
|
354
368
|
}
|
|
355
369
|
);
|
|
356
370
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["useWalletConnector","usePrivy","useUser","useIdentityToken","useState","useEffect","useMemo","useCallback","jsx","AuthProvider","ChainNamespace","ethers","Chain","getBase58Decoder","useWallets","useSolanaWallets","useSignMessage","useSignTransaction","useSendTransaction","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useRef","WalletConnectorProvider","PrivyProvider","toSolanaWalletConnectors"],"mappings":"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","file":"index.js","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /** exchange privy's access token for a custom access token, if not provided, the privy's access token will be used as is */\n exchangeAccessToken?: (\n /** privy's access token */\n accessToken: string,\n /** privy's identity token */\n identityToken: string,\n ) => Promise<string | undefined | null>;\n}>;\n\n/**\n * PrivyAuthProvider must be a child of PrivyWalletConnectorProvider\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken().then((token) => setPrivyAccessToken(token));\n }\n }, [ready, authenticated, getAccessToken]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n console.error(\"PrivyAuthProvider: exchange access token failed\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n console.debug(\"[PrivyAuthProvider] building user:\", {\n privyUser: privyUser?.id,\n linkedAccounts: privyUser?.linkedAccounts?.map(\n (a) => `${a.type}:${(a as any).chainType ?? \"n/a\"}`,\n ),\n privyAccessToken: !!privyAccessToken,\n accessToken: !!accessToken,\n hasExchangeFn: !!exchangeAccessToken,\n walletCount: wallets.length,\n });\n\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n const { signature } = await this.privySignTransaction(\n {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n },\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n const { hash } = await this.privySendTransaction(\n {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n },\n { address: this.address },\n );\n return hash;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\nexport function WalletConnectorAdapter({ children }: PropsWithChildren) {\n // privy authentication states\n const { ready: authReady, user, authenticated, login, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated , or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n const walletAdapters = [...evmWalletAdapters, ...solanaWalletAdapters];\n return walletAdapters;\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user?.linkedAccounts,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n try {\n login();\n } catch (error) {\n // TODO make error human readable\n console.error(error);\n } finally {\n setIsSigningIn(false);\n }\n }, [login]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n logout();\n } catch (error) {\n console.error(error);\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorAdapter } from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n privyAppId: string;\n privyClientId?: string;\n privyClientConfig?: PrivyClientConfig;\n}>;\n\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter>{children}</WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["useWalletConnector","usePrivy","useUser","useIdentityToken","useState","useEffect","useMemo","useCallback","jsx","AuthProvider","ChainNamespace","ethers","Chain","getBase58Decoder","useWallets","useSolanaWallets","useSignMessage","useSignTransaction","useSendTransaction","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useRef","WalletConnectorProvider","PrivyProvider","toSolanaWalletConnectors"],"mappings":"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","file":"index.js","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, login, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -10,6 +10,7 @@ import { getBase58Decoder } from '@solana/kit';
|
|
|
10
10
|
// src/PrivyAuthProvider.tsx
|
|
11
11
|
function PrivyAuthProvider({
|
|
12
12
|
exchangeAccessToken,
|
|
13
|
+
onError,
|
|
13
14
|
children
|
|
14
15
|
}) {
|
|
15
16
|
const {
|
|
@@ -25,20 +26,27 @@ function PrivyAuthProvider({
|
|
|
25
26
|
const [accessToken, setAccessToken] = useState(null);
|
|
26
27
|
useEffect(() => {
|
|
27
28
|
if (ready && authenticated) {
|
|
28
|
-
getAccessToken().then((token) => setPrivyAccessToken(token))
|
|
29
|
+
getAccessToken().then((token) => setPrivyAccessToken(token)).catch((error) => {
|
|
30
|
+
onError?.(error, "getAccessToken");
|
|
31
|
+
});
|
|
29
32
|
}
|
|
30
|
-
}, [ready, authenticated, getAccessToken]);
|
|
33
|
+
}, [ready, authenticated, getAccessToken, onError]);
|
|
31
34
|
useEffect(() => {
|
|
32
35
|
if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {
|
|
33
36
|
exchangeAccessToken(privyAccessToken, privyIdentityToken).then((token) => {
|
|
34
37
|
if (!token) {
|
|
38
|
+
const error = new Error(
|
|
39
|
+
"PrivyAuthProvider: exchange access token returned empty token"
|
|
40
|
+
);
|
|
41
|
+
onError?.(error, "exchangeAccessToken");
|
|
35
42
|
return;
|
|
36
43
|
}
|
|
37
44
|
setAccessToken(token);
|
|
38
45
|
}).catch((error) => {
|
|
46
|
+
onError?.(error, "exchangeAccessToken");
|
|
39
47
|
});
|
|
40
48
|
}
|
|
41
|
-
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken]);
|
|
49
|
+
}, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);
|
|
42
50
|
const status = useMemo(() => {
|
|
43
51
|
switch (walletStatus) {
|
|
44
52
|
case "detecting":
|
|
@@ -116,48 +124,41 @@ var PrivyEvmWalletAdapter = class {
|
|
|
116
124
|
);
|
|
117
125
|
return signature;
|
|
118
126
|
}
|
|
119
|
-
|
|
120
|
-
|
|
127
|
+
/**
|
|
128
|
+
* Parse a serialized EVM transaction into the field shape Privy's
|
|
129
|
+
* `signTransaction` / `sendTransaction` hooks accept. Centralized here so
|
|
130
|
+
* the two callers stay in sync when the field set evolves.
|
|
131
|
+
*/
|
|
132
|
+
serializedTxToPrivyTx(serializedTx) {
|
|
121
133
|
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
122
134
|
const tx = ethers.Transaction.from(serializedTxHex);
|
|
135
|
+
return {
|
|
136
|
+
from: tx.from ?? void 0,
|
|
137
|
+
to: tx.to ?? void 0,
|
|
138
|
+
value: tx.value,
|
|
139
|
+
gasLimit: tx.gasLimit,
|
|
140
|
+
gasPrice: tx.gasPrice ?? void 0,
|
|
141
|
+
nonce: tx.nonce,
|
|
142
|
+
data: tx.data,
|
|
143
|
+
type: tx.type ?? void 0,
|
|
144
|
+
accessList: tx.accessList ?? void 0,
|
|
145
|
+
chainId: Number(tx.chainId),
|
|
146
|
+
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
147
|
+
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async signTransaction(serializedTx) {
|
|
151
|
+
if (!this.wallet) throw new Error("Wallet is not connected");
|
|
123
152
|
const { signature } = await this.privySignTransaction(
|
|
124
|
-
|
|
125
|
-
from: tx.from ?? void 0,
|
|
126
|
-
to: tx.to ?? void 0,
|
|
127
|
-
value: tx.value,
|
|
128
|
-
gasLimit: tx.gasLimit,
|
|
129
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
130
|
-
nonce: tx.nonce,
|
|
131
|
-
data: tx.data,
|
|
132
|
-
type: tx.type ?? void 0,
|
|
133
|
-
accessList: tx.accessList ?? void 0,
|
|
134
|
-
chainId: Number(tx.chainId),
|
|
135
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
136
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
137
|
-
},
|
|
153
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
138
154
|
{ address: this.address }
|
|
139
155
|
);
|
|
140
156
|
return new Uint8Array(Buffer.from(signature.slice(2), "hex"));
|
|
141
157
|
}
|
|
142
158
|
async sendTransaction(serializedTx) {
|
|
143
159
|
if (!this.wallet) throw new Error("Wallet is not connected");
|
|
144
|
-
const serializedTxHex = "0x" + Buffer.from(serializedTx).toString("hex");
|
|
145
|
-
const tx = ethers.Transaction.from(serializedTxHex);
|
|
146
160
|
const { hash } = await this.privySendTransaction(
|
|
147
|
-
|
|
148
|
-
from: tx.from ?? void 0,
|
|
149
|
-
to: tx.to ?? void 0,
|
|
150
|
-
value: tx.value,
|
|
151
|
-
gasLimit: tx.gasLimit,
|
|
152
|
-
gasPrice: tx.gasPrice ?? void 0,
|
|
153
|
-
nonce: tx.nonce,
|
|
154
|
-
data: tx.data,
|
|
155
|
-
type: tx.type ?? void 0,
|
|
156
|
-
accessList: tx.accessList ?? void 0,
|
|
157
|
-
chainId: Number(tx.chainId),
|
|
158
|
-
maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? void 0,
|
|
159
|
-
maxFeePerGas: tx.maxFeePerGas ?? void 0
|
|
160
|
-
},
|
|
161
|
+
this.serializedTxToPrivyTx(serializedTx),
|
|
161
162
|
{ address: this.address }
|
|
162
163
|
);
|
|
163
164
|
return hash;
|
|
@@ -221,7 +222,10 @@ var PrivySolanaWalletAdapter = class {
|
|
|
221
222
|
return getBase58Decoder().decode(signature);
|
|
222
223
|
}
|
|
223
224
|
};
|
|
224
|
-
function WalletConnectorAdapter({
|
|
225
|
+
function WalletConnectorAdapter({
|
|
226
|
+
children,
|
|
227
|
+
onError
|
|
228
|
+
}) {
|
|
225
229
|
const { ready: authReady, user, authenticated, login, logout } = usePrivy();
|
|
226
230
|
const { ready: evmReady, wallets: evmWallets } = useWallets();
|
|
227
231
|
const { ready: solanaReady, wallets: solanaWallets } = useWallets$1();
|
|
@@ -232,8 +236,15 @@ function WalletConnectorAdapter({ children }) {
|
|
|
232
236
|
const { signTransaction: signSolanaTransaction } = useSignTransaction$1();
|
|
233
237
|
const { signAndSendTransaction: signAndSendSolanaTransaction } = useSignAndSendTransaction();
|
|
234
238
|
const [isSigningIn, setIsSigningIn] = useState(false);
|
|
239
|
+
const loginRequestedRef = useRef(false);
|
|
235
240
|
const [isSigningOut, setIsSigningOut] = useState(false);
|
|
236
241
|
const logoutRequestedRef = useRef(false);
|
|
242
|
+
useEffect(() => {
|
|
243
|
+
if (loginRequestedRef.current && authenticated) {
|
|
244
|
+
loginRequestedRef.current = false;
|
|
245
|
+
setIsSigningIn(false);
|
|
246
|
+
}
|
|
247
|
+
}, [authenticated]);
|
|
237
248
|
useEffect(() => {
|
|
238
249
|
if (logoutRequestedRef.current && !authenticated) {
|
|
239
250
|
logoutRequestedRef.current = false;
|
|
@@ -268,8 +279,7 @@ function WalletConnectorAdapter({ children }) {
|
|
|
268
279
|
signAndSendSolanaTransaction
|
|
269
280
|
);
|
|
270
281
|
});
|
|
271
|
-
|
|
272
|
-
return walletAdapters;
|
|
282
|
+
return [...evmWalletAdapters, ...solanaWalletAdapters];
|
|
273
283
|
}, [
|
|
274
284
|
user?.linkedAccounts,
|
|
275
285
|
evmWallets,
|
|
@@ -295,27 +305,30 @@ function WalletConnectorAdapter({ children }) {
|
|
|
295
305
|
isSigningIn,
|
|
296
306
|
isSigningOut,
|
|
297
307
|
authenticated,
|
|
298
|
-
user
|
|
308
|
+
user
|
|
299
309
|
]);
|
|
300
310
|
const signIn = useCallback(async () => {
|
|
301
311
|
setIsSigningIn(true);
|
|
312
|
+
loginRequestedRef.current = true;
|
|
302
313
|
try {
|
|
303
314
|
login();
|
|
304
315
|
} catch (error) {
|
|
305
|
-
|
|
316
|
+
onError?.(error, "signIn");
|
|
317
|
+
loginRequestedRef.current = false;
|
|
306
318
|
setIsSigningIn(false);
|
|
307
319
|
}
|
|
308
|
-
}, [login]);
|
|
320
|
+
}, [login, onError]);
|
|
309
321
|
const signOut = useCallback(async () => {
|
|
310
322
|
setIsSigningOut(true);
|
|
311
323
|
logoutRequestedRef.current = true;
|
|
312
324
|
try {
|
|
313
325
|
logout();
|
|
314
326
|
} catch (error) {
|
|
327
|
+
onError?.(error, "signOut");
|
|
315
328
|
logoutRequestedRef.current = false;
|
|
316
329
|
setIsSigningOut(false);
|
|
317
330
|
}
|
|
318
|
-
}, [logout]);
|
|
331
|
+
}, [logout, onError]);
|
|
319
332
|
return /* @__PURE__ */ jsx(
|
|
320
333
|
WalletConnectorProvider,
|
|
321
334
|
{
|
|
@@ -331,6 +344,7 @@ function PrivyWalletConnectorProvider({
|
|
|
331
344
|
privyAppId,
|
|
332
345
|
privyClientId,
|
|
333
346
|
privyClientConfig,
|
|
347
|
+
onError,
|
|
334
348
|
children
|
|
335
349
|
}) {
|
|
336
350
|
return /* @__PURE__ */ jsx(
|
|
@@ -348,7 +362,7 @@ function PrivyWalletConnectorProvider({
|
|
|
348
362
|
},
|
|
349
363
|
...privyClientConfig
|
|
350
364
|
},
|
|
351
|
-
children: /* @__PURE__ */ jsx(WalletConnectorAdapter, { children })
|
|
365
|
+
children: /* @__PURE__ */ jsx(WalletConnectorAdapter, { onError, children })
|
|
352
366
|
}
|
|
353
367
|
);
|
|
354
368
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["ChainNamespace","Chain","usePrivy","useSolanaWallets","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useState","useEffect","useMemo","useCallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\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.4.
|
|
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
|
}
|