Перейти к основному содержанию

Параметры

config
object
Объект конфигурации, содержащий:
commitment
string
Уровень подтверждения (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. Возвращает текущее предложение SOL в lamports
  2. Предложение разбито на общее, в обороте и вне оборота
  3. Ответ приходит немедленно, так как читается из текущего состояния
  4. Предложение может изменяться в зависимости от активности сети и инфляции
  5. Счета вне оборота, как правило, контролируются Фондом Solana

Рекомендации

  1. Используйте подходящий уровень подтверждения в зависимости от ваших потребностей
  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); // 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. Мониторинг предложения
    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
          }
        };
      }
    }