Параметры
Открытый ключ монетного двора токена (в кодировке base-58)
Объект конфигурации, содержащий:Уровень подтверждения (processed, confirmed, finalized)
Ответ
Объект, содержащий:Слот, в котором был обработан запрос
Необработанное количество токенов в виде строки
Количество десятичных знаков, настроенных для монетного двора токена
Количество токенов в виде числа с плавающей точкой с учётом десятичных знаков
Количество токенов в виде строки с учётом десятичных знаков
Примеры кода
Базовый запрос
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": "getTokenSupply",
"params": [
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
]
}'
Использование 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 supply
const mint = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
const supply = await connection.getTokenSupply(mint);
console.log('Token supply:', supply);
// Get token supply with analysis
async function getTokenSupplyWithAnalysis(
mint: PublicKey,
config: { commitment?: string }
) {
const supply = await connection.getTokenSupply(mint, config);
return {
supply,
analysis: {
rawAmount: BigInt(supply.value.amount),
formattedAmount: supply.value.uiAmountString,
decimals: supply.value.decimals,
metadata: {
timestamp: Date.now(),
commitment: config.commitment
}
}
};
}
Примечания
- Возвращает общее предложение токенов монетного двора
- Предложение включает все токены в обращении
- Ответ приходит немедленно, так как читается из текущего состояния
- Предложение может изменяться при чеканке и сжигании токенов
- Монетный двор должен быть действительным токеновым монетным двором
Рекомендации
- Используйте подходящий уровень подтверждения в зависимости от ваших потребностей
- Кэшируйте результаты там, где это уместно, для снижения нагрузки на RPC
- Отслеживайте изменения в предложении токенов
- Рассмотрите использование подписки на websocket для обновлений в реальном времени
- Обрабатывайте сетевые ошибки и выполняйте повторные попытки при необходимости
Распространённые ошибки
| Код | Сообщение | Решение |
|---|
| -32601 | Method not found | Убедитесь, что вы подключены к узлу Solana RPC |
| -32602 | Invalid params | Проверьте открытый ключ монетного двора и конфигурацию |
| -32007 | Mint not found | Убедитесь, что монетный двор существует |
Сценарии использования
-
Анализ предложения токенов
interface TokenSupplyAnalysis {
mint: string;
supply: {
rawAmount: string;
formattedAmount: string;
decimals: number;
};
metrics: {
maxSupply?: string;
burnedAmount?: string;
circulatingSupply?: string;
inflationRate?: number;
};
metadata: {
timestamp: number;
commitment?: string;
};
}
class TokenSupplyAnalyzer {
private readonly maxSupply: Record<string, bigint> = {
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v': BigInt(1000000000000000) // USDC
};
async analyzeTokenSupply(
mint: PublicKey,
config: { commitment?: string }
): Promise<TokenSupplyAnalysis> {
const supply = await connection.getTokenSupply(mint, config);
const rawAmount = BigInt(supply.value.amount);
const maxSupply = this.maxSupply[mint.toBase58()];
return {
mint: mint.toBase58(),
supply: {
rawAmount: supply.value.amount,
formattedAmount: supply.value.uiAmountString!,
decimals: supply.value.decimals
},
metrics: {
maxSupply: maxSupply?.toString(),
burnedAmount: maxSupply ? (maxSupply - rawAmount).toString() : undefined,
circulatingSupply: supply.value.uiAmountString,
inflationRate: maxSupply ? Number((rawAmount * BigInt(100)) / maxSupply) : undefined
},
metadata: {
timestamp: Date.now(),
commitment: config.commitment
}
};
}
}
-
Мониторинг предложения токенов
interface TokenSupplyChange {
mint: string;
changes: {
previousAmount: string;
currentAmount: string;
difference: string;
percentageChange: number;
};
metadata: {
timestamp: number;
};
}
class TokenSupplyMonitor {
private previousSupply: Map<string, string> = new Map();
async monitorTokenSupply(
mint: PublicKey,
config: { commitment?: string }
): Promise<TokenSupplyChange | null> {
const supply = await connection.getTokenSupply(mint, config);
const currentAmount = supply.value.amount;
const previousAmount = this.previousSupply.get(mint.toBase58());
if (previousAmount && previousAmount !== currentAmount) {
const difference = BigInt(currentAmount) - BigInt(previousAmount);
const percentageChange = Number((difference * BigInt(100)) / BigInt(previousAmount));
this.previousSupply.set(mint.toBase58(), currentAmount);
return {
mint: mint.toBase58(),
changes: {
previousAmount,
currentAmount,
difference: difference.toString(),
percentageChange
},
metadata: {
timestamp: Date.now()
}
};
}
this.previousSupply.set(mint.toBase58(), currentAmount);
return null;
}
}
-
Планирование предложения токенов
interface TokenSupplyPlan {
mint: string;
currentSupply: {
rawAmount: string;
formattedAmount: string;
decimals: number;
};
recommendations: Array<{
type: 'mint' | 'burn' | 'freeze';
amount?: string;
reason: string;
}>;
metadata: {
timestamp: number;
};
}
class TokenSupplyPlanner {
private readonly targetInflationRate = 0.02; // 2% annual inflation
private readonly maxSupply: Record<string, bigint> = {
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v': BigInt(1000000000000000) // USDC
};
async planTokenSupply(
mint: PublicKey,
config: { commitment?: string }
): Promise<TokenSupplyPlan> {
const supply = await connection.getTokenSupply(mint, config);
const rawAmount = BigInt(supply.value.amount);
const maxSupply = this.maxSupply[mint.toBase58()];
const recommendations: Array<{
type: 'mint' | 'burn' | 'freeze';
amount?: string;
reason: string;
}> = [];
if (maxSupply) {
const currentInflationRate = Number((rawAmount * BigInt(100)) / maxSupply) / 100;
const targetAmount = maxSupply * BigInt(Math.floor(this.targetInflationRate * 100)) / BigInt(100);
if (currentInflationRate > this.targetInflationRate) {
const burnAmount = rawAmount - targetAmount;
recommendations.push({
type: 'burn',
amount: burnAmount.toString(),
reason: `Current inflation rate (${(currentInflationRate * 100).toFixed(2)}%) exceeds target (${(this.targetInflationRate * 100).toFixed(2)}%)`
});
} else if (currentInflationRate < this.targetInflationRate) {
const mintAmount = targetAmount - rawAmount;
recommendations.push({
type: 'mint',
amount: mintAmount.toString(),
reason: `Current inflation rate (${(currentInflationRate * 100).toFixed(2)}%) below target (${(this.targetInflationRate * 100).toFixed(2)}%)`
});
}
}
return {
mint: mint.toBase58(),
currentSupply: {
rawAmount: supply.value.amount,
formattedAmount: supply.value.uiAmountString!,
decimals: supply.value.decimals
},
recommendations,
metadata: {
timestamp: Date.now()
}
};
}
}