/** * Solana — Native Solana RPC convenience methods. * * Run: npx tsx examples/13-solana.ts */ import { Spectrum } from '@spectrumnodes/sdk'; const spectrum = new Spectrum({ api: process.env.SPECTRUM_API! }); // Example Solana addresses const WALLET = '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU'; const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'; async function main() { // --- getSlot --- const slot = await spectrum.solana.getSlot(); console.log(`Current slot: ${slot}`); // --- getBlockHeight --- const height = await spectrum.solana.getBlockHeight(); console.log(`Block height: ${height}`); // --- getBalance (in SOL) --- const balance = await spectrum.solana.getBalance(WALLET); console.log(`\nBalance: ${balance} SOL`); // --- getBalanceLamports (raw) --- const lamports = await spectrum.solana.getBalanceLamports(WALLET); console.log(`Balance: ${lamports} lamports`); // --- getAccountInfo --- const info = await spectrum.solana.getAccountInfo(WALLET); if (info) { console.log(`\nAccount owner: ${info.owner}`); console.log(` Lamports: ${info.lamports}`); console.log(` Executable: ${info.executable}`); console.log(` Space: ${info.space}`); } else { console.log('\nAccount not found'); } // --- getTokenAccountsByOwner --- const tokens = await spectrum.solana.getTokenAccountsByOwner(WALLET); console.log(`\nSPL token accounts: ${tokens.length}`); for (const t of tokens.slice(0, 5)) { const { mint, tokenAmount } = t.account.data.parsed.info; console.log(` ${mint}: ${tokenAmount.uiAmountString}`); } // --- getTokenAccountsByOwner (filter by mint) --- const usdcAccounts = await spectrum.solana.getTokenAccountsByOwner(WALLET, { mint: USDC_MINT }); console.log(`\nUSDC accounts: ${usdcAccounts.length}`); // --- getTokenSupply --- const supply = await spectrum.solana.getTokenSupply(USDC_MINT); console.log(`\nUSDC total supply: ${supply.uiAmountString}`); console.log(` Decimals: ${supply.decimals}`); // --- getTransaction --- // Use a recent signature from getSignaturesForAddress const sigs = await spectrum.solana.getSignaturesForAddress(WALLET, { limit: 1 }); if (sigs.length > 0) { const tx = await spectrum.solana.getTransaction(sigs[0].signature); if (tx) { console.log(`\nLatest tx: ${sigs[0].signature.slice(0, 20)}...`); console.log(` Slot: ${tx.slot}`); console.log(` Fee: ${tx.meta?.fee} lamports`); console.log(` Status: ${tx.meta?.err ? 'failed' : 'success'}`); } } // --- getSignaturesForAddress --- const signatures = await spectrum.solana.getSignaturesForAddress(WALLET, { limit: 5 }); console.log(`\nRecent transactions: ${signatures.length}`); for (const s of signatures) { const date = s.blockTime ? new Date(s.blockTime * 1000).toISOString() : 'unknown'; console.log(` ${s.signature.slice(0, 20)}... slot=${s.slot} ${date}`); } // --- getLatestBlockhash --- const { blockhash, lastValidBlockHeight } = await spectrum.solana.getLatestBlockhash(); console.log(`\nLatest blockhash: ${blockhash}`); console.log(` Valid until block: ${lastValidBlockHeight}`); // --- isBlockhashValid --- const valid = await spectrum.solana.isBlockhashValid(blockhash); console.log(` Still valid: ${valid}`); // --- getMinimumBalanceForRentExemption --- const rentExempt = await spectrum.solana.getMinimumBalanceForRentExemption(165); // token account size console.log( `\nRent exempt minimum (165 bytes): ${rentExempt} lamports (${rentExempt / 1e9} SOL)`, ); // --- getEpochInfo --- const epoch = await spectrum.solana.getEpochInfo(); console.log(`\nEpoch: ${epoch.epoch}`); console.log(` Slot index: ${epoch.slotIndex}/${epoch.slotsInEpoch}`); console.log(` Progress: ${((epoch.slotIndex / epoch.slotsInEpoch) * 100).toFixed(1)}%`); // --- request (raw — any Solana RPC method) --- const voteAccounts = await spectrum.solana.request({ method: 'getVoteAccounts' }); if ('result' in voteAccounts) { const result = voteAccounts.result as { current: unknown[]; delinquent: unknown[] }; console.log( `\nVote accounts: ${result.current.length} current, ${result.delinquent.length} delinquent`, ); } } main().catch(console.error);