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

Параметры

pubkey
string
обязательно
Открытый ключ токенового счёта (в кодировке base-58)
config
object
Объект конфигурации, содержащий:
commitment
string
Уровень подтверждения (processed, confirmed, finalized)

Ответ

result
object
Объект, содержащий:
context
object
slot
number
Слот, в котором был обработан запрос
value
object
amount
string
Необработанное количество токенов в виде строки
decimals
number
Количество десятичных знаков, настроенных для монетного двора токена
uiAmount
number
Количество токенов в виде числа с плавающей точкой с учётом десятичных знаков
uiAmountString
string
Количество токенов в виде строки с учётом десятичных знаков

Примеры кода

Базовый запрос

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": "getTokenAccountBalance",
  "params": [
    "4vJ9JU1bJJE96FWSJKvHsmmFADCg4gpZQff4P3bkLZj"
  ]
}'

Использование web3.js

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

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

// Get token account balance
const tokenAccount = new PublicKey('4vJ9JU1bJJE96FWSJKvHsmmFADCg4gpZQff4P3bkLZj');
const balance = await connection.getTokenAccountBalance(tokenAccount);
console.log('Token balance:', balance);

// Get token account balance with analysis
async function getTokenAccountBalanceWithAnalysis(
  tokenAccount: PublicKey,
  config?: { commitment?: string }
) {
  const balance = await connection.getTokenAccountBalance(tokenAccount, config);
  
  return {
    balance,
    analysis: {
      rawAmount: balance.value.amount,
      uiAmount: balance.value.uiAmount,
      uiAmountString: balance.value.uiAmountString,
      decimals: balance.value.decimals,
      metadata: {
        timestamp: Date.now(),
        commitment: config?.commitment
      }
    }
  };
}

Примечания

  1. Возвращает баланс токенов токенового счёта
  2. Баланс возвращается как в необработанном формате, так и в удобном для пользователя формате
  3. Ответ приходит немедленно, так как читается из текущего состояния
  4. Баланс может изменяться при переводах токенов и других операциях
  5. Счёт должен быть действительным токеновым счётом

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

  1. Используйте подходящий уровень подтверждения в зависимости от ваших потребностей
  2. Кэшируйте результаты там, где это уместно, для снижения нагрузки на RPC
  3. Отслеживайте изменения балансов токенов
  4. Рассмотрите использование подписки на websocket для обновлений в реальном времени
  5. Обрабатывайте сетевые ошибки и выполняйте повторные попытки при необходимости

Распространённые ошибки

КодСообщениеРешение
-32601Method not foundУбедитесь, что вы подключены к узлу Solana RPC
-32602Invalid paramsПроверьте открытый ключ токенового счёта
-32007Token account not foundУбедитесь, что токеновый счёт существует
-32008Invalid token accountУбедитесь, что счёт является действительным токеновым счётом

Сценарии использования

  1. Анализ баланса токенов
    interface TokenBalanceAnalysis {
      account: string;
      balance: {
        raw: string;
        ui: number;
        decimals: number;
      };
      metrics: {
        valueInUSD?: number;
        percentageChange?: number;
        historicalData?: Array<{
          timestamp: number;
          balance: number;
        }>;
      };
      metadata: {
        timestamp: number;
        commitment?: string;
      };
    }
    
    class TokenBalanceAnalyzer {
      private readonly tokenPrice: number = 1; // Replace with actual token price
      private historicalBalances: Array<{
        timestamp: number;
        balance: number;
      }> = [];
      
      async analyzeTokenBalance(
        tokenAccount: PublicKey,
        config?: { commitment?: string }
      ): Promise<TokenBalanceAnalysis> {
        const balance = await connection.getTokenAccountBalance(tokenAccount, config);
        const currentTimestamp = Date.now();
        
        this.historicalBalances.push({
          timestamp: currentTimestamp,
          balance: balance.value.uiAmount || 0
        });
        
        // Keep only last 24 hours of data
        const oneDayAgo = currentTimestamp - 24 * 60 * 60 * 1000;
        this.historicalBalances = this.historicalBalances.filter(
          data => data.timestamp >= oneDayAgo
        );
        
        const metrics = {
          valueInUSD: (balance.value.uiAmount || 0) * this.tokenPrice,
          historicalData: this.historicalBalances
        };
        
        if (this.historicalBalances.length > 1) {
          const oldestBalance = this.historicalBalances[0].balance;
          const newestBalance = this.historicalBalances[this.historicalBalances.length - 1].balance;
          metrics.percentageChange = ((newestBalance - oldestBalance) / oldestBalance) * 100;
        }
        
        return {
          account: tokenAccount.toBase58(),
          balance: {
            raw: balance.value.amount,
            ui: balance.value.uiAmount || 0,
            decimals: balance.value.decimals
          },
          metrics,
          metadata: {
            timestamp: currentTimestamp,
            commitment: config?.commitment
          }
        };
      }
    }
    
  2. Мониторинг баланса токенов
    interface TokenBalanceChange {
      account: string;
      previousBalance: {
        raw: string;
        ui: number;
      };
      currentBalance: {
        raw: string;
        ui: number;
      };
      change: {
        raw: string;
        ui: number;
      };
      metadata: {
        timestamp: number;
      };
    }
    
    class TokenBalanceMonitor {
      private previousBalances: Map<string, {
        raw: string;
        ui: number;
      }> = new Map();
      
      async monitorTokenBalance(
        tokenAccount: PublicKey,
        config?: { commitment?: string }
      ): Promise<TokenBalanceChange | null> {
        const balance = await connection.getTokenAccountBalance(tokenAccount, config);
        const accountKey = tokenAccount.toBase58();
        const previous = this.previousBalances.get(accountKey);
        
        if (!previous) {
          this.previousBalances.set(accountKey, {
            raw: balance.value.amount,
            ui: balance.value.uiAmount || 0
          });
          return null;
        }
        
        if (previous.raw !== balance.value.amount) {
          const change: TokenBalanceChange = {
            account: accountKey,
            previousBalance: previous,
            currentBalance: {
              raw: balance.value.amount,
              ui: balance.value.uiAmount || 0
            },
            change: {
              raw: (BigInt(balance.value.amount) - BigInt(previous.raw)).toString(),
              ui: (balance.value.uiAmount || 0) - previous.ui
            },
            metadata: {
              timestamp: Date.now()
            }
          };
          
          this.previousBalances.set(accountKey, {
            raw: balance.value.amount,
            ui: balance.value.uiAmount || 0
          });
          
          return change;
        }
        
        return null;
      }
    }
    
  3. Планирование баланса токенов
    interface TokenBalancePlan {
      account: string;
      currentBalance: {
        raw: string;
        ui: number;
      };
      projections: Array<{
        days: number;
        balance: number;
        growth: number;
      }>;
      metadata: {
        timestamp: number;
        growthRate: number;
      };
    }
    
    class TokenBalancePlanner {
      private readonly defaultGrowthRate = 0.05; // 5% daily growth
      
      async planTokenBalance(
        tokenAccount: PublicKey,
        config?: { commitment?: string },
        days: number[] = [7, 30, 90]
      ): Promise<TokenBalancePlan> {
        const balance = await connection.getTokenAccountBalance(tokenAccount, config);
        const currentTimestamp = Date.now();
        
        const projections = days.map(daysAhead => {
          const currentBalance = balance.value.uiAmount || 0;
          const projectedBalance = currentBalance * Math.pow(1 + this.defaultGrowthRate, daysAhead);
          
          return {
            days: daysAhead,
            balance: projectedBalance,
            growth: projectedBalance - currentBalance
          };
        });
        
        return {
          account: tokenAccount.toBase58(),
          currentBalance: {
            raw: balance.value.amount,
            ui: balance.value.uiAmount || 0
          },
          projections,
          metadata: {
            timestamp: currentTimestamp,
            growthRate: this.defaultGrowthRate
          }
        };
      }
    }