> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Рекомендации по работе с Rust SDK

> Рекомендуемые шаблоны Solana для ИИ-агентов, использующих Helius Rust SDK: история транзакций, отправка, пакетная обработка, вебхуки, пагинация и обработка ошибок.

Рекомендации и рекомендуемые шаблоны для агентов, использующих [Helius Rust SDK](https://github.com/helius-labs/helius-rust-sdk). Инструкции по установке и началу работы см. в [обзоре](/docs/ru/agents/rust-sdk).

## Рекомендации для агентов

### Используйте `get_transactions_for_address` вместо двухэтапного поиска

`get_transactions_for_address` объединяет поиск подписей и получение транзакций в одном вызове с фильтрацией на стороне сервера.

```rust theme={"system"}
// GOOD: Single call, server-side filtering
let txs = helius.rpc().get_transactions_for_address(
    "address".to_string(),
    GetTransactionsForAddressOptions {
        transaction_details: Some(TransactionDetails::Full),
        limit: Some(100),
        filters: Some(GetTransactionsFilters {
            token_accounts: Some(TokenAccountsFilter::BalanceChanged),
            ..Default::default()
        }),
        ..Default::default()
    },
).await?;

// BAD: Two calls, client-side filtering
let sigs = helius.connection().get_signatures_for_address(&address)?;
```

### Используйте `send_smart_transaction` для стандартной отправки

Этот метод автоматически выполняет симуляцию, оценивает количество вычислительных единиц, получает приоритетные комиссии и подтверждает транзакцию. Не создавайте инструкции `ComputeBudget` вручную — SDK добавляет их автоматически.

```rust theme={"system"}
let sig = helius.send_smart_transaction(SmartTransactionConfig {
    create_config: CreateSmartTransactionConfig {
        instructions: vec![your_instruction],
        signers: vec![wallet_signer],
        priority_fee_cap: Some(100_000),
        cu_buffer_multiplier: Some(1.1),
        ..Default::default()
    },
    ..Default::default()
}).await?;
```

### Используйте Helius Sender для сверхнизкой задержки

Для транзакций, чувствительных ко времени (арбитраж, снайпинг, ликвидации), используйте `send_smart_transaction_with_sender`. Метод направляет их через мультирегиональную инфраструктуру Helius и Jito.

```rust theme={"system"}
let sig = helius.send_smart_transaction_with_sender(
    SmartTransactionConfig {
        create_config: CreateSmartTransactionConfig {
            instructions: vec![your_instruction],
            signers: vec![wallet_signer],
            ..Default::default()
        },
        ..Default::default()
    },
    SenderSendOptions {
        region: "US_EAST".to_string(),    // Default, US_SLC, US_EAST, EU_WEST, EU_CENTRAL, EU_NORTH, AP_SINGAPORE, AP_TOKYO
        swqos_only: false,                // true = SWQOS only (lower tip), false = Dual (SWQOS + Jito)
        poll_timeout_ms: 60_000,
        poll_interval_ms: 2_000,
    },
).await?;
```

### Используйте `get_asset_batch` для нескольких активов

Если нужно получить несколько активов, обрабатывайте их пакетно. Не вызывайте `get_asset` в цикле.

```rust theme={"system"}
// GOOD: Single request
let assets = helius.rpc().get_asset_batch(GetAssetBatch {
    ids: vec!["mint1".to_string(), "mint2".to_string(), "mint3".to_string()],
    ..Default::default()
}).await?;

// BAD: N requests
for id in mints {
    let asset = helius.rpc().get_asset(GetAsset { id, ..Default::default() }).await?;
}
```

### Используйте вебхуки вместо опроса

Не вызывайте `get_transactions_for_address` в цикле для периодического опроса. Используйте вебхуки для уведомлений между серверами.

```rust theme={"system"}
let webhook = helius.create_webhook(CreateWebhookRequest {
    webhook_url: "https://your-server.com/webhook".to_string(),
    webhook_type: WebhookType::Enhanced,
    transaction_types: vec![TransactionType::Transfer, TransactionType::NftSale, TransactionType::Swap],
    account_addresses: vec!["address_to_monitor".to_string()],
    auth_header: Some("Bearer your-secret".to_string()),
    ..Default::default()
}).await?;
```

## Пагинация

### На основе токена или курсора (методы RPC V2)

```rust theme={"system"}
// get_transactions_for_address uses pagination_token
let mut pagination_token: Option<String> = None;
let mut all_txs = Vec::new();
loop {
    let result = helius.rpc().get_transactions_for_address(
        "address".to_string(),
        GetTransactionsForAddressOptions {
            limit: Some(100),
            pagination_token: pagination_token.clone(),
            ..Default::default()
        },
    ).await?;
    all_txs.extend(result.data);
    pagination_token = result.pagination_token;
    if pagination_token.is_none() { break; }
}

// Or use auto-paginating variants:
let all_accounts = helius.rpc().get_all_program_accounts(
    program_id.to_string(),
    GetProgramAccountsV2Config::default(),
).await?;
```

### На основе страниц (DAS API)

```rust theme={"system"}
let mut page = 1;
let mut all_assets = Vec::new();
loop {
    let result = helius.rpc().get_assets_by_owner(GetAssetsByOwner {
        owner_address: "...".to_string(),
        page,
        limit: Some(1000),
        ..Default::default()
    }).await?;
    let count = result.items.len();
    all_assets.extend(result.items);
    if count < 1000 { break; }
    page += 1;
}
```

## Фильтр `token_accounts`

При запросе `get_transactions_for_address` фильтр `token_accounts` определяет, включать ли активность аккаунта токена:

| Значение | Поведение | Когда использовать |
| - | - | - |
| `None` | Только транзакции, непосредственно связанные с адресом | Вас интересуют только переводы SOL и вызовы программ |
| `BalanceChanged` | Также включает транзакции токенов, изменившие баланс | **Рекомендуется для большинства агентов** — показывает отправку и получение токенов без лишних данных |
| `All` | Включает все транзакции аккаунта токена | Вам нужна полная история активности токенов (может возвращать много результатов) |

## `changed_since_slot` — инкрементальное получение аккаунтов

`changed_since_slot` возвращает только аккаунты, изменённые после указанного слота. Это полезно для рабочих процессов синхронизации или индексирования. Поддерживается методами `get_program_accounts_v2`, `get_token_accounts_by_owner_v2`, `get_account_info`, `get_multiple_accounts`, `get_program_accounts` и `get_token_accounts_by_owner`.

```rust theme={"system"}
// First fetch: get all accounts
let baseline = helius.rpc().get_program_accounts_v2(
    program_id.to_string(),
    GetProgramAccountsV2Config { limit: Some(10_000), ..Default::default() },
).await?;
let last_slot = current_slot;

// Later: only get accounts that changed since your last fetch
let updates = helius.rpc().get_program_accounts_v2(
    program_id.to_string(),
    GetProgramAccountsV2Config {
        limit: Some(10_000),
        changed_since_slot: Some(last_slot),
        ..Default::default()
    },
).await?;
```

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

1. **`transaction_details: Some(TransactionDetails::Full)` не используется по умолчанию** — по умолчанию `get_transactions_for_address` возвращает только подписи. Установите `TransactionDetails::Full`, чтобы получить полные данные транзакций.

2. **Не добавляйте инструкции ComputeBudget при использовании `send_smart_transaction`** — SDK добавляет их автоматически. Добавление собственных инструкций приводит к ошибке `HeliusError::InvalidInput`.

3. **Приоритетные комиссии указываются в микролампортах на вычислительную единицу** — не в лампортах. Значения из `get_priority_fee_estimate` уже указаны в правильных единицах.

4. **Нумерация страниц DAS начинается с 1** — первой страницей является `page: 1`, а не `page: 0`.

5. **`async_connection()` требует `new_async` или `HeliusBuilder`** — вызов `helius.async_connection()` у клиента, созданного с помощью `Helius::new()`, возвращает `Err(HeliusError::ClientNotInitialized)`.

6. **`get_asset` возвращает `Option<Asset>`** — успешный ответ всё равно может содержать `None`, если актив не существует. Обрабатывайте `Option` явно.

7. **Чаевые Sender обязательны** — `send_smart_transaction_with_sender` автоматически определяет и добавляет чаевые. Минимум — 0.0002 SOL в режиме Dual или 0.000005 SOL только в режиме SWQOS.

8. **Флаги функций TLS** — по умолчанию крейт использует `native-tls`. Если OpenSSL недоступен, используйте `features = ["rustls"]` (и `default-features = false`) для реализации TLS полностью на Rust.

9. **При получении транзакций установите максимальную поддерживаемую версию транзакции равной 1.** В противном случае `get_transaction`, `get_block` и `get_transactions_for_address` с `TransactionDetails::Full` завершаются ошибкой `-32015` для транзакций версии 1. В транзакциях версии 1 приоритетной комиссией является `transactionConfig.priorityFee` сообщения — общее значение в лампортах; инструкции ComputeBudget для поиска отсутствуют. См. раздел [Поддержка транзакций версии 1](/docs/ru/rpc/transaction-v1).

## Обработка ошибок и повторные попытки

SDK предоставляет типизированные варианты ошибок через перечисление `HeliusError`, поэтому их можно сопоставлять напрямую:

```rust theme={"system"}
use helius::error::{HeliusError, Result};

match helius.rpc().get_asset(request).await {
    Ok(asset) => { /* success */ }
    Err(HeliusError::Unauthorized { .. }) => { /* 401: invalid or missing API key */ }
    Err(HeliusError::RateLimitExceeded { .. }) => { /* 429: too many requests or out of credits */ }
    Err(HeliusError::InternalError { .. }) => { /* 5xx: server error, retry with backoff */ }
    Err(HeliusError::NotFound { .. }) => { /* 404: resource not found */ }
    Err(HeliusError::BadRequest { .. }) => { /* 400: malformed request */ }
    Err(HeliusError::Timeout { .. }) => { /* transaction confirmation timed out */ }
    Err(e) => { /* other errors: Network, SerdeJson, etc. */ }
}
```

### Стратегия повторных попыток

При `RateLimitExceeded` и `InternalError` повторяйте запросы с экспоненциальной задержкой:

```rust theme={"system"}
async fn with_retry<T, F, Fut>(f: F, max_retries: u32) -> Result<T>
where
    F: Fn() -> Fut,
    Fut: std::future::Future<Output = Result<T>>,
{
    for attempt in 0..=max_retries {
        match f().await {
            Ok(val) => return Ok(val),
            Err(HeliusError::RateLimitExceeded { .. })
            | Err(HeliusError::InternalError { .. }) if attempt < max_retries => {
                tokio::time::sleep(std::time::Duration::from_millis(1000 * 2u64.pow(attempt))).await;
            }
            Err(e) => return Err(e),
        }
    }
    unreachable!()
}
```

| Вариант ошибки | Статус HTTP | Действие |
| - | - | - |
| `Unauthorized` | 401 | Проверьте ключ API |
| `RateLimitExceeded` | 429 | Увеличьте задержку и повторите попытку |
| `InternalError` | 5xx | Повторите попытку с экспоненциальной задержкой |
| `BadRequest` | 400 | Исправьте параметры запроса |
| `NotFound` | 404 | Проверьте, существует ли ресурс |
| `Timeout` | — | Увеличьте тайм-аут или повторите попытку |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.