Documentation Index
Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
Use this file to discover all available pages before exploring further.
Установка
npm install @orbitflare/sdk
У RPC-клиента нет дополнительных peer-зависимостей.
Сборка клиента
Пример клиента со всеми опциями:
import { RpcClientBuilder, type RetryPolicy } from '@orbitflare/sdk';
const client = new RpcClientBuilder()
.url('http://ny.rpc.orbitflare.com')
.fallbackUrl('http://fra.rpc.orbitflare.com')
.fallbackUrl('http://ams.rpc.orbitflare.com')
.apiKey('ORBIT-XXXXXX-NNNNNN-NNNNNN')
.commitment('confirmed')
.retry({
initialDelayMs: 100,
maxDelayMs: 30_000,
multiplier: 2.0,
maxAttempts: 5,
})
.timeoutMs(30_000)
.build();
Большинство параметров имеют разумные значения по умолчанию. Минимальная конфигурация:
const client = new RpcClientBuilder()
.url('http://ny.rpc.orbitflare.com')
.build();
Методы билдера
.url(url) - основной эндпоинт для отправки запросов. Если не задан, SDK читает переменную окружения ORBITFLARE_RPC_URL.
.url('http://ny.rpc.orbitflare.com')
.urls([...]) - задать основной эндпоинт и все резервные за один вызов. Первый элемент - основной, остальные - fallback.
.urls(['http://ny.rpc.orbitflare.com', 'http://fra.rpc.orbitflare.com', 'http://ams.rpc.orbitflare.com'])
.fallbackUrl(url) - добавить один резервный эндпоинт. Вызывайте несколько раз, чтобы добавить несколько штук. При сбое основного SDK пробует fallback по порядку.
.fallbackUrl('http://fra.rpc.orbitflare.com')
.fallbackUrl('http://ams.rpc.orbitflare.com')
.fallbackUrls([...]) - то же, что fallbackUrl, но принимает массив.
.fallbackUrls(['http://fra.rpc.orbitflare.com', 'http://ams.rpc.orbitflare.com'])
.apiKey(key) - лицензионный ключ OrbitFlare. Если не задан, SDK читает ORBITFLARE_LICENSE_KEY из окружения. Ключ подставляется в URL при запросе, в самом объекте эндпоинта не хранится.
.apiKey('ORBIT-XXXXXX-NNNNNN-NNNNNN')
.commitment(level) - уровень commitment по умолчанию для всех типизированных хелперов. Допустимые значения: 'processed', 'confirmed', 'finalized'. По умолчанию 'confirmed'.
.retry(policy) - как SDK повторяет неудачные запросы. initialDelayMs - ожидание перед первым повтором. multiplier - множитель задержки на каждую попытку. maxDelayMs - верхний предел backoff. maxAttempts - лимит повторов на эндпоинт (0 - бесконечно). По умолчанию: начальная задержка 100 мс, максимум 30 с, множитель 2×, бесконечные попытки.
.retry({
initialDelayMs: 200,
maxDelayMs: 15_000,
multiplier: 2.0,
maxAttempts: 5,
})
.timeoutMs(ms) - HTTP-таймаут каждого отдельного запроса. По умолчанию 30 секунд.
Доступные методы RPC
getSlot()
Возвращает текущий номер слота.
const slot: number = await client.getSlot();
getBalance(address)
Возвращает баланс в лампортах для аккаунта.
const lamports: number = await client.getBalance('So11111111111111111111111111111111111111112');
const sol = lamports / 1_000_000_000;
getAccountInfo(address)
Возвращает полные данные аккаунта или null, если аккаунта нет. Данные закодированы в base64.
const account = await client.getAccountInfo('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
if (account) {
console.log('owner:', account.owner);
console.log('lamports:', account.lamports);
console.log('data length:', (account.data?.[0] ?? '').length);
}
getMultipleAccounts(addresses)
Загружает несколько аккаунтов одним вызовом. Автоматически режет на батчи по 100 (лимит Solana на запрос), поэтому можно передать любое число адресов.
const accounts = await client.getMultipleAccounts(['addr1', 'addr2', 'addr3']);
accounts.forEach((acct, i) => {
if (acct) console.log(`account ${i}: ${acct.lamports} lamports`);
else console.log(`account ${i}: not found`);
});
getLatestBlockhash()
Возвращает последний blockhash и последнюю высоту блока, на которую он действителен.
const { blockhash, lastValidBlockHeight } = await client.getLatestBlockhash();
getTransaction(signature)
Получает подтверждённую транзакцию по подписи. Возвращает полную транзакцию с метаданными.
const tx = await client.getTransaction('5K8F2j...');
console.log('slot:', tx.slot);
console.log('fee:', tx.meta?.fee);
getSignaturesForAddress(address, limit)
Возвращает недавние подписи транзакций для адреса, сначала самые новые.
const sigs = await client.getSignaturesForAddress('So111...', 10);
for (const sig of sigs) {
console.log(`${sig.signature} at slot ${sig.slot}`);
}
getProgramAccounts(programId)
Возвращает все аккаунты, принадлежащие программе. Может вернуть много данных.
const accounts = await client.getProgramAccounts('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');
getRecentPrioritizationFees(addresses)
Возвращает недавние приоритетные комиссии для набора аккаунтов. Полезно для оценки цены compute unit.
const fees = await client.getRecentPrioritizationFees(['6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P']);
for (const fee of fees) {
console.log(`slot ${fee.slot}: ${fee.prioritizationFee} micro-lamports`);
}
sendTransaction(txBase64)
Отправляет подписанную транзакцию в сеть. Принимает сериализованную транзакцию в base64. Возвращает подпись транзакции.
const signature: string = await client.sendTransaction(txBase64);
console.log('sent:', signature);
simulateTransaction(txBase64)
Симулирует транзакцию без отправки. Возвращает логи, потреблённые compute units и ошибки, если есть.
const result = await client.simulateTransaction(txBase64);
if (result.err) {
console.log('simulation failed:', result.err);
} else {
console.log('compute units:', result.unitsConsumed);
}
getTokenAccountsByOwner(owner, mint?, programId?)
Возвращает token-аккаунты кошелька. Передайте конкретный mint или ID программы токенов. Если оба не указаны, по умолчанию используется программа SPL Token.
const tokens = await client.getTokenAccountsByOwner('wallet_address');
for (const token of tokens) {
const info = token.account?.data?.parsed?.info;
console.log(`mint: ${info?.mint} balance: ${info?.tokenAmount?.uiAmountString}`);
}
getTransactionsForAddress(address, options)
Специфичный для OrbitFlare метод, объединяющий getSignaturesForAddress и getTransaction в один вызов. Возвращает GetTransactionsResult с массивом data и опциональным paginationToken для следующей страницы.
Поддерживаются четыре уровня детализации (signatures, none, accounts, full), двунаправленная сортировка, фильтрация по времени/слоту, по статусу и включение token-аккаунтов.
const result = await client.getTransactionsForAddress('address', {
transactionDetails: 'full',
limit: 100,
sortOrder: 'asc',
filters: {
tokenAccounts: 'all',
status: 'succeeded',
blockTime: { gte: 1704067200, lte: 1706745600 },
},
});
for (const tx of result.data) {
console.log(`slot ${tx.slot}`);
}
if (result.paginationToken) {
// fetch next page using { paginationToken: result.paginationToken }
}
request(method, params)
Вызов любого RPC-метода по имени. SDK собирает JSON-RPC-обёртку, применяет retry и failover, возвращает поле result.
const epoch = await client.request('getEpochInfo', []);
const inflation = await client.request('getInflationRate', []);
const supply = await client.request('getSupply', []);
requestRaw(body)
Отправка сырой строки тела JSON-RPC. Те же retry и failover, что и везде.
const result = await client.requestRaw(
'{"jsonrpc":"2.0","id":1,"method":"getHealth","params":[]}',
);
Полный пример
Скрипт проверяет состояние сети, получает баланс SOL и токены кошелька, смотрит недавние транзакции.
import { RpcClientBuilder } from '@orbitflare/sdk';
async function main() {
const client = new RpcClientBuilder()
.url('http://ny.rpc.orbitflare.com')
.fallbackUrl('http://fra.rpc.orbitflare.com')
.commitment('confirmed')
.build();
const wallet = 'CKs1E69a2e9TmH4mKKLrXFF8kD3ZnwKjoEuXa6sz9WqX';
const slot = await client.getSlot();
const { blockhash } = await client.getLatestBlockhash();
console.log(`network slot: ${slot}`);
console.log(`blockhash: ${blockhash}`);
const balance = await client.getBalance(wallet);
console.log(`\n${wallet}`);
console.log(` SOL: ${(balance / 1_000_000_000).toFixed(4)}`);
const tokens = await client.getTokenAccountsByOwner(wallet);
for (const token of tokens) {
const info = token?.account?.data?.parsed?.info;
const mint = info?.mint ?? 'unknown';
const amount = info?.tokenAmount?.uiAmountString ?? '0';
if (amount !== '0') console.log(` ${mint}: ${amount}`);
}
const sigs = await client.getSignaturesForAddress(wallet, 5);
console.log('\nrecent transactions:');
for (const sig of sigs) {
const signature = sig?.signature ?? '?';
const status = sig?.err == null ? 'ok' : 'failed';
console.log(` ${sig?.slot ?? 0} ${status} ${signature.slice(0, 20)}`);
}
const fees = await client.getRecentPrioritizationFees([wallet]);
const total = fees.reduce(
(acc: number, f: any) =>
acc + (typeof f?.prioritizationFee === 'number' ? f.prioritizationFee : 0),
0,
);
const avg = total / Math.max(fees.length, 1);
console.log(`\navg priority fee: ${avg.toFixed(0)} micro-lamports`);
}
void main();