Parameters

config
object
Configuration object containing:
commitment
string
Commitment level (processed, confirmed, finalized)
excludeNonCirculatingAccountsList
boolean
Whether to exclude non-circulating accounts from the total supply

Response

result
object
Object containing:
total
number
Total supply in lamports
circulating
number
Circulating supply in lamports
nonCirculating
number
Non-circulating supply in lamports
nonCirculatingAccounts
array
Array of non-circulating account addresses

Code Examples

Basic Request

curl https://rpc.orbitflare.com -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getSupply",
  "params": []
}'

Using web3.js

import { Connection } from '@solana/web3.js';

const connection = new Connection('https://rpc.orbitflare.com');

// Get supply
const supply = await connection.getSupply();
console.log('Supply:', supply);

// Get supply with analysis
async function getSupplyWithAnalysis(
  config?: { commitment?: string; excludeNonCirculatingAccountsList?: boolean }
) {
  const supply = await connection.getSupply(config);
  
  return {
    supply,
    analysis: {
      totalInSOL: supply.total / 1e9,
      circulatingInSOL: supply.circulating / 1e9,
      nonCirculatingInSOL: supply.nonCirculating / 1e9,
      circulatingPercentage: (supply.circulating / supply.total) * 100,
      metadata: {
        timestamp: Date.now(),
        commitment: config?.commitment
      }
    }
  };
}

Notes

  1. Returns the current supply of SOL in lamports
  2. The supply is broken down into total, circulating, and non-circulating amounts
  3. The response is immediate as it reads from the current state
  4. The supply can change with network activity and inflation
  5. Non-circulating accounts are typically controlled by the Solana Foundation

Best Practices

  1. Use appropriate commitment level based on your needs
  2. Cache results when appropriate to reduce RPC load
  3. Monitor for changes in the supply
  4. Consider using websocket subscription for real-time updates
  5. Handle network errors and retry when appropriate

Common Errors

CodeMessageSolution
-32601Method not foundVerify you’re connected to a Solana RPC node
-32602Invalid paramsCheck configuration parameters
-32007Supply information unavailableNode may be bootstrapping or syncing

Use Cases

  1. Supply Analysis
    interface SupplyAnalysis {
      supply: {
        total: number;
        circulating: number;
        nonCirculating: number;
      };
      metrics: {
        totalInSOL: number;
        circulatingInSOL: number;
        nonCirculatingInSOL: number;
        circulatingPercentage: number;
        inflationRate?: number;
      };
      metadata: {
        timestamp: number;
        commitment?: string;
      };
    }
    
    class SupplyAnalyzer {
      private previousSupply: number | null = null;
      
      async analyzeSupply(
        config?: { commitment?: string; excludeNonCirculatingAccountsList?: boolean }
      ): Promise<SupplyAnalysis> {
        const supply = await connection.getSupply(config);
        const currentTimestamp = Date.now();
        
        const metrics = {
          totalInSOL: supply.total / 1e9,
          circulatingInSOL: supply.circulating / 1e9,
          nonCirculatingInSOL: supply.nonCirculating / 1e9,
          circulatingPercentage: (supply.circulating / supply.total) * 100
        };
        
        if (this.previousSupply !== null) {
          const timeElapsed = (currentTimestamp - this.previousSupply) / (1000 * 60 * 60 * 24); // Days
          const supplyChange = supply.total - this.previousSupply;
          metrics.inflationRate = (supplyChange / this.previousSupply) * (365 / timeElapsed) * 100;
        }
        
        this.previousSupply = supply.total;
        
        return {
          supply,
          metrics,
          metadata: {
            timestamp: currentTimestamp,
            commitment: config?.commitment
          }
        };
      }
    }
    
  2. Supply Monitoring
    interface SupplyChange {
      previousSupply: {
        total: number;
        circulating: number;
        nonCirculating: number;
      };
      currentSupply: {
        total: number;
        circulating: number;
        nonCirculating: number;
      };
      changes: {
        total: number;
        circulating: number;
        nonCirculating: number;
      };
      metadata: {
        timestamp: number;
      };
    }
    
    class SupplyMonitor {
      private previousSupply: {
        total: number;
        circulating: number;
        nonCirculating: number;
      } | null = null;
      
      async monitorSupply(
        config?: { commitment?: string; excludeNonCirculatingAccountsList?: boolean }
      ): Promise<SupplyChange | null> {
        const currentSupply = await connection.getSupply(config);
        
        if (this.previousSupply === null) {
          this.previousSupply = currentSupply;
          return null;
        }
        
        const changes = {
          total: currentSupply.total - this.previousSupply.total,
          circulating: currentSupply.circulating - this.previousSupply.circulating,
          nonCirculating: currentSupply.nonCirculating - this.previousSupply.nonCirculating
        };
        
        if (changes.total !== 0 || changes.circulating !== 0 || changes.nonCirculating !== 0) {
          const change: SupplyChange = {
            previousSupply: this.previousSupply,
            currentSupply,
            changes,
            metadata: {
              timestamp: Date.now()
            }
          };
          
          this.previousSupply = currentSupply;
          return change;
        }
        
        return null;
      }
    }
    
  3. Supply Planning
    interface SupplyProjection {
      currentSupply: {
        total: number;
        circulating: number;
        nonCirculating: number;
      };
      projections: Array<{
        days: number;
        total: number;
        circulating: number;
        nonCirculating: number;
      }>;
      metadata: {
        timestamp: number;
        inflationRate: number;
      };
    }
    
    class SupplyPlanner {
      private readonly defaultInflationRate = 0.08; // 8% annual inflation
      
      async projectSupply(
        config?: { commitment?: string; excludeNonCirculatingAccountsList?: boolean },
        days: number[] = [30, 90, 365]
      ): Promise<SupplyProjection> {
        const currentSupply = await connection.getSupply(config);
        const currentTimestamp = Date.now();
        
        const projections = days.map(daysAhead => {
          const years = daysAhead / 365;
          const total = currentSupply.total * Math.pow(1 + this.defaultInflationRate, years);
          const circulating = currentSupply.circulating * Math.pow(1 + this.defaultInflationRate, years);
          const nonCirculating = currentSupply.nonCirculating * Math.pow(1 + this.defaultInflationRate, years);
          
          return {
            days: daysAhead,
            total,
            circulating,
            nonCirculating
          };
        });
        
        return {
          currentSupply,
          projections,
          metadata: {
            timestamp: currentTimestamp,
            inflationRate: this.defaultInflationRate
          }
        };
      }
    }