/** * RPC — Direct JSON-RPC proxy to chain nodes. * * Run: npx tsx examples/11-rpc.ts */ import { Spectrum } from '@spectrumnodes/sdk'; const spectrum = new Spectrum({ api: process.env.SPECTRUM_API! }); interface BlockSummary { number: string; transactions: unknown[]; gasUsed: string; } async function main() { // --- send (shorthand — returns just the result) --- const blockNumber = await spectrum.rpc.send('ethereum', 'eth_blockNumber'); console.log(`Block number: ${parseInt(blockNumber, 16)}`); const gasPrice = await spectrum.rpc.send('ethereum', 'eth_gasPrice'); console.log(`Gas price: ${parseInt(gasPrice, 16)} wei`); // --- send with params --- const balance = await spectrum.rpc.send('ethereum', 'eth_getBalance', [ '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', 'latest', ]); console.log(`Vitalik balance: ${parseInt(balance, 16) / 1e18} ETH`); // --- request (full JSON-RPC response object) --- const blockResponse = await spectrum.rpc.request('ethereum', { method: 'eth_getBlockByNumber', params: ['latest', false], }); if ('result' in blockResponse && blockResponse.result) { const block = blockResponse.result as BlockSummary; console.log(`\nLatest block: ${parseInt(block.number, 16)}`); console.log(` Transactions: ${block.transactions.length}`); console.log(` Gas used: ${parseInt(block.gasUsed, 16)}`); } // --- requestBatch (multiple calls in one round-trip) --- const results = await spectrum.rpc.requestBatch('ethereum', [ { method: 'eth_blockNumber' }, { method: 'eth_gasPrice' }, { method: 'eth_chainId' }, { method: 'net_version' }, ]); console.log('\nBatch RPC results:'); for (const r of results) { if ('result' in r) { console.log(` id=${r.id}: ${r.result}`); } } // --- Advanced: trace a block (requires archive node) --- try { const trace = await spectrum.rpc.send('ethereum', 'trace_block', ['latest']); console.log(`\nBlock trace: ${JSON.stringify(trace).slice(0, 200)}...`); } catch { console.log('\ntrace_block not supported on this node (requires archive/trace node)'); } // --- Works with any EVM chain --- const polyBlock = await spectrum.rpc.send('polygon', 'eth_blockNumber'); console.log(`\nPolygon block: ${parseInt(polyBlock, 16)}`); const arbBlock = await spectrum.rpc.send('arbitrum', 'eth_blockNumber'); console.log(`Arbitrum block: ${parseInt(arbBlock, 16)}`); } main().catch(console.error);