> ## 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.

# Миграция с getSignaturesForAddress + getTransaction на getTransactionsForAddress

> Замените цикл getSignaturesForAddress + getTransaction одним вызовом getTransactionsForAddress — сопоставление параметров, код до и после миграции и пагинация.

## Зачем выполнять миграцию?

Стандартный способ получения истории транзакций адреса в Solana состоит из двух шагов: вызовите `getSignaturesForAddress`, чтобы получить список подписей, а затем вызовите `getTransaction` по одному разу для каждой подписи, чтобы получить подробные данные. Для 1 000 транзакций потребуется 1 001 HTTP-запрос.

[`getTransactionsForAddress`](/docs/ru/rpc/gettransactionsforaddress) — эксклюзивный RPC-метод Helius, объединяющий оба шага в один вызов. Он возвращает до 1 000 полных транзакций на запрос и поддерживает фильтрацию, двунаправленную сортировку и счета токенов, недоступные в стандартных методах.

| | `getSignaturesForAddress` + `getTransaction` | `getTransactionsForAddress` |
| - | - | - |
| Запросов для 1 000 транзакций | 1 001 | 1 |
| Кредитов для 1 000 полных транзакций | \~1 001 (1 кредит за вызов) | 100 (10 кредитов за 100 транзакций) |
| История связанного счета токенов (ATA) | Не включена | Включается через `filters.tokenAccounts` |
| Фильтры по диапазону времени и слотов | Нет | Да |
| Фильтр по статусу (успешно/с ошибкой) | Нет | Да |
| Порядок сортировки | Только от новых к старым | От новых к старым или от старых к новым |
| Пагинация | Подписи `before`/`until` | `paginationToken` |

Результат: примерно в 10 раз меньше кредитов, в 1 000 раз меньше сетевых запросов и отсутствие необходимости в пакетной обработке на стороне клиента, управлении ограничениями частоты запросов и логике повторных попыток для множества вызовов `getTransaction`.

## До и после

Ниже показано, как выполнить одну и ту же задачу — получить последние 1 000 транзакций адреса со всеми подробными данными — обоими способами:

<CodeGroup>
  ```javascript Before (two methods) theme={"system"}
  const rpcUrl = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY';

  // Step 1: Get signatures (1 request)
  const sigResponse = await fetch(rpcUrl, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 1,
      method: 'getSignaturesForAddress',
      params: ['YOUR_ADDRESS_HERE', { limit: 1000 }]
    })
  });
  const { result: signatures } = await sigResponse.json();

  // Step 2: Get transaction details (1,000 additional requests)
  const transactions = await Promise.all(
    signatures.map(async (sig) => {
      const txResponse = await fetch(rpcUrl, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          jsonrpc: '2.0',
          id: 1,
          method: 'getTransaction',
          params: [sig.signature, { maxSupportedTransactionVersion: 1 }]
        })
      });
      const { result } = await txResponse.json();
      return result;
    })
  );
  ```

  ```javascript After (one method) theme={"system"}
  const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 1,
      method: 'getTransactionsForAddress',
      params: [
        'YOUR_ADDRESS_HERE',
        {
          transactionDetails: 'full',
          maxSupportedTransactionVersion: 1,
          limit: 1000
        }
      ]
    })
  });

  const { result } = await response.json();
  const transactions = result.data; // Full transactions, same shape as getTransaction
  ```
</CodeGroup>

`getTransactionsForAddress` не входит в стандартный RPC Solana, поэтому в `@solana/web3.js` нет вспомогательного метода `Connection` для него. Вызывайте его с помощью необработанного JSON-RPC-запроса, как показано выше. Он работает на той же конечной точке Helius, что и остальной RPC-трафик.

## Сопоставление параметров

Каждому параметру старого двухэтапного процесса соответствует параметр в новом методе. Большинство названий не изменились — иначе работает только пагинация.

### Из getSignaturesForAddress

| Старый параметр | Новый эквивалент |
| - | - |
| `limit` | `limit` — тот же максимум в 1 000 |
| `before` | `paginationToken` из предыдущего ответа |
| `until` | `filters.signature.gt` |
| `commitment` | `commitment` — только `confirmed` или `finalized`; `processed` не поддерживается |
| `minContextSlot` | `minContextSlot` — без изменений |

### Из getTransaction

| Старый параметр | Новый эквивалент |
| - | - |
| `encoding` | `encoding` — применяется, когда `transactionDetails` имеет значение `"full"` |
| `maxSupportedTransactionVersion` | `maxSupportedTransactionVersion` — без изменений |
| `commitment` | `commitment` — то же правило, что и выше |

Две возможности вообще не имеют эквивалентов в старом процессе:

* `filters` — ограничивайте результаты на стороне сервера по `blockTime`, `slot`, `status`, `tokenTransfer` или `tokenAccounts` вместо получения всех данных и их фильтрации в коде.
* `sortOrder: "asc"` — результаты в хронологическом порядке (сначала старые), которые стандартные методы могут вернуть только после получения всей истории и изменения ее порядка.

## Этапы миграции

<Steps>
  <Step title="Confirm you're on a Helius endpoint">
    `getTransactionsForAddress` доступен только в Helius. Он работает на `https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY` (и в devnet) — на той же конечной точке, которую уже используют ваши существующие вызовы, если вы являетесь клиентом Helius. Изменять ключ API или тарифный план не требуется.
  </Step>

  <Step title="Replace the two-step fetch with one call">
    Удалите вызов `getSignaturesForAddress` и цикл `getTransaction`. Выполните один запрос `getTransactionsForAddress` с `transactionDetails: "full"`, перенеся значения `encoding`, `maxSupportedTransactionVersion` и `commitment`, как показано в разделе [сопоставления параметров](#сопоставление-параметров).

    Если вам нужны только подписи (например, для передачи в существующий конвейер), используйте вместо этого `transactionDetails: "signatures"` — каждый вызов всегда стоит 10 кредитов.
  </Step>

  <Step title="Update the response handling">
    Структура ответа изменяется в трех аспектах:

    * Результаты находятся в `result.data` (массиве), а не непосредственно в `result`.
    * Каждая запись в полном режиме представляет собой `{ slot, transactionIndex, blockTime, transaction, meta }`. Объекты `transaction` и `meta` имеют ту же структуру, что и возвращаемые `getTransaction`, поэтому код синтаксического анализа можно перенести без изменений.
    * Записи в режиме подписей соответствуют выходным данным `getSignaturesForAddress` (`signature`, `slot`, `err`, `memo`, `blockTime`, `confirmationStatus`), но содержат дополнительное поле `transactionIndex`.

    Учтите одно отличие в поведении: при использовании старого подхода вызов `getTransaction` мог вернуть `null` для подписи. При использовании `getTransactionsForAddress` каждая запись в `result.data` представляет собой полную транзакцию — удалите обработку null для отсутствующих подробных данных.
  </Step>

  <Step title="Replace signature-based pagination">
    Замените цикл с курсором `before` на `paginationToken`:

    ```javascript theme={"system"}
    let paginationToken = null;
    const allTransactions = [];

    do {
      const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          jsonrpc: '2.0',
          id: 1,
          method: 'getTransactionsForAddress',
          params: [
            'YOUR_ADDRESS_HERE',
            {
              transactionDetails: 'full',
              maxSupportedTransactionVersion: 1,
              limit: 1000,
              ...(paginationToken && { paginationToken })
            }
          ]
        })
      });

      const { result } = await response.json();
      allTransactions.push(...result.data);
      paginationToken = result.paginationToken;
    } while (paginationToken);
    ```

    Цикл завершается, когда `paginationToken` получает значение `null`. Больше не нужно сравнивать списки подписей или самостоятельно отслеживать последнюю подпись.

    Если вы использовали `until` для остановки на известной подписи, замените его на `filters.signature: { gt: "KNOWN_SIGNATURE" }`. Если вы использовали его для остановки в определенный момент времени, обычно удобнее использовать `filters.blockTime` или `filters.slot`.
  </Step>

  <Step title="Optional: enable complete token history">
    Старый подход полностью пропускает активность связанных счетов токенов (ATA), если вы дополнительно не вызывали `getTokenAccountsByOwner` и не получали подписи для каждого счета токенов. Чтобы включить эту активность, добавьте один фильтр:

    ```json theme={"system"}
    {
      "filters": {
        "tokenAccounts": "balanceChanged"
      }
    }
    ```

    `balanceChanged` возвращает транзакции, которые ссылаются на кошелек или изменяют баланс любого принадлежащего ему счета токенов, отфильтровывая спам. Описание параметров `none`/`balanceChanged`/`all` и оговорку о данных до 2022 года см. в разделе [связанных счетов токенов](/docs/ru/rpc/gettransactionsforaddress#связанные-токен-аккаунты).
  </Step>

  <Step title="Verify against the old output">
    Для тестового адреса получите историю обоими способами и сравните наборы подписей. Если `filters.tokenAccounts` не задан (по умолчанию используется `none`), `getTransactionsForAddress` возвращает те же транзакции, что и `getSignaturesForAddress` для того же диапазона. Затем разверните изменения и удалите старый путь выполнения кода.
  </Step>
</Steps>

## Отличия в поведении, которые нужно проверить

В большинстве случаев миграция сводится к прямой замене, но перед выпуском проверьте следующее:

* **Уровень подтверждения.** `processed` не поддерживается; используйте `confirmed` или `finalized`. Если старый код опрашивал недавнюю историю с уровнем `processed`, перейдите на `confirmed`.
* **Тарификация.** Ответы с полными транзакциями стоят 10 кредитов за каждые 100 возвращенных транзакций (минимум 10 кредитов); ответы только с подписями всегда стоят 10 кредитов. Старый подход стоил 1 кредит за вызов — дешевле за запрос, но значительно дороже за каждую полученную транзакцию. Неудачные ответы бесплатны. См. раздел [тарификации](/docs/ru/rpc/gettransactionsforaddress#учёт-использования).
* **Поддержка сетей.** В mainnet срок хранения не ограничен. Devnet поддерживается со сроком хранения 2 недели. Testnet не поддерживается.
* **Зарезервированные адреса.** Небольшой набор системных адресов (Vote Program, System Program, системные переменные) перенаправляется на резервные архивные пути или возвращает пустой результат. Если вы индексируете такие адреса, ознакомьтесь с разделом [ограничений и пограничных случаев](/docs/ru/rpc/gettransactionsforaddress#ограничения-и-особые-случаи).
* **Несколько адресов.** Как и в старом процессе, один запрос охватывает один адрес. Запрашивайте адреса параллельно и объединяйте результаты; см. раздел [нескольких адресов](/docs/ru/rpc/gettransactionsforaddress#несколько-адресов).

## Часто задаваемые вопросы

### Является ли getTransactionsForAddress стандартным RPC-методом Solana?

Нет. Это эксклюзивный метод Helius, доступный на конечных точках RPC Helius. Стандартный RPC Solana и другие поставщики предлагают только `getSignaturesForAddress` и `getTransaction`. Это не влияет на другие ваши RPC-вызовы: метод доступен на той же конечной точке вместе с полным набором стандартных RPC-методов.

### Нужен ли getTransaction после миграции?

Только для единичных запросов, когда у вас уже есть подпись, но нет контекста адреса, например при проверке конкретной транзакции, вставленной пользователем. Для любой истории на основе адреса — заполнения историческими данными, индексирования, лент активности кошелька — `getTransactionsForAddress` заменяет оба метода.

### Работает ли метод с @solana/web3.js?

Метод отсутствует в классе `Connection`, но работает с любым HTTP-клиентом, отправляющим запросы на ваш RPC URL Helius. Используйте `fetch` (или эквивалент для вашего языка) со стандартным телом JSON-RPC, как показано в примерах выше. Для всего остального можно продолжать использовать `Connection`.

### Вернет ли он те же транзакции, что и getSignaturesForAddress?

Да. С настройками по умолчанию (`filters.tokenAccounts: "none"`) он возвращает транзакции, которые ссылаются на запрашиваемый адрес, — тот же набор, что и `getSignaturesForAddress`. Если установить для `tokenAccounts` значение `balanceChanged` или `all`, метод вернет больше данных: он добавит активность связанных счетов токенов кошелька, которую стандартный метод не видит.

### Сколько это стоит по сравнению со старым подходом?

Получение 1 000 полных транзакций с помощью `getTransactionsForAddress` стоит 100 кредитов, а с помощью `getSignaturesForAddress` + `getTransaction` — примерно 1 001 кредит (и 1 001 запрос). Ответы только с подписями всегда стоят 10 кредитов за вызов. Полные сведения о ценах см. на странице [кредитов Helius](/docs/ru/billing/credits).

## Поручите миграцию AI-агенту

Если вы используете Claude Code, Cursor или другого агента для написания кода, вставьте приведенный ниже промпт в сеанс агента для вашего репозитория. Агент найдет старый шаблон в кодовой базе и перепишет его.

````markdown theme={"system"}
Migrate this codebase from the two-step Solana transaction history pattern
(getSignaturesForAddress followed by getTransaction) to the single Helius RPC
method getTransactionsForAddress.

## Background

getTransactionsForAddress is a Helius-exclusive JSON-RPC method served on
standard Helius RPC endpoints (https://mainnet.helius-rpc.com/?api-key=...).
It returns up to 1,000 full transactions per call, replacing one
getSignaturesForAddress call plus one getTransaction call per signature.
Docs: https://www.helius.dev/docs/rpc/gettransactionsforaddress.md

## Step 1: Find the old pattern

Search for:
- getSignaturesForAddress calls (via @solana/web3.js Connection, raw JSON-RPC,
  or another SDK) whose signatures are then passed to getTransaction /
  getParsedTransaction / getTransactions
- Pagination loops using `before` or `until` signature cursors
- getTokenAccountsByOwner calls used only to fetch per-token-account signature
  history

Leave standalone getTransaction calls (single-signature lookups with no
address context) unchanged.

## Step 2: Rewrite each call site

Replace the two-step flow with one raw JSON-RPC request (web3.js has no
Connection helper for this method):

```javascript
const response = await fetch(HELIUS_RPC_URL, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'getTransactionsForAddress',
    params: [
      address, // base-58 string
      {
        transactionDetails: 'full',       // or 'signatures' if only signatures were used
        maxSupportedTransactionVersion: 1, // carry over from the old getTransaction options
        encoding: 'json',                  // carry over ('json', 'jsonParsed', 'base64', 'base58')
        limit: 1000,                       // up to 1,000
        // paginationToken: '...',         // from the previous response, for page 2+
        // sortOrder: 'desc',              // 'desc' (default, newest first) or 'asc'
        // filters: { ... }                // optional, see mapping below
      }
    ]
  })
});
const { result } = await response.json();
// result.data      -> array of transactions
// result.paginationToken -> string cursor, or null when done
```

Parameter mapping:
- limit -> limit
- before: <sig> -> paginationToken (preferred) or filters: { signature: { lt: <sig> } }
- until: <sig>  -> filters: { signature: { gt: <sig> } }
- commitment -> commitment ('confirmed' or 'finalized' only; if the old code
  used 'processed', use 'confirmed')
- minContextSlot -> minContextSlot
- encoding / maxSupportedTransactionVersion (from getTransaction) -> same names,
  top level of the config object

Response shape:
- Full mode: each entry is { slot, transactionIndex, blockTime, transaction, meta }.
  transaction and meta are identical in shape to getTransaction results, so
  existing parsing code carries over. Entries are never null - remove
  null-handling that existed for missing getTransaction results.
- Signatures mode: entries match getSignaturesForAddress output
  ({ signature, slot, err, memo, blockTime, confirmationStatus }) plus
  transactionIndex.

Pagination: loop while result.paginationToken is non-null, passing it back as
paginationToken. Remove manual last-signature tracking.

If the old code fetched signatures for the wallet's token accounts too
(getTokenAccountsByOwner + per-account getSignaturesForAddress), replace all
of it with one call using filters: { tokenAccounts: 'balanceChanged' } and
delete the merge/dedupe logic.

## Step 3: Constraints and cleanup

- The endpoint must be a Helius RPC URL; other providers do not serve this
  method. Do not change endpoints for other RPC calls.
- Remove now-unused batching, throttling, and retry helpers that existed only
  for the getTransaction fan-out.
- One request covers one address; keep parallel queries for multi-address code.
- Preserve the surrounding code style and error handling conventions.

## Step 4: Verify

- Run the project's type checks and tests.
- Do NOT make any RPC calls yourself. Instead, write a standalone script (e.g.
  scripts/verify-gtfa-migration.mjs) that fetches history for one address both
  ways - the old getSignaturesForAddress + getTransaction flow and the new
  getTransactionsForAddress call with default filters - and prints whether the
  signature sets match, listing any differences. Read the RPC URL from an
  environment variable and the address from a CLI argument; never hardcode an
  API key.
- Tell the user how to run it, for example:
  HELIUS_RPC_URL="https://mainnet.helius-rpc.com/?api-key=..." \
    node scripts/verify-gtfa-migration.mjs <address>
- Summarize every call site changed and flag any you were unsure about.
````

Промпт самодостаточен — агенту не нужен доступ к этой странице. Документацию для агентов, поиск MCP и навыки см. в разделе [Helius для AI-агентов](/docs/ru/agents/overview).

## Следующие шаги

<CardGroup cols={2}>
  <Card title="getTransactionsForAddress guide" icon="clock-rotate-left" href="/docs/ru/rpc/gettransactionsforaddress">
    Полное руководство по фильтрам, сортировке, пагинации и счетам токенов.
  </Card>

  <Card title="API reference" icon="code" href="/docs/ru/api-reference/rpc/http/gettransactionsforaddress">
    Полная схема запроса и ответа.
  </Card>

  <Card title="Indexing guide" icon="layer-group" href="/docs/ru/rpc/how-to-index-solana-data">
    Используйте getTransactionsForAddress для заполнения историческими данными и синхронизации индекса Solana.
  </Card>

  <Card title="Historical data overview" icon="database" href="/docs/ru/rpc/historical-data">
    Сравнение всех методов работы с историческими данными Solana.
  </Card>
</CardGroup>


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