参数
响应
代码示例
基本请求
复制
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
}
}
};
}
注意事项
- 返回以 lamports 为单位的当前 SOL 供应量
- 供应量分为总量、流通量和非流通量
- 响应是即时的,因为它从当前状态读取
- 供应量可能随网络活动和通胀而变化
- 非流通账户通常由 Solana 基金会控制
最佳实践
- 根据需求使用适当的 commitment 级别
- 在适当时缓存结果以减少 RPC 负载
- 监控供应量的变化
- 考虑使用 WebSocket 订阅获取实时更新
- 适当处理网络错误并重试
常见错误
| 错误码 | 消息 | 解决方案 |
|---|---|---|
| -32601 | Method not found | 验证是否连接到 Solana RPC 节点 |
| -32602 | Invalid params | 检查配置参数 |
| -32007 | Supply information unavailable | 节点可能正在启动或同步中 |
用例
-
供应分析
复制
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 } }; } } -
供应监控
复制
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; } } -
供应规划
复制
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 } }; } }