Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Solana development skill covering @solana/kit v5, Anchor programs, LiteSVM testing, and security patterns.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/kit/react.md
1---2title: React Hooks Reference3description: Low-level wallet hooks from @solana/react for wallet selection, signing, and transaction sending in React apps.4---56# Solana Kit React Reference78`@solana/react` provides low-level wallet hooks for Solana Kit.910## Setup1112```tsx13import {14SelectedWalletAccountContextProvider,15useSelectedWalletAccount,16useSignAndSendTransaction,17} from '@solana/react';18```1920## Provider2122```tsx23const STORAGE_KEY = 'wallet-account';2425function App() {26return (27<SelectedWalletAccountContextProvider28filterWallet={(wallet) => wallet.accounts.length > 0}29stateSync={{30getSelectedWallet: () => localStorage.getItem(STORAGE_KEY),31storeSelectedWallet: (k) => localStorage.setItem(STORAGE_KEY, k),32deleteSelectedWallet: () => localStorage.removeItem(STORAGE_KEY),33}}34>35<YourApp />36</SelectedWalletAccountContextProvider>37);38}39```4041## Wallet Selection4243```tsx44function WalletSelector() {45const [account, setAccount, wallets] = useSelectedWalletAccount();4647if (!account) {48return (49<div>50{wallets.map((wallet) => (51<div key={wallet.name}>52{wallet.accounts.map((acc) => (53<button key={acc.address} onClick={() => setAccount(acc)}>54{wallet.name}: {acc.address.slice(0, 8)}...55</button>56))}57</div>58))}59</div>60);61}6263return (64<div>65<p>Connected: {account.address}</p>66<button onClick={() => setAccount(undefined)}>Disconnect</button>67</div>68);69}70```7172## Sign In With Solana7374```tsx75const signIn = useSignIn(wallet);7677const handleSignIn = async () => {78const { account, signedMessage, signature } = await signIn({79requestId: csrfToken,80});81// Verify on server82};83```8485## Sign Message8687```tsx88const signMessage = useSignMessage(account);8990const { signature, signedMessage } = await signMessage({91message: new TextEncoder().encode('Hello'),92});93```9495## Sign Transaction9697```tsx98const signTx = useSignTransaction(account, 'solana:devnet');99100const { signedTransaction } = await signTx({101transaction: txBytes,102options: { minContextSlot },103});104```105106## Sign & Send107108```tsx109const signAndSend = useSignAndSendTransaction(account, 'solana:devnet');110111const { signature } = await signAndSend({ transaction: txBytes });112const base58Sig = getBase58Decoder().decode(signature);113```114115## Transaction Signer Hook116117```tsx118const signer = useWalletAccountTransactionSendingSigner(account, 'solana:devnet');119120const message = pipe(121createTransactionMessage({ version: 0 }),122m => setTransactionMessageFeePayerSigner(signer, m),123m => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),124m => appendTransactionMessageInstruction(instruction, m),125);126127const sig = await signAndSendTransactionMessageWithSigners(message);128```129130## Chain Identifiers131132```ts133'solana:mainnet'134'solana:devnet'135'solana:testnet'136'solana:localnet'137```138139## Signer Types140141| Hook | Returns |142|------|---------|143| `useWalletAccountMessageSigner` | `MessageModifyingSigner` |144| `useWalletAccountTransactionSigner` | `TransactionModifyingSigner` |145| `useWalletAccountTransactionSendingSigner` | `TransactionSendingSigner` |146147All return modifying signers (wallets may modify before signing).148149## Complete Example150151```tsx152function App() {153return (154<SelectedWalletAccountContextProvider155filterWallet={(w) => w.accounts.length > 0}156stateSync={{157getSelectedWallet: () => localStorage.getItem('wallet'),158storeSelectedWallet: (k) => localStorage.setItem('wallet', k),159deleteSelectedWallet: () => localStorage.removeItem('wallet'),160}}161>162<WalletApp />163</SelectedWalletAccountContextProvider>164);165}166167function WalletApp() {168const [account, setAccount, wallets] = useSelectedWalletAccount();169const signAndSend = useSignAndSendTransaction(account, 'solana:devnet');170171if (!account) {172return wallets.map((w) =>173w.accounts.map((a) => (174<button key={a.address} onClick={() => setAccount(a)}>175{w.name}: {a.address.slice(0, 8)}...176</button>177))178);179}180181return (182<div>183<p>{account.address}</p>184<button onClick={() => setAccount(undefined)}>Disconnect</button>185</div>186);187}188```