> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getpara.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Setup Solana Libraries

> Install and configure Solana libraries for use with Para SDK

export const Link = ({href, label, newTab = false}) => {
  const [isHovered, setIsHovered] = useState(false);
  return <a href={href} target={newTab ? '_blank' : '_self'} rel={newTab ? 'noopener noreferrer' : undefined} className="not-prose inline-block relative text-black font-semibold cursor-pointer border-b-0 no-underline" onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}>
      {label}
      <span className={`absolute left-0 bottom-0 w-full rounded-sm bg-gradient-to-r from-orange-600 to-purple-600 transition-all duration-300 ${isHovered ? 'h-0.5' : 'h-px'}`} />
    </a>;
};

Para supports multiple Solana libraries. Choose your library below.

## Prerequisites

<Card title="Para SDK Setup Required" description="You must have Para SDK installed and configured before setting up Solana libraries" href="/v3/react/setup/nextjs" horizontal />

<Tabs>
  <Tab title="@solana/kit">
    The modern Solana library with the `@solana/signers` interface. Recommended for new projects.

    ## Install

    ```bash theme={null}
    npm install @getpara/react-sdk @solana/kit
    ```

    <Info>`@getpara/react-sdk` bundles `@getpara/solana-signers-v2-integration` — no separate integration package needed.</Info>

    ## Usage

    <Tabs>
      <Tab title="Hook (React)">
        Use the <Link label="useParaSolanaSigner" href="/v3/react/guides/hooks/use-para-solana-signer" /> hook to create a Solana signer for your user's Para embedded wallet or external wallet. The <Link label="useParaSolanaSignAndSend" href="/v3/react/guides/hooks/use-para-solana-sign-and-send" /> hook wraps transaction signing in a React Query mutation.

        ```tsx theme={null}
        import { useParaSolanaSigner } from "@getpara/react-sdk";
        import { createSolanaRpc } from "@solana/kit";

        const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");

        function SolanaExample() {
          const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });

          if (isLoading) return <p>Loading...</p>;
          return <p>Address: {solanaSigner?.address}</p>;
        }
        ```

        ### Wallet Resolution

        When no `address` or `walletId` is passed, the hook resolves the wallet in this order:

        1. **Selected wallet** — if the user selected a Solana wallet in the UI. If there is only one Solana wallet in the session, it is already selected by default
        2. **First Solana wallet** — the first available Solana wallet on the account

        To target a specific wallet:

        ```tsx theme={null}
        const { solanaSigner } = useParaSolanaSigner({ rpc, address: "SoLaNa..." });
        ```
      </Tab>

      <Tab title="Direct (Non-React)">
        Use `createParaSolanaSigner` to create a signer directly.

        ```typescript theme={null}
        import { createParaSolanaSigner } from "@getpara/solana-signers-v2-integration";
        import { createSolanaRpc } from "@solana/kit";

        const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
        const signer = createParaSolanaSigner({ para, rpc });
        console.log("Address:", signer.address);
        ```

        ### Wallet Resolution

        When no `address` or `walletId` is passed, the factory picks the first available Solana wallet.
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="@solana/web3.js">
    The legacy Solana Web3.js library. Use for compatibility with existing projects.

    ## Install

    ```bash theme={null}
    npm install @getpara/solana-web3.js-v1-integration @solana/web3.js
    ```

    <Warning>There is no built-in hook for `@solana/web3.js` — use the constructor directly or create a custom hook.</Warning>

    ## Usage

    ```typescript theme={null}
    import { ParaSolanaWeb3Signer } from "@getpara/solana-web3.js-v1-integration";
    import { Connection, clusterApiUrl } from "@solana/web3.js";

    const connection = new Connection(clusterApiUrl("mainnet-beta"));
    const signer = new ParaSolanaWeb3Signer(para, connection);
    ```
  </Tab>

  <Tab title="Anchor">
    For interacting with Anchor programs using modern Codama-generated clients. Uses the same `useParaSolanaSigner` hook — no separate Anchor integration needed.

    <Info>
      [Codama](https://github.com/solana-program/codama) generates type-safe TypeScript clients from Anchor IDLs that work natively with `@solana/kit` and `@solana/signers`. Your Para signer is already compatible.
    </Info>

    ## Install

    ```bash theme={null}
    npm install @getpara/react-sdk @solana/kit
    ```

    Then generate your program client with Codama:

    ```bash theme={null}
    npx codama idl path/to/your_program.json -o src/generated
    ```

    ## Usage

    <Tabs>
      <Tab title="Hook (React)">
        Use `useParaSolanaSigner` — the returned signer works directly with Codama-generated instructions. Wallet resolution is the same as the @solana/kit tab.

        ```tsx theme={null}
        import { useParaSolanaSigner } from "@getpara/react-sdk";
        import { createSolanaRpc } from "@solana/kit";
        import { pipe, createTransactionMessage, setTransactionMessageFeePayerSigner,
          setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstruction } from "@solana/transactions";
        import { getInitializeInstruction } from "./generated";

        const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");

        function AnchorProgramInteraction() {
          const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });

          const callProgram = async () => {
            if (!solanaSigner) return;

            const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

            const instruction = getInitializeInstruction({
              user: solanaSigner,
            });

            const transactionMessage = pipe(
              createTransactionMessage({ version: 0 }),
              tx => setTransactionMessageFeePayerSigner(solanaSigner, tx),
              tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
              tx => appendTransactionMessageInstruction(instruction, tx),
            );

            // Sign and send using the signer
          };

          if (isLoading) return <p>Loading...</p>;
          return <button onClick={callProgram}>Call Program</button>;
        }
        ```
      </Tab>

      <Tab title="Direct (Non-React)">
        ```typescript theme={null}
        import { createParaSolanaSigner } from "@getpara/solana-signers-v2-integration";
        import { createSolanaRpc } from "@solana/kit";
        import { getInitializeInstruction } from "./generated";

        const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
        const signer = createParaSolanaSigner({ para, rpc });

        const instruction = getInitializeInstruction({
          user: signer,
        });
        ```
      </Tab>
    </Tabs>
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={3}>
  <Card title="Sign Messages" description="Sign text and binary messages with Solana" href="/v3/react/guides/web3-operations/solana/sign-messages" icon="signature" />

  <Card title="Execute Transactions" description="Create and send Solana transactions" href="/v3/react/guides/web3-operations/solana/execute-transactions" icon="paper-plane" />

  <Card title="Query Balances" description="Check SOL and token balances" href="/v3/react/guides/web3-operations/solana/query-balances" icon="wallet" />
</CardGroup>
