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-sdk';
import { PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
import {
  createSolanaRpc,
  createTransactionMessage,
  setTransactionMessageFeePayerSigner,
  setTransactionMessageLifetimeUsingBlockhash,
  appendTransactionMessageInstructions,
  pipe,
} from '@solana/kit';
import { Buffer } from 'buffer';

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 = new PublicKey("YOUR_PROGRAM_ID");

    // Example: Initialize account with custom data
    const [pda] = PublicKey.findProgramAddressSync(
      [Buffer.from("seed"), solanaSigner.publicKey.toBuffer()],
      programId
    );

    // Create instruction data (program-specific)
    const instructionData = Buffer.alloc(9);
    instructionData.writeUInt8(0, 0); // Instruction index
    instructionData.writeBigUInt64LE(BigInt(1000), 1); // Example parameter

    const instruction = new TransactionInstruction({
      keys: [
        { pubkey: solanaSigner.publicKey, isSigner: true, isWritable: true },
        { pubkey: pda, isSigner: false, isWritable: true },
        { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
      ],
      programId,
      data: instructionData,
    });

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

    const transaction = pipe(
      createTransactionMessage({ version: 0 }),
      (tx) => setTransactionMessageFeePayerSigner(solanaSigner.publicKey, tx),
      (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
      (tx) => appendTransactionMessageInstructions([instruction], tx)
    );

    const result = await signAndSendAsync({ transactions: [transaction] });

    console.log("Program call signature:", result);
    console.log("Transaction confirmed");
  };

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

Next Steps