I'll guide you through creating a Solana volume bot that can track and analyze trading volume on the Solana blockchain.
Understanding Solana Volume Bots

A volume bot typically:
Monitors trading activity on DEXs (like Raydium, Orca)
Tracks volume metrics
Identifies high-volume tokens
Provides trading signals based on volume patterns
Prerequisites
# Install required packagesnpm install @solana/web3.js @project-serum/anchor @solana/spl-token axios ws# oryarn add @solana/web3.js @project-serum/anchor @solana/spl-token axios ws
Basic Volume Bot Structure
const { Connection, PublicKey, clusterApiUrl } = require('@solana/web3.js');const axios = require('axios');const WebSocket = require('ws');class SolanaVolumeBot {
constructor() {
this.connection = new Connection(clusterApiUrl('mainnet-beta'));
this.highVolumeTokens = new Set();
this.volumeThreshold = 1000; // SOL threshold
}
async start() {
console.log('Starting Solana Volume Bot...');
await this.initialize();
this.monitorTransactions();
}
async initialize() {
// Load known token pairs or fetch from DEX APIs
await this.loadTokenPairs();
}
async loadTokenPairs() {
try {
// Fetch Raydium pairs (example)
const response = await axios.get(
'https://api.raydium.io/v2/sdk/liquidity/mainnet.json'
);
this.tokenPairs = response.data;
console.log(`Loaded ${Object.keys(this.tokenPairs).length} token pairs`);
} catch (error) {
console.error('Error loading token pairs:', error);
}
}}Real-time Transaction Monitoring
class SolanaVolumeBot {
// ... previous code
async monitorTransactions() {
// Subscribe to program logs for Raydium (example)
const subscriptionId = this.connection.onLogs(
new PublicKey('675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8'), // Raydium program ID
(logs, context) => {
this.processTransactionLogs(logs, context);
},
'confirmed'
);
console.log(`Subscribed to transactions: ${subscriptionId}`);
}
async processTransactionLogs(logs, context) {
try {
const transaction = await this.connection.getTransaction(
context.signature,
{ commitment: 'confirmed' }
);
if (transaction && transaction.meta) {
this.analyzeTransaction(transaction);
}
} catch (error) {
console.error('Error processing transaction:', error);
}
}
analyzeTransaction(transaction) {
const { meta } = transaction;
const volume = this.calculateVolume(meta);
if (volume > this.volumeThreshold) {
this.alertHighVolume(transaction, volume);
}
}
calculateVolume(meta) {
// Calculate volume from preTokenBalances and postTokenBalances
let volume = 0;
if (meta.preTokenBalances && meta.postTokenBalances) {
// Implement volume calculation logic
// This varies based on the DEX and transaction type
}
return volume;
}
alertHighVolume(transaction, volume) {
console.log(`🚨 HIGH VOLUME ALERT: ${volume} SOL`);
console.log(`Transaction: ${transaction.transaction.signatures[0]}`);
// Add your alert logic here (Telegram, Discord, etc.)
this.sendAlert(transaction, volume);
}
async sendAlert(transaction, volume) {
// Implement your alert system
// Telegram, Discord webhook, or email
}}Advanced Volume Analysis
class AdvancedVolumeAnalyzer {
constructor() {
this.volumeHistory = new Map();
this.timeWindows = [5, 15, 60]; // minutes
}
async analyzeVolumePatterns(tokenAddress) {
const historicalData = await this.fetchHistoricalVolume(tokenAddress);
const patterns = this.calculateVolumePatterns(historicalData);
return {
token: tokenAddress,
currentVolume: patterns.current,
averageVolume: patterns.average,
volumeSpike: patterns.spike,
trend: patterns.trend };
}
async fetchHistoricalVolume(tokenAddress) {
// Implement historical data fetching from Birdeye, DexScreener, or DEX APIs
try {
const response = await axios.get(
`https://public-api.birdeye.so/defi/token_volume?address=${tokenAddress}`
);
return response.data.data;
} catch (error) {
console.error('Error fetching historical volume:', error);
return [];
}
}
calculateVolumePatterns(data) {
// Implement volume analysis algorithms
return {
current: this.calculateCurrentVolume(data),
average: this.calculateAverageVolume(data),
spike: this.calculateVolumeSpike(data),
trend: this.calculateTrend(data)
};
}}Integration with DEX APIs
class DEXIntegration {
constructor() {
this.dexApis = {
raydium: 'https://api.raydium.io/v2',
orca: 'https://api.orca.so',
jupiter: 'https://quote-api.jup.ag/v6'
};
}
async getPoolVolume(poolAddress) {
try {
const response = await axios.get(
`${this.dexApis.raydium}/pool/info?id=${poolAddress}`
);
return response.data.volume;
} catch (error) {
console.error('Error fetching pool volume:', error);
return null;
}
}
async getTokenVolume(tokenAddress) {
try {
const response = await axios.get(
`https://public-api.birdeye.so/defi/token_volume?address=${tokenAddress}`
);
return response.data.data;
} catch (error) {
console.error('Error fetching token volume:', error);
return null;
}
}}Main Execution File
// index.jsconst SolanaVolumeBot = require('./SolanaVolumeBot');const AdvancedVolumeAnalyzer = require('./AdvancedVolumeAnalyzer');const DEXIntegration = require('./DEXIntegration');class Main {
constructor() {
this.bot = new SolanaVolumeBot();
this.analyzer = new AdvancedVolumeAnalyzer();
this.dex = new DEXIntegration();
}
async start() {
try {
await this.bot.start();
// Periodic volume analysis
setInterval(() => {
this.analyzeTopTokens();
}, 60000); // Every minute
} catch (error) {
console.error('Failed to start bot:', error);
}
}
async analyzeTopTokens() {
// Analyze top 10 tokens by volume
const topTokens = await this.getTopVolumeTokens();
for (const token of topTokens) {
const analysis = await this.analyzer.analyzeVolumePatterns(token.address);
this.logAnalysis(analysis);
}
}
async getTopVolumeTokens() {
// Implement logic to get top volume tokens
return []; // Return array of token addresses
}
logAnalysis(analysis) {
console.log('📊 Volume Analysis:');
console.log(`Token: ${analysis.token}`);
console.log(`Current Volume: ${analysis.currentVolume} SOL`);
console.log(`24h Avg: ${analysis.averageVolume} SOL`);
console.log(`Volume Spike: ${analysis.volumeSpike ? '✅' : '❌'}`);
console.log(`Trend: ${analysis.trend}`);
console.log('---');
}}// Start the botconst main = new Main();main.start().catch(console.error);Configuration File
// config.jsmodule.exports = {
solana: {
rpcUrl: process.env.RPC_URL || 'https://api.mainnet-beta.solana.com',
wsUrl: process.env.WS_URL || 'wss://api.mainnet-beta.solana.com',
commitment: 'confirmed'
},
volume: {
threshold: 1000, // SOL
alertCooldown: 30000, // 30 seconds
analysisInterval: 60000 // 1 minute
},
alerts: {
telegram: {
enabled: false,
botToken: process.env.TELEGRAM_BOT_TOKEN,
chatId: process.env.TELEGRAM_CHAT_ID
},
discord: {
enabled: false,
webhookUrl: process.env.DISCORD_WEBHOOK_URL
}
},
dex: {
raydiumProgramId: '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8',
orcaProgramId: '9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP'
}};Package.json Scripts
{
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
"@solana/web3.js": "^1.73.0",
"@project-serum/anchor": "^0.26.0",
"axios": "^1.4.0",
"ws": "^8.13.0"
}}Key Considerations
RPC Limits: Use dedicated RPC providers for better rate limits
Error Handling: Implement robust error handling for network issues
Data Storage: Consider using databases for historical data
Rate Limiting: Respect API rate limits from DEXs and data providers
Legal Compliance: Ensure your bot complies with relevant regulations
Advanced Features to Consider
Machine learning for volume prediction
Multi-DEX aggregation
Slippage calculation
Gas optimization
Backtesting framework
Real-time dashboard
This bot provides a foundation for volume monitoring on Solana. Remember to thoroughly test and optimize before deploying in production environments.
GTokenTool Solana volume bot: https://blog.gtokentool.com/robot/sol/
