Skip to main content
Transfer SOL tokens between wallets using Para’s integrated signers with different Solana libraries.
import { useParaSolanaSigner, useParaSolanaSignAndSend } from '@getpara/react-sdk';
import { Address } from '@solana/addresses';
import {
  createSolanaRpc,
  createTransactionMessage,
  setTransactionMessageFeePayer,
  setTransactionMessageLifetimeUsingBlockhash,
  appendTransactionMessageInstruction,
  lamports,
  pipe,
} from '@solana/kit';
import { getTransferSolInstruction } from '@solana-program/system';

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

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

  const sendSOL = async (recipient: string, amount: number) => {
    if (!solanaSigner) return;

    const response = await rpc.getLatestBlockhash().send();
    const { blockhash, lastValidBlockHeight } = response.value;

    const transferInstruction = getTransferSolInstruction({
      source: solanaSigner,
      destination: recipient as Address,
      amount: lamports(BigInt(Math.floor(amount * Number(LAMPORTS_PER_SOL)))),
    });

    const transaction = pipe(
      createTransactionMessage({ version: "legacy" }),
      (tx) => setTransactionMessageFeePayer(solanaSigner.address, tx),
      (tx) => setTransactionMessageLifetimeUsingBlockhash({ blockhash, lastValidBlockHeight }, tx),
      (tx) => appendTransactionMessageInstruction(transferInstruction, tx)
    );

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

    return result;
  };

  return (
    <button onClick={() => sendSOL("RECIPIENT_ADDRESS", 0.1)}>
      Send 0.1 SOL
    </button>
  );
}

Next Steps