跳转到主要内容

参数

config
object
包含以下内容的配置对象:
commitment
string
Commitment 级别(processed、confirmed、finalized)
excludeNonCirculatingAccountsList
boolean
是否从总供应量中排除非流通账户

响应

result
object
包含以下内容的对象:
total
number
总供应量(以 lamports 为单位)
circulating
number
流通供应量(以 lamports 为单位)
nonCirculating
number
非流通供应量(以 lamports 为单位)
nonCirculatingAccounts
array
非流通账户地址数组

代码示例

基本请求

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

使用 web3.js

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

const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');

// 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
      }
    }
  };
}

注意事项

  1. 返回以 lamports 为单位的当前 SOL 供应量
  2. 供应量分为总量、流通量和非流通量
  3. 响应是即时的,因为它从当前状态读取
  4. 供应量可能随网络活动和通胀而变化
  5. 非流通账户通常由 Solana 基金会控制

最佳实践

  1. 根据需求使用适当的 commitment 级别
  2. 在适当时缓存结果以减少 RPC 负载
  3. 监控供应量的变化
  4. 考虑使用 WebSocket 订阅获取实时更新
  5. 适当处理网络错误并重试

常见错误

错误码消息解决方案
-32601Method not found验证是否连接到 Solana RPC 节点
-32602Invalid params检查配置参数
-32007Supply information unavailable节点可能正在启动或同步中

用例

  1. 供应分析
    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);
          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. 供应监控
    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. 供应规划
    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
          }
        };
      }
    }