- @solana/kit
- @solana/web3.js
- Anchor
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>
);
}
import { useParaSolana } from './hooks/useParaSolana';
import { Transaction, SystemProgram, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js';
function SendTokens() {
const { connection, signer } = useParaSolana();
const sendSOL = async (recipient: string, amount: number) => {
if (!signer) {
console.error("No signer available. Connect wallet first.");
return;
}
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: signer.sender,
toPubkey: new PublicKey(recipient),
lamports: LAMPORTS_PER_SOL * amount,
})
);
const signature = await signer.sendTransaction(transaction);
console.log("Transaction signature:", signature);
await connection.confirmTransaction(signature, "confirmed");
console.log("Transaction confirmed");
return signature;
};
return (
<button onClick={() => sendSOL("RECIPIENT_ADDRESS", 0.1)}>
Send 0.1 SOL
</button>
);
}
Send SOL and SPL tokens using
@solana-program/system and @solana-program/token:import { useParaSolanaSigner } from "@getpara/react-sdk";
import { createSolanaRpc } from "@solana/kit";
import { pipe, createTransactionMessage, setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstruction,
signAndSendTransactionMessageWithSigners } from "@solana/kit";
import { getTransferSolInstruction, lamports } from "@solana-program/system";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
function SendTokens() {
const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });
const sendSol = async (to: string, amountSol: number) => {
if (!solanaSigner) return;
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
const instruction = getTransferSolInstruction({
source: solanaSigner,
destination: to as any,
amount: lamports(BigInt(amountSol * 1e9)),
});
const tx = pipe(
createTransactionMessage({ version: 0 }),
tx => setTransactionMessageFeePayerSigner(solanaSigner, tx),
tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
tx => appendTransactionMessageInstruction(instruction, tx),
);
const signature = await signAndSendTransactionMessageWithSigners(tx);
console.log("Sent SOL:", signature);
};
if (isLoading) return <p>Loading...</p>;
return <button onClick={() => sendSol("recipient...", 0.1)}>Send 0.1 SOL</button>;
}