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

# Обзор и руководство по getTransactionsForAddress

> Узнайте, как запрашивать историю транзакций Solana с расширенной фильтрацией, двунаправленной сортировкой и эффективной пагинацией с помощью этого эксклюзивного RPC-метода Helius.

## Обзор

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

В отличие от `getSignaturesForAddress`, который возвращает только подписи и пропускает связанные токен-аккаунты, `getTransactionsForAddress` может за один вызов вернуть полные данные транзакций, включая активность связанных токен-аккаунтов (ATA) кошелька. Поэтому это самый быстрый способ получить полную историю адреса для ретроспективной загрузки, индексирования и аналитики.

Этот метод возвращает до 1 000 полных транзакций за вызов.

<CardGroup cols={2}>
  <Card title="Flexible sorting" icon="arrows-up-down">
    Сортируйте в хронологическом (сначала старые) или обратном порядке (сначала новые).
  </Card>

  <Card title="Advanced filtering" icon="filter">
    Фильтруйте по диапазонам времени, слотам, подписям, статусу и переводам токенов.
  </Card>

  <Card title="Full transaction data" icon="database">
    Получайте полные сведения о транзакциях за один вызов без дополнительного запроса getTransaction.
  </Card>

  <Card title="Token accounts" icon="layer-group">
    Включайте транзакции для связанных токен-аккаунтов адреса.
  </Card>
</CardGroup>

## Когда использовать

Используйте `getTransactionsForAddress`, если вам нужны:

* Полная история токенов кошелька, включая связанные токен-аккаунты
* Быстрая ретроспективная загрузка одним вызовом для индексатора или конвейера данных
* Анализ транзакций и отчётность по времени или слотам
* Фильтрация по статусу для получения только успешных или только неудачных транзакций
* Хронологическое воспроизведение истории (сначала старые транзакции)
* Анализ запуска токена: первые транзакции выпуска и ранние держатели
* История пополнения кошелька и поиск контрагентов
* Отчёты для контроля соответствия требованиям и аудита за определённый период

Для получения разобранной истории только переводов (платежи, сверка баланса) используйте [`getTransfersByAddress`](/docs/ru/rpc/gettransfersbyaddress).

### Поддержка сетей

| Сеть | Поддерживается | Срок хранения |
| - | - | - |
| Mainnet | Да | Не ограничен |
| Devnet | Да | 2 недели |
| Testnet | Нет | Н/Д |

## Быстрый старт

<Steps>
  <Step title="Get your API key">
    Получите ключ API на [панели управления Helius](https://dashboard.helius.dev/api-keys).
  </Step>

  <Step title="Query with advanced features">
    Получите все успешные транзакции кошелька между двумя датами, отсортированные хронологически:

    ```javascript theme={"system"}
    // Get successful transactions between Jan 1-31, 2025 in chronological order
    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',
            sortOrder: 'asc',
            limit: 1000,
            filters: {
              blockTime: {
                gte: 1735689600,   // Jan 1, 2025
                lt: 1738368000     // Before Feb 1, 2025
              },
              status: 'succeeded',  // Only successful transactions
              tokenAccounts: 'balanceChanged' // Include associated token accounts
            }
          }
        ]
      })
    });

    const data = await response.json();
    console.log('Successful transactions in January:', data.result.data);
    ```
  </Step>

  <Step title="Understand the parameters">
    В этом примере показаны основные возможности:

    * **transactionDetails**: задайте `'full'`, чтобы получить полные данные транзакций за один вызов
    * **sortOrder**: используйте `'asc'` для хронологического порядка (сначала старые) или `'desc'`, чтобы сначала получить новые
    * **filters.blockTime**: задайте диапазоны времени с помощью `gte` (больше или равно) и `lte` (меньше или равно)
    * **filters.status**: отфильтруйте только транзакции `'succeeded'` или `'failed'`
    * **filters.tokenAccounts**: включите переводы, выпуски и сжигания для связанных токен-аккаунтов
  </Step>
</Steps>

## Параметры запроса

<ParamField body="address" type="string" required>
  Закодированный в Base-58 публичный ключ аккаунта, для которого запрашивается история транзакций
</ParamField>

<ParamField body="transactionDetails" type="string" default="signatures">
  Уровень детализации возвращаемых транзакций:

  * `signatures`: основные сведения о подписи (быстрее)
  * `full`: полные данные транзакции (устраняют необходимость в вызовах getTransaction, поддерживается лимит до 1 000)
</ParamField>

<ParamField body="sortOrder" type="string" default="desc">
  Порядок сортировки результатов:

  * `desc`: сначала новые (по умолчанию)
  * `asc`: сначала старые (хронологический порядок, удобен для анализа истории)
</ParamField>

<ParamField body="limit" type="number" default="1000">
  Максимальное количество возвращаемых транзакций:

  * До 1000 при `transactionDetails: "signatures"`
  * До 1000 при `transactionDetails: "full"`
</ParamField>

<ParamField body="paginationToken" type="string">
  Токен пагинации из предыдущего ответа (формат: `"slot:position"`)
</ParamField>

<ParamField body="commitment" type="string" default="finalized">
  Уровень подтверждения: `finalized` или `confirmed`. Уровень подтверждения `processed` не поддерживается.
</ParamField>

<ParamField body="filters" type="object">
  Расширенные параметры фильтрации для сужения результатов.
</ParamField>

<ParamField body="filters.slot" type="object">
  Фильтрация по номеру слота с помощью операторов сравнения: `gte`, `gt`, `lte`, `lt`

  Пример: `{ "slot": { "gte": 1000, "lte": 2000 } }`
</ParamField>

<ParamField body="filters.blockTime" type="object">
  Фильтрация по временной метке Unix с помощью операторов сравнения: `gte`, `gt`, `lte`, `lt`, `eq`

  Пример: `{ "blockTime": { "gte": 1640995200, "lte": 1641081600 } }`
</ParamField>

<ParamField body="filters.signature" type="object">
  Фильтрация по подписи транзакции с помощью операторов сравнения: `gte`, `gt`, `lte`, `lt`

  Пример: `{ "signature": { "lt": "SIGNATURE_STRING" } }`
</ParamField>

<ParamField body="filters.status" type="string">
  Фильтрация по статусу успеха или сбоя транзакции:

  * `succeeded`: только успешные транзакции
  * `failed`: только неудачные транзакции
  * `any`: успешные и неудачные транзакции (по умолчанию)

  Пример: `{ "status": "succeeded" }`
</ParamField>

<ParamField body="filters.tokenAccounts" type="string" default="none">
  Фильтрация транзакций для связанных токен-аккаунтов:

  * `none`: возвращать только транзакции, которые ссылаются на указанный адрес (по умолчанию)
  * `balanceChanged`: возвращать транзакции, которые ссылаются на указанный адрес или изменяют баланс принадлежащего ему токен-аккаунта (рекомендуется)
  * `all`: возвращать транзакции, которые ссылаются на указанный адрес или любой принадлежащий ему токен-аккаунт

  Пример: `{ "tokenAccounts": "balanceChanged" }`
</ParamField>

<ParamField body="filters.tokenTransfer" type="object">
  Фильтрация транзакций, в которых запрашиваемый адрес участвовал в переводе токенов, соответствующем контрагенту, направлению, выпуску или диапазону необработанной суммы. Все поля необязательны и объединяются по логике AND.

  Пример: `{ "tokenTransfer": { "direction": "in", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } }`
</ParamField>

<ParamField body="filters.tokenTransfer.with" type="string">
  Адрес контрагента. Соответствует переводам, на другой стороне которых находится этот адрес.
</ParamField>

<ParamField body="filters.tokenTransfer.direction" type="string" default="any">
  Фильтрация по направлению перевода относительно запрашиваемого адреса:

  * `in`: переводы, полученные запрашиваемым адресом
  * `out`: переводы, отправленные запрашиваемым адресом
  * `any`: входящие и исходящие переводы
</ParamField>

<ParamField body="filters.tokenTransfer.mint" type="string">
  Выпуск токена, по которому выполняется фильтрация.
</ParamField>

<ParamField body="filters.tokenTransfer.amount" type="object">
  Сравнение суммы с использованием необработанного значения в блокчейне, а не значения для интерфейса или значения с учётом десятичных знаков. Поддерживает `gt`, `gte`, `lt` и `lte`.
</ParamField>

<ParamField body="encoding" type="string">
  Формат кодирования данных транзакции (применяется только при `transactionDetails: "full"`). Такой же, как в API `getTransaction`. Варианты: `json`, `jsonParsed`, `base64`, `base58`
</ParamField>

<ParamField body="maxSupportedTransactionVersion" type="number">
  Задайте максимальную возвращаемую версию транзакции. Если параметр не указан, будут возвращены только устаревшие транзакции. Задайте `1`, чтобы включить устаревшие транзакции, а также транзакции v0 и v1.
</ParamField>

<ParamField body="minContextSlot" type="number">
  Минимальный слот, в котором можно обработать запрос
</ParamField>

### Учёт использования

Успешные ответы учитываются в зависимости от возвращаемых данных:

| Тип ответа | Кредиты |
| - | - |
| Полные транзакции | 10 кредитов за каждые 100 возвращённых транзакций с округлением вверх; минимум 10 кредитов |
| Только подписи | Фиксированные 10 кредитов независимо от количества |
| Неудачные ответы API | Бесплатно |

## Ответ

Структура ответа зависит от `transactionDetails`. Режим подписей возвращает компактные записи подписей, а полный режим — полные объекты транзакций и метаданных.

<Tabs>
  <Tab title="Signatures Response">
    ```json theme={"system"}
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "data": [
          {
            "signature": "5h6xBEauJ3PK6SWCZ1PGjBvj8vDdWG3KpwATGy1ARAXFSDwt8GFXM7W5Ncn16wmqokgpiKRLuS83KUxyZyv2sUYv",
            "slot": 1054,
            "transactionIndex": 42,
            "err": null,
            "memo": null,
            "blockTime": 1641038400,
            "confirmationStatus": "finalized"
          }
        ],
        "paginationToken": "1055:5"
      }
    }
    ```
  </Tab>

  <Tab title="Full Transaction Response">
    ```json theme={"system"}
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "data": [
          {
            "slot": 1054,
            "transactionIndex": 42,
            "blockTime": 1641038400,
            "transaction": {
              "signatures": ["5h6xBEauJ3PK6SWCZ1PGjBvj8vDdWG3KpwATGy1ARAXFSDwt8GFXM7W5Ncn16wmqokgpiKRLuS83KUxyZyv2sUYv"],
              "message": {
                "accountKeys": ["...", "..."],
                "instructions": [...],
                // Complete transaction structure
              }
            },
            "meta": {
              "err": null,
              "fee": 5000,
              "preBalances": [1000000, 2000000],
              "postBalances": [999995000, 2000000],
              "preTokenBalances": [
                {
                  "accountIndex": 1,
                  "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
                  "owner": "...",
                  "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
                  "uiTokenAmount": {
                    "amount": "1500000",
                    "decimals": 6,
                    "uiAmount": 1.5,
                    "uiAmountString": "1.5"
                  }
                }
              ],
              "postTokenBalances": [
                {
                  "accountIndex": 1,
                  "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
                  "owner": "...",
                  "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
                  "uiTokenAmount": {
                    "amount": "500000",
                    "decimals": 6,
                    "uiAmount": 0.5,
                    "uiAmountString": "0.5"
                  }
                }
              ],
              "innerInstructions": [...],
              "logMessages": [...],
              "computeUnitsConsumed": 2100
              // Complete metadata — same shape as getTransaction
            }
          }
        ],
        "paginationToken": "1055:5"
      }
    }
    ```
  </Tab>
</Tabs>

### Поля ответа

| Поле | Тип | Описание |
| - | - | - |
| `signature` | string | Подпись транзакции (в кодировке Base-58). Только в режиме подписей. |
| `slot` | number | Слот, содержащий блок с этой транзакцией. |
| `transactionIndex` | number | Отсчитываемый от нуля индекс транзакции в её блоке. Полезен для упорядочивания транзакций и реконструкции блоков. |
| `blockTime` | number \| null | Расчётное время создания в виде временной метки Unix (секунды с начала эпохи). |
| `err` | object \| null | Ошибка, если транзакция завершилась неудачно; null при успехе. Только в режиме подписей. |
| `memo` | string \| null | Мемо, связанное с транзакцией. Только в режиме подписей. |
| `confirmationStatus` | string | Статус подтверждения транзакции в кластере. Только в режиме подписей. |
| `transaction` | object | Полные данные транзакции. Только в полном режиме. |
| `meta` | object | Метаданные статуса транзакции — та же структура, что и у `getTransaction`, включая `err`, `fee`, `preBalances`/`postBalances`, `preTokenBalances`/`postTokenBalances`, `innerInstructions`, `logMessages` и `computeUnitsConsumed`. Только в полном режиме. |
| `paginationToken` | string \| null | Токен для получения следующей страницы или null, если результатов больше нет. |

Поле `transactionIndex` доступно только в `getTransactionsForAddress`. Другие похожие конечные точки, такие как `getSignaturesForAddress`, `getTransaction` и `getTransactions`, не содержат этого поля.

В полном режиме `meta` представляет собой полный объект метаданных транзакции, структура которого идентична результату `getTransaction`. Он содержит `preTokenBalances` и `postTokenBalances`, поэтому изменения балансов токенов можно вычислять непосредственно из ответа без дополнительных вызовов — например, для обнаружения обменов.

## Фильтры

Для `slot`, `blockTime` и `signature` можно использовать операторы сравнения, а также специальные фильтры `status`, `tokenAccounts` и `tokenTransfer`. При объединении нескольких фильтров результат сужается до их пересечения.

### Операторы сравнения

Эти операторы работают как запросы к базе данных и позволяют точно управлять диапазоном данных.

| Оператор | Полное название | Описание | Пример |
| - | - | - | - |
| `gte` | Больше или равно | Включить значения ≥ указанного | `slot: { gte: 100 }` |
| `gt` | Больше | Включить значения > указанного | `blockTime: { gt: 1641081600 }` |
| `lte` | Меньше или равно | Включить значения ≤ указанного | `slot: { lte: 2000 }` |
| `lt` | Меньше | Включить значения \< указанного | `blockTime: { lt: 1641168000 }` |
| `eq` | Равно | Включить точно равные значения (только `blockTime`) | `blockTime: { eq: 1641081600 }` |

### Фильтры перечислений

| Фильтр | Описание | Значения |
| - | - | - |
| `status` | Фильтрация транзакций по успешному или неудачному результату | `succeeded`, `failed` или `any` |
| `tokenAccounts` | Фильтрация транзакций для связанных токен-аккаунтов | `none`, `balanceChanged` или `all` |

Примеры объединённых фильтров:

```javascript theme={"system"}
// Time range with successful transactions only
"filters": {
  "blockTime": {
    "gte": 1640995200,
    "lte": 1641081600
  },
  "status": "succeeded"
}

// Slot range
"filters": {
  "slot": {
    "gte": 1000,
    "lte": 2000
  }
}

// Only failed transactions
"filters": {
  "status": "failed"
}
```

### Связанные токен-аккаунты

В Solana кошелёк не хранит токены напрямую. Вместо этого кошельку принадлежат токен-аккаунты, в которых и хранятся токены. Когда кто-либо отправляет вам USDC, они поступают на ваш токен-аккаунт USDC, а не на основной адрес кошелька.

Этот метод уникален тем, что позволяет запрашивать **полную историю токенов**, включая связанные токен-аккаунты (ATA) кошелька. Нативные RPC-методы, такие как `getSignaturesForAddress`, не включают ATA.

Фильтр `tokenAccounts` управляет этим поведением:

* **`none`** (по умолчанию): возвращает только транзакции, которые напрямую ссылаются на адрес кошелька. Используйте этот вариант, если вас интересуют только прямые взаимодействия с кошельком.
* **`balanceChanged`** (рекомендуется): возвращает транзакции, которые ссылаются на адрес кошелька или изменяют баланс принадлежащего кошельку токен-аккаунта. Спам и несвязанные операции, такие как сбор комиссий или делегирование, исключаются, что позволяет получить чистое представление о значимой активности кошелька.
* **`all`**: возвращает все транзакции, которые ссылаются на адрес кошелька или любой принадлежащий ему токен-аккаунт.

Фильтр `tokenAccounts` не поддерживает транзакции до декабря 2022 года. Он зависит от метаданных переводов токенов, добавленных в Solana в слоте 111,491,819. Для охвата более ранней активности см. [обходное решение для исторических токен-аккаунтов](#ограничения-и-особые-случаи).

### Фильтр переводов токенов

Фильтр `tokenTransfer` сужает результаты до транзакций, в которых запрашиваемый адрес участвовал в переводе токенов, соответствующем определённым критериям: конкретному контрагенту, выпуску, направлению или диапазону суммы.

Используйте его, чтобы отвечать на такие вопросы:

* Когда этот кошелёк получил USDC от определённого контрагента?
* Покажите все исходящие переводы на сумму более 1 000 токенов.
* Когда этот кошелёк взаимодействовал с этим конкретным выпуском?

Фильтр представляет собой необязательное поле внутри объекта `filters` в конфигурации запроса:

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "<address>",
    {
      "filters": {
        "tokenTransfer": {}
      }
    }
  ]
}
```

Все поля внутри `tokenTransfer` необязательны. Несколько полей объединяются по логике AND.

| Поле | Тип | Значение по умолчанию | Описание |
| - | - | - | - |
| `with` | string (pubkey) | - | Адрес контрагента. Соответствует переводам, на другой стороне которых находится этот адрес. |
| `direction` | `"in"` \| `"out"` \| `"any"` | `"any"` | Получал ли запрашиваемый адрес средства, отправлял их или выполнял любое из этих действий. |
| `mint` | string (pubkey) | - | Выпуск токена, по которому выполняется фильтрация. |
| `amount` | object | - | Сравнение суммы. Используется необработанное значение в блокчейне, а не значение для интерфейса или значение с учётом десятичных знаков. |

Операторы диапазона сумм:

| Оператор | Значение |
| - | - |
| `gt` | Строго больше |
| `gte` | Больше или равно |
| `lt` | Строго меньше |
| `lte` | Меньше или равно |

Операторы сумм можно объединять, например `{ "gte": 1000000, "lte": 5000000 }` для замкнутого диапазона. `tokenTransfer` сочетается с другими фильтрами верхнего уровня (`slot`, `blockTime`, `status` и `tokenAccounts`); итоговый результат представляет собой их пересечение.

## Примеры

### Аналитика по времени

Создайте ежемесячные отчёты по транзакциям:

```javascript theme={"system"}
// Get all successful transactions for January 2025
const startTime = Math.floor(new Date('2025-01-01').getTime() / 1000);
const endTime = Math.floor(new Date('2025-02-01').getTime() / 1000);

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "WALLET_OR_PROGRAM_ADDRESS",
    {
      "transactionDetails": "signatures",
      "filters": {
        "blockTime": {
          "gte": startTime,
          "lt": endTime
        },
        "status": "succeeded"
      },
      "limit": 1000
    }
  ]
}
```

Обработайте данные для аналитики:

```javascript theme={"system"}
// Calculate daily transaction volume
const dailyStats = {};
response.result.data.forEach(tx => {
  const date = new Date(tx.blockTime * 1000).toISOString().split('T')[0];
  dailyStats[date] = (dailyStats[date] || 0) + 1;
});

console.log('Daily Transaction Counts:', dailyStats);
```

### Создание выпуска токена

Найдите транзакцию создания выпуска для определённого токена:

```javascript theme={"system"}
{
  "jsonrpc": "2.0",
  "id": "find-first-mints",
  "method": "getTransactionsForAddress",
  "params": [
    MINT_ADDRESS, // Token mint address
    {
      "encoding": "jsonParsed",
      "maxSupportedTransactionVersion": 1,
      "sortOrder": "asc",  // Chronological order from the beginning
      "limit": 10,
      "transactionDetails": "full"
    }
  ]
}
```

Для создания пула ликвидности запросите адрес пула:

```javascript theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress", 
  "params": [
    "POOL_ADDRESS_HERE", // Raydium/Meteora pool address
    {
      "transactionDetails": "full",
      "sortOrder": "asc",  // First transaction is usually pool creation
      "limit": 1
    }
  ]
}
```

Так можно определить точный момент создания выпуска токена или пула ликвидности, включая адрес создателя и исходные параметры.

### Транзакции пополнения

Найдите, кто пополнил определённый адрес:

```javascript theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransactionsForAddress",
  "params": [
    "TARGET_WALLET_ADDRESS",
    {
      "transactionDetails": "full",
      "sortOrder": "asc",  // Oldest first
      "limit": 10
    }
  ]
}
```

Затем проанализируйте данные транзакции, чтобы найти переводы SOL:

```javascript theme={"system"}
response.result.data.forEach(tx => {
  // Look for SOL transfers in preBalances/postBalances
  const balanceChanges = tx.meta.preBalances.map((pre, index) => 
    tx.meta.postBalances[index] - pre
  );
  
  // Positive balance change = incoming SOL
  balanceChanges.forEach((change, index) => {
    if (change > 0) {
      console.log(`Received ${change} lamports from ${tx.transaction.message.accountKeys[index]}`);
    }
  });
});
```

Первые несколько транзакций часто указывают источник финансирования и помогают определить связанные адреса или закономерности пополнения.

### Переводы токенов

Выполните фильтрацию по `tokenTransfer`, чтобы выделить определённые перемещения токенов.

Поступления USDC на адрес:

```json theme={"system"}
{
  "filters": {
    "tokenTransfer": {
      "direction": "in",
      "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
    }
  }
}
```

Крупные исходящие переводы определённому контрагенту:

```json theme={"system"}
{
  "filters": {
    "tokenTransfer": {
      "with": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "direction": "out",
      "amount": { "gte": 1000000000 }
    }
  }
}
```

В сочетании с диапазоном слотов и статусом:

```json theme={"system"}
{
  "filters": {
    "status": "succeeded",
    "slot": { "gte": 100000000, "lte": 200000000 },
    "tokenTransfer": {
      "direction": "in",
      "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "amount": { "gte": 5000000 }
    }
  }
}
```

## Пагинация

Если количество транзакций превышает установленный лимит, используйте `paginationToken` из ответа, чтобы получить следующую страницу. Токен представляет собой простую строку в формате `"slot:position"`, которая указывает API, откуда продолжить.

Используйте токен пагинации из каждого ответа для получения следующей страницы:

```javascript theme={"system"}
// First request
let paginationToken = null;
let allTransactions = [];

const getNextPage = async (paginationToken = null) => {
  const params = [
    'ADDRESS',
    {
      transactionDetails: 'signatures',
      limit: 100,
      ...(paginationToken && { paginationToken })
    }
  ];

  const response = await fetch(rpcUrl, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 1,
      method: 'getTransactionsForAddress',
      params
    })
  });

  const data = await response.json();
  return data.result;
};

// Paginate through all results
do {
  const result = await getNextPage(paginationToken);
  allTransactions.push(...result.data);
  paginationToken = result.paginationToken;
  
  console.log(`Fetched ${result.data.length} transactions, total: ${allTransactions.length}`);
} while (paginationToken);
```

### Несколько адресов

Нельзя запросить несколько адресов в одном запросе. Запрос каждого адреса считается отдельным запросом API и учитывается соответствующим образом. Чтобы получить транзакции для нескольких адресов, запросите каждый адрес в одном и том же временном окне или диапазоне слотов, а затем объедините и отсортируйте результаты:

```javascript theme={"system"}
const addresses = ['Address1...', 'Address2...', 'Address3...'];

// Query all addresses in parallel with slot filter
const results = await Promise.all(
  addresses.map(address => 
    fetch(rpcUrl, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 1,
        method: 'getTransactionsForAddress',
        params: [address, {
          sortOrder: 'desc',
          filters: { slot: { gt: 250000000 } }
        }]
      })
    }).then(r => r.json())
  )
);

// Merge and sort by slot
const allTransactions = results
  .flatMap(r => r.result.data)
  .sort((a, b) => b.slot - a.slot);
```

Для более масштабного сканирования истории последовательно перебирайте временные окна или диапазоны слотов (например, по 1000 слотов) и повторяйте этот шаблон.

## Рекомендации

**Производительность.** Используйте `transactionDetails: "signatures"`, если полные данные транзакций не нужны. Устанавливайте разумные размеры страниц для ускорения ответов и фильтруйте по диапазонам времени или конкретным слотам для более точных запросов.

**Фильтрация.** Начните с общих фильтров и постепенно сужайте результаты. Используйте временные фильтры для аналитики и создания отчётов. Объединяйте несколько фильтров для точных запросов по определённым типам транзакций или периодам времени.

**Пагинация.** Сохраняйте токены пагинации, если позже потребуется возобновить крупные запросы. Отслеживайте глубину пагинации при планировании производительности. Используйте порядок по возрастанию, когда нужно воспроизвести исторические события в хронологическом порядке.

**Обработка ошибок.** Корректно обрабатывайте ограничения частоты запросов с помощью экспоненциальной задержки. Проверяйте адреса перед отправкой запросов и при необходимости кэшируйте результаты, чтобы сократить использование API.

## Ограничения и особые случаи

Небольшой набор адресов направляется в устаревший архив, ограничен резервным сканированием слотов или возвращает пустой результат. Для обнаружения токен-аккаунтов до слота 111,491,819 также требуется обходное решение. Разверните разделы ниже, чтобы получить полную информацию.

<Accordion title="Unsupported and specially-routed addresses">
  **Перенаправление в старый архив.** Запросы для этих адресов направляются в нашу старую архивную систему.

  | Адрес | Название |
  | - | - |
  | `Stake11111111111111111111111111111111111111` | [Программа стейкинга](https://orbmarkets.io/address/Stake11111111111111111111111111111111111111/history) |
  | `StakeConfig11111111111111111111111111111111` | [Конфигурация стейкинга](https://orbmarkets.io/address/StakeConfig11111111111111111111111111111111/history) |
  | `Sysvar1111111111111111111111111111111111111` | [Владелец Sysvar](https://orbmarkets.io/address/Sysvar1111111111111111111111111111111111111/history) |
  | `AddressLookupTab1e1111111111111111111111111` | [Таблица поиска адресов](https://orbmarkets.io/address/AddressLookupTab1e1111111111111111111111111/history) |
  | `BPFLoaderUpgradeab1e11111111111111111111111` | [Обновляемый загрузчик BPF](https://orbmarkets.io/address/BPFLoaderUpgradeab1e11111111111111111111111/history) |

  **Резервное сканирование слотов.** Запросы для этих адресов перенаправляются в нашу новую архивную систему и доступны через последовательное сканирование слотов (не более 100 слотов). Однако эти данные не индексируются.

  | Адрес | Название |
  | - | - |
  | `11111111111111111111111111111111` | [Системная программа](https://orbmarkets.io/address/11111111111111111111111111111111/history) |
  | `ComputeBudget111111111111111111111111111111` | [Бюджет вычислений](https://orbmarkets.io/address/ComputeBudget111111111111111111111111111111/history) |
  | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | [Программа Memo](https://orbmarkets.io/address/MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr/history) |
  | `Vote111111111111111111111111111111111111111` | [Программа голосования](https://orbmarkets.io/address/Vote111111111111111111111111111111111111111/history) |

  **Возвращается пустой результат (`is_reserved_address`).** Запросы перенаправляются в нашу новую архивную систему, однако данные не индексируются, поэтому запросы возвращают пустой результат.

  | Адрес | Название |
  | - | - |
  | `BPFLoader1111111111111111111111111111111111` | [Загрузчик BPF (устарел)](https://orbmarkets.io/address/BPFLoader1111111111111111111111111111111111/history) |
  | `BPFLoader2111111111111111111111111111111111` | [Загрузчик BPF](https://orbmarkets.io/address/BPFLoader2111111111111111111111111111111111/history) |
  | `Config1111111111111111111111111111111111111` | [Программа конфигурации](https://orbmarkets.io/address/Config1111111111111111111111111111111111111/history) |
  | `Ed25519SigVerify111111111111111111111111111` | [Программа Ed25519](https://orbmarkets.io/address/Ed25519SigVerify111111111111111111111111111/history) |
  | `Feature111111111111111111111111111111111111` | [Программа функций](https://orbmarkets.io/address/Feature111111111111111111111111111111111111/history) |
  | `KeccakSecp256k11111111111111111111111111111` | [Программа Secp256k1](https://orbmarkets.io/address/KeccakSecp256k11111111111111111111111111111/history) |
  | `LoaderV411111111111111111111111111111111111` | [Загрузчик V4](https://orbmarkets.io/address/LoaderV411111111111111111111111111111111111/history) |
  | `NativeLoader1111111111111111111111111111111` | [Нативный загрузчик](https://orbmarkets.io/address/NativeLoader1111111111111111111111111111111/history) |
  | `SysvarC1ock11111111111111111111111111111111` | [Sysvar часов](https://orbmarkets.io/address/SysvarC1ock11111111111111111111111111111111/history) |
  | `SysvarEpochSchedu1e111111111111111111111111` | [Sysvar расписания эпох](https://orbmarkets.io/address/SysvarEpochSchedu1e111111111111111111111111/history) |
  | `SysvarFees111111111111111111111111111111111` | [Sysvar комиссий](https://orbmarkets.io/address/SysvarFees111111111111111111111111111111111/history) |
  | `Sysvar1nstructions1111111111111111111111111` | [Sysvar инструкций](https://orbmarkets.io/address/Sysvar1nstructions1111111111111111111111111/history) |
  | `SysvarRecentB1ockHashes11111111111111111111` | [Sysvar недавних хешей блоков](https://orbmarkets.io/address/SysvarRecentB1ockHashes11111111111111111111/history) |
  | `SysvarRent111111111111111111111111111111111` | [Sysvar ренты](https://orbmarkets.io/address/SysvarRent111111111111111111111111111111111/history) |
  | `SysvarRewards111111111111111111111111111111` | [Sysvar вознаграждений](https://orbmarkets.io/address/SysvarRewards111111111111111111111111111111/history) |
  | `SysvarS1otHashes111111111111111111111111111` | [Sysvar хешей слотов](https://orbmarkets.io/address/SysvarS1otHashes111111111111111111111111111/history) |
  | `SysvarS1otHistory11111111111111111111111111` | [Sysvar истории слотов](https://orbmarkets.io/address/SysvarS1otHistory11111111111111111111111111/history) |
  | `SysvarStakeHistory1111111111111111111111111` | [Sysvar истории стейкинга](https://orbmarkets.io/address/SysvarStakeHistory1111111111111111111111111/history) |
  | `SysvarEpochRewards11111111111111111111111111` | [Sysvar вознаграждений эпохи](https://orbmarkets.io/address/SysvarEpochRewards11111111111111111111111111/history) |
  | `SysvarLastRestartS1ot1111111111111111111111` | [Sysvar слота последнего перезапуска](https://orbmarkets.io/address/SysvarLastRestartS1ot1111111111111111111111/history) |
</Accordion>

<Accordion title="Workaround: historical token account discovery (before slot 111,491,819)">
  Для адресов с активностью токен-аккаунтов до слота 111,491,819 фильтр `tokenAccounts` не может определить владельца, поскольку поля `owner` в метаданных баланса токенов тогда ещё не существовало. Чтобы получить полные результаты, можно вручную обнаружить эти токен-аккаунты, разобрав инструкции ранних транзакций, а затем параллельно запросить `getTransactionsForAddress` для каждого из них.

  ```javascript theme={"system"}
  const HELIUS_RPC = "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY";
  const OWNER_CUTOFF_SLOT = 111_491_819;

  async function rpcCall(method, params) {
    const res = await fetch(HELIUS_RPC, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ jsonrpc: "2.0", id: "1", method, params }),
    });
    const json = await res.json();
    if (json.error) throw new Error(json.error.message);
    return json.result;
  }

  // Step 1: Discover token accounts owned by the address before the cutoff slot
  // by parsing initializeAccount instructions and transfer authorities.
  async function discoverHistoricalTokenAccounts(address) {
    const tokenAccounts = new Set();
    let paginationToken = null;

    do {
      const result = await rpcCall("getTransactionsForAddress", [
        address,
        {
          transactionDetails: "full",
          encoding: "jsonParsed",
          maxSupportedTransactionVersion: 1,
          sortOrder: "asc",
          limit: 100,
          filters: { slot: { lt: OWNER_CUTOFF_SLOT } },
          ...(paginationToken && { paginationToken }),
        },
      ]);
      if (!result?.data?.length) break;

      for (const entry of result.data) {
        const tx = entry.transaction;
        const meta = entry.meta;
        if (!tx || !meta) continue;

        const allInstructions = [
          ...(tx.message?.instructions ?? []),
          ...(meta.innerInstructions ?? []).flatMap((inner) => inner.instructions ?? []),
        ];

        for (const ix of allInstructions) {
          // AToken program "create" instruction
          if (ix.program === "spl-associated-token-account") {
            if (ix.parsed?.type === "create" && ix.parsed.info?.wallet === address && ix.parsed.info?.account) {
              tokenAccounts.add(ix.parsed.info.account);
            }
            continue;
          }

          if (ix.program !== "spl-token" && ix.program !== "spl-token-2022") continue;
          const type = ix.parsed?.type;
          const info = ix.parsed?.info;

          // Token account initialization
          if (type === "initializeAccount" || type === "initializeAccount2" || type === "initializeAccount3") {
            if (info?.owner === address && info?.account) tokenAccounts.add(info.account);
          }

          // Transfers where our address is the authority (source account is ours)
          if (type === "transfer" || type === "transferChecked") {
            if (info?.authority === address && info?.source) tokenAccounts.add(info.source);
          }
        }
      }
      paginationToken = result.paginationToken;
    } while (paginationToken);

    return Array.from(tokenAccounts);
  }

  // Step 2: Fetch all signatures for an address with pagination
  async function fetchAllSignatures(address, filters) {
    const allSignatures = [];
    let paginationToken = null;

    do {
      const result = await rpcCall("getTransactionsForAddress", [
        address,
        {
          transactionDetails: "signatures",
          sortOrder: "asc",
          limit: 1000,
          ...(filters && { filters }),
          ...(paginationToken && { paginationToken }),
        },
      ]);
      if (!result?.data?.length) break;
      allSignatures.push(...result.data);
      paginationToken = result.paginationToken;
    } while (paginationToken);

    return allSignatures;
  }

  // Step 3: Get complete history by combining tokenAccounts:"all" with
  // individual queries for historical token accounts
  async function getCompleteHistory(address) {
    const historicalAccounts = await discoverHistoricalTokenAccounts(address);

    if (historicalAccounts.length === 0) {
      return fetchAllSignatures(address, { tokenAccounts: "all" });
    }

    // Query main address with tokenAccounts:"all" + each historical account in parallel
    const results = await Promise.all([
      fetchAllSignatures(address, { tokenAccounts: "all" }),
      ...historicalAccounts.map((addr) => fetchAllSignatures(addr)),
    ]);

    // Merge and deduplicate by signature
    const seen = new Set();
    const merged = [];
    for (const batch of results) {
      for (const tx of batch) {
        if (!seen.has(tx.signature)) {
          seen.add(tx.signature);
          merged.push(tx);
        }
      }
    }
    return merged.sort((a, b) => a.slot - b.slot);
  }
  ```
</Accordion>

## Чем этот метод отличается от getSignaturesForAddress?

Если вы знакомы со стандартным методом `getSignaturesForAddress`, то `getTransactionsForAddress` объединяет многоэтапные процессы в один вызов и добавляет фильтрацию, сортировку и поддержку токен-аккаунтов. Пошаговое преобразование существующего кода описано в [руководстве по миграции](/docs/ru/rpc/migrate-to-gettransactionsforaddress).

### Получение полных транзакций одним вызовом

При использовании `getSignaturesForAddress` нужны два шага:

```javascript theme={"system"}
// Step 1: Get signatures
const signatures = await connection.getSignaturesForAddress(address, { limit: 1000 });

// Step 2: Get transaction details (1,000 additional calls!)
const transactions = await Promise.all(
  signatures.map(sig => connection.getTransaction(sig.signature))
);
```

С `getTransactionsForAddress` достаточно одного вызова:

```javascript theme={"system"}
const response = await fetch(heliusRpcUrl, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'getTransactionsForAddress',
    params: [
      address,
      {
        transactionDetails: 'full',
        limit: 1000
      }
    ]
  })
});
```

### Получение истории токенов одним вызовом

При использовании `getSignaturesForAddress` сначала нужно вызвать `getTokenAccountsByOwner`, а затем выполнить запрос для каждого токен-аккаунта:

```javascript theme={"system"}
// OLD WAY (with getSignaturesForAddress)
// Step 1: Get all token accounts owned by this wallet
const tokenAccounts = await connection.getTokenAccountsByOwner(
  new PublicKey(walletAddress),
  { programId: TOKEN_PROGRAM_ID }
);

// Step 2: Fetch signatures for the wallet itself
const walletSignatures = await connection.getSignaturesForAddress(
  new PublicKey(walletAddress),
  { limit: 1000 }
);

// Step 3: Fetch signatures for EVERY token account (this is the painful part)
const tokenAccountSignatures = await Promise.all(
  tokenAccounts.value.map(async (account) => {
    return connection.getSignaturesForAddress(
      account.pubkey,
      { limit: 1000 }
    );
  })
);

// Step 4: Merge all results together
const allSignatures = [
  ...walletSignatures,
  ...tokenAccountSignatures.flat()
];

// Step 5: Deduplicate (many transactions touch multiple accounts)
const seen = new Set();
const uniqueSignatures = allSignatures.filter((sig) => {
  if (seen.has(sig.signature)) {
    return false;
  }
  seen.add(sig.signature);
  return true;
});

// Step 6: Sort chronologically
const sortedSignatures = uniqueSignatures.sort(
  (a, b) => a.slot - b.slot
);

return sortedSignatures;
```

С `getTransactionsForAddress` достаточно задать `filters.tokenAccounts`:

```javascript theme={"system"}
// NEW WAY (with getTransactionsForAddress)
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: "helius-example",
    method: "getTransactionsForAddress",
    params: [
      walletAddress,
      {
        filters: {
          tokenAccounts: "all"
        },
        sortOrder: "asc",
        limit: 100
      }
    ]
  })
});

const { result } = await response.json();
return result;
```

### Дополнительные возможности

<CardGroup cols={2}>
  <Card title="Chronological sorting" icon="arrow-up">
    Сортируйте транзакции от старых к новым с помощью `sortOrder: 'asc'`.
  </Card>

  <Card title="Time-based filtering" icon="clock">
    Фильтруйте по диапазонам времени с помощью фильтров `blockTime`.
  </Card>

  <Card title="Status filtering" icon="filter">
    Получайте только успешные или неудачные транзакции с помощью фильтра `status`.
  </Card>

  <Card title="Simpler pagination" icon="list">
    Используйте `paginationToken` вместо запутанных подписей `before`/`until`.
  </Card>
</CardGroup>

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

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

  <Card title="getTransfersByAddress" icon="arrow-right-arrow-left" href="/docs/ru/rpc/gettransfersbyaddress">
    Разобранная история только переводов для платежей и сверки.
  </Card>

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

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


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