Skip to main content
Interact with Solana programs by calling instructions and working with Anchor IDLs. This guide covers manual instruction creation and Anchor’s type-safe program interaction.
import { useParaSolanaSigner, useParaSolanaSignAndSend } from "@getpara/react-native-wallet/solana";
import { Address } from '@solana/addresses';
import {
  createSolanaRpc,
  createTransactionMessage,
  setTransactionMessageFeePayer,
  setTransactionMessageLifetimeUsingBlockhash,
  appendTransactionMessageInstruction,
  pipe,
} from '@solana/kit';
import { getTransferSolInstruction } from '@solana-program/system';

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

function InteractWithProgram() {
  const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });
  const { signAndSendAsync, isPending } = useParaSolanaSignAndSend(solanaSigner);

  const callProgram = async () => {
    if (!solanaSigner) {
      console.error("No signer available. Connect wallet first.");
      return;
    }

    const programId = "YOUR_PROGRAM_ID" as Address;

    // Create instruction data (program-specific)
    const instructionData = new Uint8Array(9);
    instructionData[0] = 0; // Instruction index
    const view = new DataView(instructionData.buffer);
    view.setBigUint64(1, BigInt(1000), true); // Example parameter

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

    const transactionMessage = pipe(
      createTransactionMessage({ version: 0 }),
      (tx) => setTransactionMessageFeePayer(solanaSigner.address, tx),
      (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
      (tx) => appendTransactionMessageInstruction(
        {
          programAddress: programId,
          accounts: [
            { address: solanaSigner.address, role: 3 /* WritableSigner */ },
          ],
          data: instructionData,
        },
        tx
      )
    );

    const signature = await signAndSendAsync({ transactionMessage });
    console.log("Program call signature:", signature);
  };

  return <button onClick={callProgram}>Call Program</button>;
}

Next Steps