# Solana Ecosystem Tools Guide ## Helius (Best Solana RPC) ```bash npm install helius-sdk ``` ```typescript import { Helius } from "helius-sdk" const helius = new Helius("YOUR_API_KEY") // Register at helius.dev, free tier is sufficient for development // Get all assets for a wallet (NFT + Token) const assets = await helius.rpc.getAssetsByOwner({ ownerAddress: "wallet_address", page: 1, limit: 100, }) // DAS (Digital Asset Standard) query for NFT metadata const asset = await helius.rpc.getAsset({ id: "mint_address" }) // Parse transactions (human-readable) const tx = await helius.rpc.parseTransaction({ transactions: ["tx_signature"] }) // Returns: { type: "SWAP", swapData: {...}, tokenTransfers: [...] } // Webhook (listen for address activity) const webhook = await helius.createWebhook({ accountAddresses: ["wallet_address"], transactionTypes: ["ANY"], webhookURL: "https://your-server.com/webhook", }) ``` --- ## Metaplex (Solana NFT Standard) ```bash npm install @metaplex-foundation/mpl-token-metadata npm install @metaplex-foundation/umi @metaplex-foundation/umi-bundle-defaults ``` ```typescript import { createUmi } from "@metaplex-foundation/umi-bundle-defaults" import { mplTokenMetadata, createNft, fetchMetadataFromSeeds } from "@metaplex-foundation/mpl-token-metadata" import { generateSigner, percentAmount } from "@metaplex-foundation/umi" import { walletAdapterIdentity } from "@metaplex-foundation/umi-signer-wallet-adapters" const umi = createUmi("https://api.mainnet-beta.solana.com") .use(walletAdapterIdentity(wallet)) .use(mplTokenMetadata()) // Mint NFT const mint = generateSigner(umi) await createNft(umi, { mint, name: "My NFT", uri: "https://arweave.net/xxx/metadata.json", sellerFeeBasisPoints: percentAmount(5), // 5% royalty creators: [{ address: umi.identity.publicKey, verified: true, share: 100 }], }).sendAndConfirm(umi) // Read NFT metadata const metadata = await fetchMetadataFromSeeds(umi, { mint: mint.publicKey }) console.log(metadata.name, metadata.uri) ``` ### Candy Machine V3 (Batch Mint) ```typescript import { mplCandyMachine, create, mintV2 } from "@metaplex-foundation/mpl-candy-machine" // Create Candy Machine const candyMachine = generateSigner(umi) await create(umi, { candyMachine, collectionMint: collectionMint.publicKey, collectionUpdateAuthority: umi.identity, itemsAvailable: 10000, guards: { solPayment: { lamports: sol(0.1), destination: treasury }, startDate: { date: new Date("2024-01-01") }, mintLimit: { id: 1, limit: 3 }, // Max 3 per wallet }, }).sendAndConfirm(umi) // User mint await mintV2(umi, { candyMachine: candyMachine.publicKey, ... }).sendAndConfirm(umi) ``` --- ## Jupiter (Solana DEX Aggregator) ```bash npm install @jup-ag/api ``` ```typescript import { createJupiterApiClient } from "@jup-ag/api" import { Connection, VersionedTransaction } from "@solana/web3.js" const jupiterApi = createJupiterApiClient() // 1. Get best route const quote = await jupiterApi.quoteGet({ inputMint: "So11111111111111111111111111111111111111112", // SOL outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC amount: 1_000_000_000, // 1 SOL (lamports) slippageBps: 50, // 0.5% }) console.log("Expected output:", quote.outAmount, "USDC") // 2. Execute Swap const swapResult = await jupiterApi.swapPost({ swapRequest: { quoteResponse: quote, userPublicKey: wallet.publicKey.toString(), wrapAndUnwrapSol: true, } }) const swapTx = VersionedTransaction.deserialize( Buffer.from(swapResult.swapTransaction, "base64") ) swapTx.sign([wallet]) const txId = await connection.sendRawTransaction(swapTx.serialize()) ``` --- ## Solana Pay (Payment Protocol) ```typescript import { encodeURL, createTransfer, validateTransfer } from "@solana/pay" import { PublicKey } from "@solana/web3.js" import BigNumber from "bignumber.js" // Generate payment URL (display as QR code) const url = encodeURL({ recipient: new PublicKey("your_wallet"), amount: new BigNumber(1), // 1 USDC splToken: new PublicKey("USDC_MINT"), reference: new PublicKey(reference), // Used for tracking label: "My Store", message: "Order #123", }) // Verify payment const { amount, reference } = parseURL(url) const response = await findReference(connection, reference) await validateTransfer(connection, response.signature, { recipient, amount, splToken }) ``` --- ## Common Solana Tools | Tool | Purpose | |------|---------| | **Helius** | Enhanced RPC + parsing API | | **Metaplex** | NFT standard + Candy Machine | | **Jupiter** | DEX aggregator for optimal routing | | **Jito** | MEV protection + bundle submission | | **Tensor** | NFT marketplace API | | **Dialect** | On-chain notifications / messaging | | **Clockwork** | Scheduled task automation | # Solana Ecosystem Tools Guide ## Helius (Best Solana RPC) ```bash npm install helius-sdk ``` ```typescript import { Helius } from "helius-sdk" const helius = new Helius("YOUR_API_KEY") // Register at helius.dev, free tier is sufficient for development // Get all assets for a wallet (NFT + Token) const assets = await helius.rpc.getAssetsByOwner({ ownerAddress: "wallet_address", page: 1, limit: 100, }) // DAS (Digital Asset Standard) query for NFT metadata const asset = await helius.rpc.getAsset({ id: "mint_address" }) // Parse transactions (human-readable) const tx = await helius.rpc.parseTransaction({ transactions: ["tx_signature"] }) // Returns: { type: "SWAP", swapData: {...}, tokenTransfers: [...] } // Webhook (listen for address activity) const webhook = await helius.createWebhook({ accountAddresses: ["wallet_address"], transactionTypes: ["ANY"], webhookURL: "https://your-server.com/webhook", }) ``` --- ## Metaplex (Solana NFT Standard) ```bash npm install @metaplex-foundation/mpl-token-metadata npm install @metaplex-foundation/umi @metaplex-foundation/umi-bundle-defaults ``` ```typescript import { createUmi } from "@metaplex-foundation/umi-bundle-defaults" import { mplTokenMetadata, createNft, fetchMetadataFromSeeds } from "@metaplex-foundation/mpl-token-metadata" import { generateSigner, percentAmount } from "@metaplex-foundation/umi" import { walletAdapterIdentity } from "@metaplex-foundation/umi-signer-wallet-adapters" const umi = createUmi("https://api.mainnet-beta.solana.com") .use(walletAdapterIdentity(wallet)) .use(mplTokenMetadata()) // Mint NFT const mint = generateSigner(umi) await createNft(umi, { mint, name: "My NFT", uri: "https://arweave.net/xxx/metadata.json", sellerFeeBasisPoints: percentAmount(5), // 5% royalty creators: [{ address: umi.identity.publicKey, verified: true, share: 100 }], }).sendAndConfirm(umi) // Read NFT metadata const metadata = await fetchMetadataFromSeeds(umi, { mint: mint.publicKey }) console.log(metadata.name, metadata.uri) ``` ### Candy Machine V3 (Batch Mint) ```typescript import { mplCandyMachine, create, mintV2 } from "@metaplex-foundation/mpl-candy-machine" // Create Candy Machine const candyMachine = generateSigner(umi) await create(umi, { candyMachine, collectionMint: collectionMint.publicKey, collectionUpdateAuthority: umi.identity, itemsAvailable: 10000, guards: { solPayment: { lamports: sol(0.1), destination: treasury }, startDate: { date: new Date("2024-01-01") }, mintLimit: { id: 1, limit: 3 }, // Max 3 per wallet }, }).sendAndConfirm(umi) // User mint await mintV2(umi, { candyMachine: candyMachine.publicKey, ... }).sendAndConfirm(umi) ``` --- ## Jupiter (Solana DEX Aggregator) ```bash npm install @jup-ag/api ``` ```typescript import { createJupiterApiClient } from "@jup-ag/api" import { Connection, VersionedTransaction } from "@solana/web3.js" const jupiterApi = createJupiterApiClient() // 1. Get best route const quote = await jupiterApi.quoteGet({ inputMint: "So11111111111111111111111111111111111111112", // SOL outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC amount: 1_000_000_000, // 1 SOL (lamports) slippageBps: 50, // 0.5% }) console.log("Expected output:", quote.outAmount, "USDC") // 2. Execute Swap const swapResult = await jupiterApi.swapPost({ swapRequest: { quoteResponse: quote, userPublicKey: wallet.publicKey.toString(), wrapAndUnwrapSol: true, } }) const swapTx = VersionedTransaction.deserialize( Buffer.from(swapResult.swapTransaction, "base64") ) swapTx.sign([wallet]) const txId = await connection.sendRawTransaction(swapTx.serialize()) ``` --- ## Solana Pay (Payment Protocol) ```typescript import { encodeURL, createTransfer, validateTransfer } from "@solana/pay" import { PublicKey } from "@solana/web3.js" import BigNumber from "bignumber.js" // Generate payment URL (display as QR code) const url = encodeURL({ recipient: new PublicKey("your_wallet"), amount: new BigNumber(1), // 1 USDC splToken: new PublicKey("USDC_MINT"), reference: new PublicKey(reference), // Used for tracking label: "My Store", message: "Order #123", }) // Verify payment const { amount, reference } = parseURL(url) const response = await findReference(connection, reference) await validateTransfer(connection, response.signature, { recipient, amount, splToken }) ``` --- ## Common Solana Tools | Tool | Purpose | |------|---------| | **Helius** | Enhanced RPC + parsing API | | **Metaplex** | NFT standard + Candy Machine | | **Jupiter** | DEX aggregator for optimal routing | | **Jito** | MEV protection + bundle submission | | **Tensor** | NFT marketplace API | | **Dialect** | On-chain notifications / messaging | | **Clockwork** | Scheduled task automation | | **Drift** | Perpetuals + spot trading SDK |