Параметры
Открытый ключ счёта-получателя аирдропа (в кодировке base-58)
Количество запрашиваемых lamports (1 SOL = 1 000 000 000 lamports)
Объект конфигурации, содержащий:Уровень подтверждения (processed, confirmed, finalized)
Ответ
Подпись транзакции аирдропа (в кодировке base-58)
Примеры кода
Базовый запрос
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": "requestAirdrop",
"params": [
"83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri",
1000000000
]
}'
Использование web3.js
import { Connection, PublicKey } from '@solana/web3.js';
const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');
// Request airdrop
const signature = await connection.requestAirdrop(
new PublicKey('83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri'),
1000000000 // 1 SOL
);
console.log('Airdrop signature:', signature);
// Request airdrop with confirmation
async function requestAirdropWithConfirmation(
pubkey: string,
lamports: number,
config: { commitment?: string }
) {
const signature = await connection.requestAirdrop(
new PublicKey(pubkey),
lamports,
config
);
// Wait for confirmation
const confirmation = await connection.confirmTransaction(signature);
return {
signature,
confirmation: {
status: confirmation.value.err ? 'failed' : 'success',
slot: confirmation.context.slot
},
request: {
pubkey,
lamports,
formatted: lamports / 1e9 + ' SOL'
},
metadata: {
timestamp: Date.now(),
commitment: config.commitment
}
};
}
Примечания
- Запрашивает аирдроп SOL на счёт Solana
- Доступно только в тестовых сетях (devnet, testnet)
- Ответ — это подпись транзакции
- Транзакция должна быть подтверждена, прежде чем средства станут доступны
- Сумма ограничена в зависимости от конфигурации сети
Рекомендации
- Используйте подходящий уровень подтверждения в зависимости от ваших потребностей
- Дождитесь подтверждения транзакции перед продолжением работы
- Обрабатывайте ограничения запросов и сетевые ошибки
- Рассмотрите использование faucet-сервисов для больших сумм
- Отслеживайте статус транзакции на предмет сбоев
Распространённые ошибки
| Код | Сообщение | Решение |
|---|
| -32601 | Method not found | Убедитесь, что вы подключены к тестовой сети |
| -32602 | Invalid params | Проверьте формат открытого ключа и количество lamports |
| -32003 | Transaction simulation failed | Сумма может превышать лимит или счёт может быть недействительным |
Сценарии использования
-
Управление аирдропом
interface AirdropRequest {
request: {
pubkey: string;
lamports: number;
formatted: string;
};
transaction: {
signature: string;
status: 'pending' | 'success' | 'failed';
confirmations: number;
};
metadata: {
timestamp: number;
network: string;
commitment?: string;
};
}
class AirdropManager {
private readonly maxRetries = 3;
private readonly confirmationTimeout = 30000; // 30 seconds
async requestAirdrop(
pubkey: string,
lamports: number,
config: { commitment?: string }
): Promise<AirdropRequest> {
let retries = 0;
let signature: string;
while (retries < this.maxRetries) {
try {
signature = await connection.requestAirdrop(
new PublicKey(pubkey),
lamports,
config
);
// Wait for confirmation
const confirmation = await connection.confirmTransaction(signature, config.commitment);
if (!confirmation.value.err) {
return {
request: {
pubkey,
lamports,
formatted: lamports / 1e9 + ' SOL'
},
transaction: {
signature,
status: 'success',
confirmations: 1
},
metadata: {
timestamp: Date.now(),
network: connection.rpcEndpoint,
commitment: config.commitment
}
};
}
} catch (error) {
retries++;
if (retries === this.maxRetries) {
throw error;
}
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
}
}
-
Мониторинг аирдропа
interface AirdropStatus {
request: {
pubkey: string;
lamports: number;
};
status: {
signature: string;
confirmations: number;
slot: number;
};
history: Array<{
timestamp: number;
status: string;
confirmations: number;
}>;
}
class AirdropMonitor {
private requests: Map<string, AirdropStatus> = new Map();
async monitorAirdrop(
signature: string,
request: {
pubkey: string;
lamports: number;
}
): Promise<AirdropStatus> {
let status = this.requests.get(signature);
const now = Date.now();
const confirmation = await connection.getSignatureStatus(signature);
if (!status) {
status = {
request,
status: {
signature,
confirmations: confirmation?.confirmations || 0,
slot: confirmation?.slot || 0
},
history: [{
timestamp: now,
status: confirmation ? 'confirmed' : 'pending',
confirmations: confirmation?.confirmations || 0
}]
};
} else {
status.status.confirmations = confirmation?.confirmations || 0;
status.status.slot = confirmation?.slot || 0;
status.history.push({
timestamp: now,
status: confirmation ? 'confirmed' : 'pending',
confirmations: confirmation?.confirmations || 0
});
}
this.requests.set(signature, status);
return status;
}
}
-
Планирование аирдропа
interface AirdropPlan {
request: {
pubkey: string;
lamports: number;
formatted: string;
};
recommendations: Array<{
type: 'proceed' | 'split' | 'abort';
reason: string;
}>;
metadata: {
timestamp: number;
};
}
class AirdropPlanner {
private readonly maxAirdrop = 2000000000; // 2 SOL
private readonly minAirdrop = 100000; // 0.0001 SOL
async planAirdrop(
pubkey: string,
lamports: number
): Promise<AirdropPlan> {
const recommendations: Array<{
type: 'proceed' | 'split' | 'abort';
reason: string;
}> = [];
if (lamports > this.maxAirdrop) {
recommendations.push({
type: 'split',
reason: `Amount ${lamports} exceeds maximum airdrop of ${this.maxAirdrop}`
});
} else if (lamports < this.minAirdrop) {
recommendations.push({
type: 'abort',
reason: `Amount ${lamports} is below minimum airdrop of ${this.minAirdrop}`
});
} else {
recommendations.push({
type: 'proceed',
reason: 'Amount is within valid range'
});
}
return {
request: {
pubkey,
lamports,
formatted: lamports / 1e9 + ' SOL'
},
recommendations,
metadata: {
timestamp: Date.now()
}
};
}
}