@liberfi.io/wallet-connector-privy 1.1.37 → 1.1.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -271,7 +271,7 @@ function WalletConnectorAdapter({
271
271
  children,
272
272
  onError
273
273
  }) {
274
- const { ready: authReady, user, authenticated, login, logout } = reactAuth.usePrivy();
274
+ const { ready: authReady, user, authenticated, logout } = reactAuth.usePrivy();
275
275
  const { ready: evmReady, wallets: evmWallets } = reactAuth.useWallets();
276
276
  const { ready: solanaReady, wallets: solanaWallets } = solana.useWallets();
277
277
  const { signMessage: signEvmMessage } = reactAuth.useSignMessage();
@@ -284,6 +284,18 @@ function WalletConnectorAdapter({
284
284
  const loginRequestedRef = react.useRef(false);
285
285
  const [isSigningOut, setIsSigningOut] = react.useState(false);
286
286
  const logoutRequestedRef = react.useRef(false);
287
+ const { login } = reactAuth.useLogin({
288
+ onComplete: () => {
289
+ loginRequestedRef.current = false;
290
+ setIsSigningIn(false);
291
+ },
292
+ onError: (error) => {
293
+ loginRequestedRef.current = false;
294
+ setIsSigningIn(false);
295
+ if (String(error) === "exited_auth_flow") return;
296
+ onError?.(error, "signIn");
297
+ }
298
+ });
287
299
  react.useEffect(() => {
288
300
  if (loginRequestedRef.current && authenticated) {
289
301
  loginRequestedRef.current = false;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["useWalletConnector","usePrivy","useUser","useIdentityToken","useState","useEffect","useMemo","useCallback","jsx","AuthProvider","ChainNamespace","ethers","Chain","getBase58Decoder","useWallets","useSolanaWallets","useSignMessage","useSignTransaction","useSendTransaction","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useRef","WalletConnectorProvider","PrivyProvider","toSolanaWalletConnectors"],"mappings":"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","file":"index.js","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n 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"]}
1
+ {"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["useWalletConnector","usePrivy","useUser","useIdentityToken","useState","useEffect","useMemo","useCallback","jsx","AuthProvider","ChainNamespace","ethers","Chain","getBase58Decoder","useWallets","useSolanaWallets","useSignMessage","useSignTransaction","useSendTransaction","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useRef","useLogin","WalletConnectorProvider","PrivyProvider","toSolanaWalletConnectors"],"mappings":"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","file":"index.js","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useLogin,\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Use Privy's `useLogin` (instead of `usePrivy().login`) so we can observe the\n // login flow's completion AND failure. The failure path is critical: when the\n // user dismisses/cancels the Privy modal, Privy resolves the flow with an\n // error (`exited_auth_flow`) and `authenticated` never flips to true. Without\n // clearing `isSigningIn` here, the status would stay stuck on\n // `connecting` -> `authenticating` forever.\n const { login } = useLogin({\n onComplete: () => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n },\n onError: (error) => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n // User-initiated cancellation is not a real failure — don't surface it.\n if (String(error) === \"exited_auth_flow\") return;\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n },\n });\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useState, useEffect, useMemo, useCallback, useRef } from 'react';
2
- import { usePrivy, useUser, useIdentityToken, PrivyProvider, useWallets, useSignMessage, useSignTransaction, useSendTransaction } from '@privy-io/react-auth';
2
+ import { usePrivy, useUser, useIdentityToken, PrivyProvider, useWallets, useSignMessage, useSignTransaction, useSendTransaction, useLogin } from '@privy-io/react-auth';
3
3
  import { useWalletConnector, AuthProvider, WalletConnectorProvider } from '@liberfi.io/wallet-connector';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
  import { ethers } from 'ethers';
@@ -269,7 +269,7 @@ function WalletConnectorAdapter({
269
269
  children,
270
270
  onError
271
271
  }) {
272
- const { ready: authReady, user, authenticated, login, logout } = usePrivy();
272
+ const { ready: authReady, user, authenticated, logout } = usePrivy();
273
273
  const { ready: evmReady, wallets: evmWallets } = useWallets();
274
274
  const { ready: solanaReady, wallets: solanaWallets } = useWallets$1();
275
275
  const { signMessage: signEvmMessage } = useSignMessage();
@@ -282,6 +282,18 @@ function WalletConnectorAdapter({
282
282
  const loginRequestedRef = useRef(false);
283
283
  const [isSigningOut, setIsSigningOut] = useState(false);
284
284
  const logoutRequestedRef = useRef(false);
285
+ const { login } = useLogin({
286
+ onComplete: () => {
287
+ loginRequestedRef.current = false;
288
+ setIsSigningIn(false);
289
+ },
290
+ onError: (error) => {
291
+ loginRequestedRef.current = false;
292
+ setIsSigningIn(false);
293
+ if (String(error) === "exited_auth_flow") return;
294
+ onError?.(error, "signIn");
295
+ }
296
+ });
285
297
  useEffect(() => {
286
298
  if (loginRequestedRef.current && authenticated) {
287
299
  loginRequestedRef.current = false;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["ChainNamespace","Chain","usePrivy","useSolanaWallets","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useState","useEffect","useMemo","useCallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n 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"]}
1
+ {"version":3,"sources":["../src/PrivyAuthProvider.tsx","../src/PrivyEvmWalletAdapter.ts","../src/PrivySolanaWalletAdapter.ts","../src/WalletConnectorAdapter.tsx","../src/PrivyWalletConnectorProvider.tsx"],"names":["ChainNamespace","Chain","usePrivy","useSolanaWallets","useSolanaSignMessage","useSolanaSignTransaction","useSolanaSignAndSendTransaction","useState","useEffect","useMemo","useCallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useIdentityToken, usePrivy, useUser } from \"@privy-io/react-auth\";\nimport {\n AuthenticatedUser,\n AuthProvider,\n useWalletConnector,\n} from \"@liberfi.io/wallet-connector\";\n\n/**\n * Source of an error surfaced by {@link PrivyAuthProvider}'s `onError`.\n * - `getAccessToken`: failed to obtain Privy's raw access token.\n * - `exchangeAccessToken`: the consumer-supplied exchange function rejected\n * or returned a falsy token.\n */\nexport type PrivyAuthProviderErrorSource =\n | \"getAccessToken\"\n | \"exchangeAccessToken\";\n\nexport type PrivyAuthProviderProps = PropsWithChildren<{\n /**\n * Exchange Privy's access token for a custom backend access token. If not\n * provided, the Privy access token will be used as-is.\n *\n * @param accessToken - Privy's access token.\n * @param identityToken - Privy's identity token.\n * @returns A custom access token (string) or `null`/`undefined` to mark\n * the exchange as failed.\n */\n exchangeAccessToken?: (\n accessToken: string,\n identityToken: string,\n ) => Promise<string | undefined | null>;\n\n /**\n * Optional error callback. Invoked when token retrieval or exchange fails.\n * Defaults to `console.error` only — provide this to integrate with your\n * app's notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: PrivyAuthProviderErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's user/token hooks into an {@link AuthProvider}.\n *\n * Responsibilities:\n * - Resolves Privy's access token (and optionally exchanges it for a backend\n * token via `exchangeAccessToken`) into the `accessToken` field of the\n * {@link AuthenticatedUser}.\n * - Maps the wallet-connector status into the auth status machine\n * (`authenticating | authenticated | deauthenticating | unauthenticated`).\n * - Forwards `connect` / `disconnect` from {@link useWalletConnector} as\n * `signIn` / `signOut`.\n *\n * Must be rendered as a child of {@link PrivyWalletConnectorProvider}.\n */\nexport function PrivyAuthProvider({\n exchangeAccessToken,\n onError,\n children,\n}: PrivyAuthProviderProps) {\n const {\n wallets,\n status: walletStatus,\n connect,\n disconnect,\n } = useWalletConnector();\n\n const { ready, authenticated, getAccessToken } = usePrivy();\n\n const { user: privyUser, refreshUser } = useUser();\n\n const { identityToken: privyIdentityToken } = useIdentityToken();\n\n // privy access token\n const [privyAccessToken, setPrivyAccessToken] = useState<string | null>(null);\n\n // exchanged access token\n const [accessToken, setAccessToken] = useState<string | null>(null);\n\n // fetch privy's access token when user is authenticated\n useEffect(() => {\n if (ready && authenticated) {\n getAccessToken()\n .then((token) => setPrivyAccessToken(token))\n .catch((error) => {\n console.error(\"PrivyAuthProvider: getAccessToken error\", error);\n onError?.(error, \"getAccessToken\");\n });\n }\n }, [ready, authenticated, getAccessToken, onError]);\n\n // exchange custom access token when privy's access token & identity token is available or changed\n useEffect(() => {\n if (privyAccessToken && privyIdentityToken && exchangeAccessToken) {\n exchangeAccessToken(privyAccessToken, privyIdentityToken)\n .then((token) => {\n if (!token) {\n const error = new Error(\n \"PrivyAuthProvider: exchange access token returned empty token\",\n );\n console.error(error.message);\n onError?.(error, \"exchangeAccessToken\");\n return;\n }\n setAccessToken(token);\n })\n .catch((error) => {\n console.error(\n \"PrivyAuthProvider: exchange access token error\",\n error,\n );\n onError?.(error, \"exchangeAccessToken\");\n });\n }\n }, [privyAccessToken, privyIdentityToken, exchangeAccessToken, onError]);\n\n const status = useMemo(() => {\n switch (walletStatus) {\n case \"detecting\":\n return \"authenticating\";\n case \"connecting\":\n return \"authenticating\";\n case \"connected\":\n return \"authenticated\";\n case \"disconnecting\":\n return \"deauthenticating\";\n case \"disconnected\":\n return \"unauthenticated\";\n }\n }, [walletStatus]);\n\n const user = useMemo<AuthenticatedUser | null>(() => {\n if (!privyUser) return null;\n\n // if exchangeAccessToken is provided, use the exchanged access token, otherwise use the privy's access token\n const userAccessToken = exchangeAccessToken\n ? accessToken\n : privyAccessToken;\n\n if (!userAccessToken) return null;\n\n return {\n id: privyUser.id,\n accessToken: userAccessToken,\n wallets,\n };\n }, [privyUser, privyAccessToken, accessToken, exchangeAccessToken, wallets]);\n\n const refreshAccessToken = useCallback(async () => {\n await refreshUser();\n }, [refreshUser]);\n\n return (\n <AuthProvider\n user={user}\n status={status}\n signIn={connect}\n signOut={disconnect}\n refreshAccessToken={refreshAccessToken}\n >\n {children}\n </AuthProvider>\n );\n}\n\nPrivyAuthProvider.displayName = \"PrivyAuthProvider\";\n","import {\n ConnectedWallet,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport { ethers } from \"ethers\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n Eip1193Provider,\n EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\n\nexport class PrivyEvmWalletAdapter implements EvmWalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySendTransaction: ReturnType<\n typeof useSendTransaction\n >[\"sendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.EVM;\n }\n\n get chain(): Chain | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, chainId] = privyChainId.split(\":\");\n return chainId as Chain;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage(\n { message },\n { address: this.address },\n );\n return signature;\n }\n\n /**\n * Parse a serialized EVM transaction into the field shape Privy's\n * `signTransaction` / `sendTransaction` hooks accept. Centralized here so\n * the two callers stay in sync when the field set evolves.\n */\n private serializedTxToPrivyTx(serializedTx: Uint8Array) {\n const serializedTxHex = \"0x\" + Buffer.from(serializedTx).toString(\"hex\");\n const tx = ethers.Transaction.from(serializedTxHex);\n return {\n from: tx.from ?? undefined,\n to: tx.to ?? undefined,\n value: tx.value,\n gasLimit: tx.gasLimit,\n gasPrice: tx.gasPrice ?? undefined,\n nonce: tx.nonce,\n data: tx.data,\n type: tx.type ?? undefined,\n accessList: tx.accessList ?? undefined,\n chainId: Number(tx.chainId),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? undefined,\n maxFeePerGas: tx.maxFeePerGas ?? undefined,\n };\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return new Uint8Array(Buffer.from(signature.slice(2), \"hex\"));\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n this.serializedTxToPrivyTx(serializedTx),\n { address: this.address },\n );\n return hash;\n }\n\n /**\n * Send an unsigned EVM transaction described by its target fields\n * (chainId / to / data / value). Resolves with the broadcast tx hash.\n *\n * Unlike {@link sendTransaction}, callers do not need to ABI-encode\n * and serialize the tx — Privy fills in gas / nonce / type on the\n * caller's behalf. Use this when the upstream service (e.g. Relay)\n * already returned the payload as plain fields.\n *\n * Contract: this method does NOT switch chains. Callers MUST switch\n * the wallet to `tx.chainId` before invoking and (optionally) restore\n * the previous chain after — keeping chain orchestration in one place.\n */\n async sendEvmTx(tx: {\n chainId: number;\n to: string;\n data: string;\n value: string;\n }): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { hash } = await this.privySendTransaction(\n {\n to: tx.to,\n data: tx.data,\n value: BigInt(tx.value),\n chainId: tx.chainId,\n },\n { address: this.address },\n );\n return hash;\n }\n\n /** Returns the wallet's current chain id, parsed from `wallet.chainId`. */\n getChainId(): number | undefined {\n const privyChainId = this.wallet?.chainId;\n if (!privyChainId) return undefined;\n const [, chainId] = privyChainId.split(\":\");\n const parsed = Number(chainId);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n async getEip1193Provider(): Promise<Eip1193Provider | undefined> {\n return await this.wallet?.getEthereumProvider();\n }\n\n async switchChain(chain: Chain): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(Number(chain));\n }\n\n /**\n * Numeric-chain-id variant of {@link switchChain}. Useful when the\n * caller already has a numeric chain id (e.g. from a Relay quote)\n * and doesn't want to go through the {@link Chain} enum.\n */\n async switchChainId(chainId: number): Promise<void> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n await this.wallet.switchChain(chainId);\n }\n}\n","import { WalletWithMetadata } from \"@privy-io/react-auth\";\nimport {\n ConnectedStandardSolanaWallet,\n useSignMessage,\n useSignTransaction,\n useSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { getBase58Decoder } from \"@solana/kit\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\nexport class PrivySolanaWalletAdapter implements WalletAdapter {\n constructor(\n private readonly account: WalletWithMetadata,\n private readonly wallet: ConnectedStandardSolanaWallet | undefined,\n private readonly privySignMessage: ReturnType<\n typeof useSignMessage\n >[\"signMessage\"],\n private readonly privySignTransaction: ReturnType<\n typeof useSignTransaction\n >[\"signTransaction\"],\n private readonly privySignAndSendTransaction: ReturnType<\n typeof useSignAndSendTransaction\n >[\"signAndSendTransaction\"],\n ) {}\n\n get chainNamespace(): ChainNamespace {\n return ChainNamespace.SOLANA;\n }\n\n get chain(): Chain | undefined {\n return Chain.SOLANA;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get isConnected(): boolean {\n return !!this.wallet;\n }\n\n get isCustodial(): boolean {\n return this.account.delegated;\n }\n\n get connector(): string {\n return this.account.walletClientType ?? \"privy\";\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignMessage({\n message: new TextEncoder().encode(message),\n wallet: this.wallet,\n });\n return Buffer.from(signature).toString(\"base64\");\n }\n\n async signTransaction(serializedTx: Uint8Array): Promise<Uint8Array> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signedTransaction } = await this.privySignTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return signedTransaction;\n }\n\n async sendTransaction(serializedTx: Uint8Array): Promise<string> {\n if (!this.wallet) throw new Error(\"Wallet is not connected\");\n const { signature } = await this.privySignAndSendTransaction({\n transaction: serializedTx,\n wallet: this.wallet,\n });\n return getBase58Decoder().decode(signature);\n }\n}\n","import {\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useLogin,\n usePrivy,\n useSendTransaction,\n useSignMessage,\n useSignTransaction,\n useWallets,\n WalletWithMetadata,\n} from \"@privy-io/react-auth\";\nimport {\n useWallets as useSolanaWallets,\n useSignMessage as useSolanaSignMessage,\n useSignTransaction as useSolanaSignTransaction,\n useSignAndSendTransaction as useSolanaSignAndSendTransaction,\n} from \"@privy-io/react-auth/solana\";\nimport { WalletConnectorProvider } from \"@liberfi.io/wallet-connector\";\nimport { PrivyEvmWalletAdapter } from \"./PrivyEvmWalletAdapter\";\nimport { PrivySolanaWalletAdapter } from \"./PrivySolanaWalletAdapter\";\n\n/**\n * Source of an error surfaced by {@link WalletConnectorAdapter}'s `onError`.\n * - `signIn`: thrown synchronously while invoking Privy's `login()`.\n * - `signOut`: thrown synchronously while invoking Privy's `logout()`.\n */\nexport type WalletConnectorAdapterErrorSource = \"signIn\" | \"signOut\";\n\nexport type WalletConnectorAdapterProps = PropsWithChildren<{\n /**\n * Optional error callback. Invoked for any sign-in / sign-out failure with\n * the original error and a tag identifying the source. Defaults to\n * `console.error` only — provide this to integrate with your app's\n * notification or telemetry pipeline.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Bridges Privy's wallet hooks into a {@link WalletConnectorProvider}.\n *\n * Responsibilities:\n * - Aggregates the user's owned EVM and Solana wallets from Privy's\n * `linkedAccounts` and pairs them with their connected sessions.\n * - Maps Privy's `ready` / `authenticated` / `isSigningIn` / `isSigningOut`\n * states into the wallet-connector status machine\n * (`detecting | connecting | connected | disconnecting | disconnected`).\n * - Exposes `connect` and `disconnect` callbacks backed by Privy's\n * `login()` and `logout()`. Both are deliberately **not awaited** because\n * Privy's modal-based flows resolve asynchronously via state changes;\n * `useEffect`s here observe `authenticated` to clear the in-flight\n * `connecting` / `disconnecting` flags.\n *\n * Used internally by {@link PrivyWalletConnectorProvider}; consumers\n * should not render this component directly.\n */\nexport function WalletConnectorAdapter({\n children,\n onError,\n}: WalletConnectorAdapterProps) {\n // privy authentication states\n const { ready: authReady, user, authenticated, logout } = usePrivy();\n\n // all connected evm wallets, may not be owned by the user\n const { ready: evmReady, wallets: evmWallets } = useWallets();\n\n // all connected solana wallets, may not be owned by the user\n const { ready: solanaReady, wallets: solanaWallets } = useSolanaWallets();\n\n // privy's evm sign message\n const { signMessage: signEvmMessage } = useSignMessage();\n\n // privy's evm sign transaction\n const { signTransaction: signEvmTransaction } = useSignTransaction();\n\n // privy's evm send transaction\n const { sendTransaction: sendEvmTransaction } = useSendTransaction();\n\n // privy's solana sign message\n const { signMessage: signSolanaMessage } = useSolanaSignMessage();\n\n // privy's solana sign transaction\n const { signTransaction: signSolanaTransaction } = useSolanaSignTransaction();\n\n // privy's solana send transaction\n const { signAndSendTransaction: signAndSendSolanaTransaction } =\n useSolanaSignAndSendTransaction();\n\n // is signing in to privy, this is the step of connecting to a wallet\n const [isSigningIn, setIsSigningIn] = useState(false);\n const loginRequestedRef = useRef(false);\n\n // is signing out from privy, this is the step of disconnecting from all wallets\n const [isSigningOut, setIsSigningOut] = useState(false);\n const logoutRequestedRef = useRef(false);\n\n // Use Privy's `useLogin` (instead of `usePrivy().login`) so we can observe the\n // login flow's completion AND failure. The failure path is critical: when the\n // user dismisses/cancels the Privy modal, Privy resolves the flow with an\n // error (`exited_auth_flow`) and `authenticated` never flips to true. Without\n // clearing `isSigningIn` here, the status would stay stuck on\n // `connecting` -> `authenticating` forever.\n const { login } = useLogin({\n onComplete: () => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n },\n onError: (error) => {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n // User-initiated cancellation is not a real failure — don't surface it.\n if (String(error) === \"exited_auth_flow\") return;\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n },\n });\n\n // Clear isSigningIn when Privy's authenticated state actually flips to true.\n useEffect(() => {\n if (loginRequestedRef.current && authenticated) {\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [authenticated]);\n\n // Clear isSigningOut when Privy's authenticated state actually flips to false.\n useEffect(() => {\n if (logoutRequestedRef.current && !authenticated) {\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [authenticated]);\n\n // all wallets that can be used to take onchain actions when connected\n const wallets = useMemo(() => {\n // unauthenticated, or user has no wallets\n if (!user?.linkedAccounts) return [];\n\n // owned evm wallets\n const evmWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"ethereum\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = evmWallets.find((w) => w.address === account.address);\n return new PrivyEvmWalletAdapter(\n account,\n wallet,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n );\n });\n\n // owned solana wallets\n const solanaWalletAdapters = user.linkedAccounts\n .filter(\n (it) =>\n it.type === \"wallet\" &&\n (it as WalletWithMetadata).chainType === \"solana\",\n )\n .map((it) => {\n const account = it as WalletWithMetadata;\n const wallet = solanaWallets.find((w) => w.address === account.address);\n return new PrivySolanaWalletAdapter(\n account,\n wallet,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n );\n });\n\n return [...evmWalletAdapters, ...solanaWalletAdapters];\n }, [\n user?.linkedAccounts,\n evmWallets,\n solanaWallets,\n signEvmMessage,\n signEvmTransaction,\n sendEvmTransaction,\n signSolanaMessage,\n signSolanaTransaction,\n signAndSendSolanaTransaction,\n ]);\n\n // wallet connector status\n const status = useMemo(() => {\n // is detecting authentication status\n if (!authReady) return \"detecting\";\n // is detecting connected wallets\n if (!evmReady || !solanaReady) return \"detecting\";\n // is signing in to privy, this is the step of connecting to a wallet\n if (isSigningIn) return \"connecting\";\n // is signing out from privy, this is the step of disconnecting from all wallets\n if (isSigningOut) return \"disconnecting\";\n // is not authenticated, can't connect any wallets\n if (!authenticated || !user) return \"disconnected\";\n // is authenticated, but no wallets are connected\n return \"connected\";\n }, [\n authReady,\n evmReady,\n solanaReady,\n isSigningIn,\n isSigningOut,\n authenticated,\n user,\n ]);\n\n const signIn = useCallback(async () => {\n setIsSigningIn(true);\n loginRequestedRef.current = true;\n try {\n // Don't await — Privy's login() opens a modal and resolves asynchronously.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n login();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signIn error\", error);\n onError?.(error, \"signIn\");\n loginRequestedRef.current = false;\n setIsSigningIn(false);\n }\n }, [login, onError]);\n\n const signOut = useCallback(async () => {\n setIsSigningOut(true);\n logoutRequestedRef.current = true;\n try {\n // Don't await — Privy's logout() hangs when awaited.\n // Cleanup is handled by the useEffect that watches `authenticated`.\n logout();\n } catch (error) {\n console.error(\"WalletConnectorAdapter: signOut error\", error);\n onError?.(error, \"signOut\");\n logoutRequestedRef.current = false;\n setIsSigningOut(false);\n }\n }, [logout, onError]);\n\n return (\n <WalletConnectorProvider\n status={status}\n // all user's wallets, which can be used to take onchain actions when connected\n wallets={wallets}\n // connect to the first wallet by signing in to privy\n connect={signIn}\n // disconnect from all wallets by signing out from privy\n disconnect={signOut}\n >\n {children}\n </WalletConnectorProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PrivyProvider, type PrivyClientConfig } from \"@privy-io/react-auth\";\nimport { toSolanaWalletConnectors } from \"@privy-io/react-auth/solana\";\nimport {\n WalletConnectorAdapter,\n type WalletConnectorAdapterErrorSource,\n} from \"./WalletConnectorAdapter\";\n\nexport type PrivyWalletConnectorProviderProps = PropsWithChildren<{\n /** Privy application ID. */\n privyAppId: string;\n /** Optional Privy client ID for non-default deployments. */\n privyClientId?: string;\n /**\n * Additional Privy client configuration. Merged on top of the defaults\n * applied here (which auto-connect external Solana wallets).\n */\n privyClientConfig?: PrivyClientConfig;\n /**\n * Optional error callback forwarded to the inner\n * {@link WalletConnectorAdapter}. Invoked for any sign-in / sign-out\n * failure with the original error and a tag identifying the source.\n * Defaults to `console.error` only.\n */\n onError?: (error: unknown, source: WalletConnectorAdapterErrorSource) => void;\n}>;\n\n/**\n * Top-level provider wiring Privy into LiberFi's wallet-connector contract.\n *\n * Mount once near the React tree root, before any\n * {@link import(\"@liberfi.io/wallet-connector\").useWalletConnector | useWalletConnector}\n * or {@link import(\"@liberfi.io/wallet-connector\").useAuth | useAuth} consumer.\n *\n * @example\n * ```tsx\n * <PrivyWalletConnectorProvider\n * privyAppId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}\n * onError={(error, source) => toast.error(`${source} failed: ${String(error)}`)}\n * >\n * <PrivyAuthProvider exchangeAccessToken={exchangeAccessToken}>\n * <App />\n * </PrivyAuthProvider>\n * </PrivyWalletConnectorProvider>\n * ```\n */\nexport function PrivyWalletConnectorProvider({\n privyAppId,\n privyClientId,\n privyClientConfig,\n onError,\n children,\n}: PrivyWalletConnectorProviderProps) {\n return (\n <PrivyProvider\n appId={privyAppId}\n clientId={privyClientId}\n config={{\n externalWallets: {\n solana: {\n connectors: toSolanaWalletConnectors({\n shouldAutoConnect: true,\n }),\n },\n },\n ...privyClientConfig,\n }}\n >\n <WalletConnectorAdapter onError={onError}>\n {children}\n </WalletConnectorAdapter>\n </PrivyProvider>\n );\n}\n\nPrivyWalletConnectorProvider.displayName = \"PrivyWalletConnectorProvider\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/wallet-connector-privy",
3
- "version": "1.1.37",
3
+ "version": "1.1.39",
4
4
  "description": "Privy wallet connector for Liberfi React SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -15,10 +15,10 @@
15
15
  "ethers": "^6.15.0",
16
16
  "react": ">=18",
17
17
  "react-dom": ">=18",
18
- "@liberfi.io/wallet-connector": "0.2.39"
18
+ "@liberfi.io/wallet-connector": "0.2.41"
19
19
  },
20
20
  "dependencies": {
21
- "@liberfi.io/types": "0.4.40"
21
+ "@liberfi.io/types": "0.4.42"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@privy-io/react-auth": "^3.16.0",
@@ -37,8 +37,8 @@
37
37
  "ts-jest": "^29.4.6",
38
38
  "tsup": "^8.5.0",
39
39
  "typescript": "^5.9.2",
40
- "@liberfi.io/wallet-connector": "0.2.39",
41
- "tsconfig": "0.1.223"
40
+ "@liberfi.io/wallet-connector": "0.2.41",
41
+ "tsconfig": "0.1.225"
42
42
  },
43
43
  "publishConfig": {
44
44
  "access": "public"