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

# API de contas históricas da Solana (Beta)

> Leia o estado de uma conta da Solana como ele estava em qualquer slot ou transação anterior com getHistoricalAccountInfo e getHistoricalTokenAccountsByOwner da Helius (beta).

> [!NOTE]
>
> O estado histórico das contas está em Beta. Parâmetros, preços, formatos de resposta e cobertura de dados podem mudar.

## O que é o estado histórico de uma conta?

Métodos RPC padrão da Solana, como `getAccountInfo` e `getTokenAccountsByOwner`, retornam apenas o estado atual de uma conta. Os validadores mantêm somente a versão mais recente de cada conta, portanto cada gravação substitui a anterior. O histórico de transações não preenche essa lacuna: `getTransaction` e `getBlock` retornam instruções, logs e alterações de saldo, não os dados da conta que um programa gravou.

Os métodos de contas históricas da Helius retornam as contas como elas estavam em um slot anterior ou logo após uma transação específica dentro desse slot. Como você pode ler o estado entre duas transações no mesmo slot, é possível ver exatamente o que uma transação alterou, mesmo quando uma conta é gravada várias vezes em um único slot. Use esses métodos para:

* Verificar os saldos de tokens de uma carteira em um determinado momento para auditorias, contabilidade ou declarações fiscais
* Depurar uma transação lendo as contas que ela acessou imediatamente antes e depois da execução
* Ler as contas de um protocolo, como pools, cofres ou oráculos, em um slot anterior sem precisar reproduzir o ledger por conta própria

Esses métodos RPC são exclusivos da Helius. Eles não fazem parte do RPC padrão da Solana.

## Qual método devo usar?

| O que você precisa | Use este método | Retorno |
| - | - | - |
| Uma conta em uma posição anterior | [`getHistoricalAccountInfo`](https://www.helius.dev/docs/pt-BR/api-reference/rpc/http/gethistoricalaccountinfo) | A conta ou `null`, caso ela não existisse |
| As contas de tokens de uma carteira em uma posição anterior | [`getHistoricalTokenAccountsByOwner`](https://www.helius.dev/docs/pt-BR/api-reference/rpc/http/gethistoricaltokenaccountsbyowner) | Uma página de contas SPL Token e Token-2022, opcionalmente para um único mint |

Ambos recebem os mesmos três parâmetros: um endereço, um objeto de consulta que seleciona a posição no histórico e um objeto de configuração.

## Disponibilidade e preços

* **Planos**: [planos](https://www.helius.dev/docs/pt-BR/billing/plans.md) Business e superiores.
* **Custo**: 0 créditos por chamada durante a fase beta (preços sujeitos a alterações).
* **Limites de taxa**: `getHistoricalAccountInfo` permite 100 solicitações por segundo, com um pico máximo de 100. `getHistoricalTokenAccountsByOwner` permite 10 solicitações por segundo, com um pico máximo de 10. Esses limites são separados do limite de taxa de RPC do seu plano, e as solicitações que os excederem retornarão HTTP `429`. Consulte [limites de taxa](https://www.helius.dev/docs/pt-BR/billing/rate-limits.md).
* **Rede**: somente Mainnet. Chame-os no endpoint padrão da mainnet, `https://mainnet.helius-rpc.com`, ou no endpoint do [Gatekeeper](https://www.helius.dev/docs/pt-BR/gatekeeper/overview.md), `https://beta.helius-rpc.com`. A devnet retorna o erro `-32601`.

## Cobertura de dados

O histórico está disponível a partir do slot 444.959.999 (7 de setembro de 2026). Esse é o último slot da época 1029, portanto ele contém o estado no início da época 1030. Solicitações de slots anteriores retornam o erro `-32018` ("Histórico da conta indisponível").

## Escolha uma posição no histórico

O segundo parâmetro é um objeto de consulta com dois campos opcionais, `slot` e `transactionIndex`:

| Consulta | Retorna o estado |
| - | - |
| Omitido ou `{}` | No slot indexado mais recente, limitado pelo commitment solicitado |
| `{ "slot": 445000000 }` | No final do slot 445.000.000, após todas as transações e quaisquer gravações não relacionadas a transações, como recompensas de época |
| `{ "slot": 445000000, "transactionIndex": 10 }` | Imediatamente após a execução da transação no índice 10 do slot 445.000.000 |

`transactionIndex` exige `slot`.

Gravações não relacionadas a transações, como recompensas de época, são aplicadas no final do slot. Uma consulta com `transactionIndex` nunca as inclui, mesmo para a última transação do slot. Para incluí-las, consulte o `slot` sem `transactionIndex`.

### Leia o estado antes e depois de uma transação

Para inspecionar o que uma transação alterou, leia a conta duas vezes:

* **Depois da transação**: consulte os próprios `slot` e `transactionIndex` dela.
* **Antes da transação**: consulte o mesmo `slot` com `transactionIndex` menos 1. Se a transação for a primeira do slot (índice 0), consulte o slot anterior sem `transactionIndex`.

[`getTransactionsForAddress`](https://www.helius.dev/docs/pt-BR/rpc/gettransactionsforaddress) retorna `slot` e `transactionIndex` para cada transação. Assim, você pode encontrar a posição de uma transação nesse método e passá-la diretamente para estes métodos.

```bash theme={"system"}
# State of the account right after the transaction at index 10 in slot 445000000
curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": "1",
    "method": "getHistoricalAccountInfo",
    "params": [
      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      { "slot": 445000000, "transactionIndex": 10 },
      { "encoding": "jsonParsed" }
    ]
  }'
```

## Entenda lastUpdatedAt

Cada conta retornada inclui `lastUpdatedAt`, a posição da gravação que produziu o estado recebido:

```json theme={"system"}
"lastUpdatedAt": { "slot": 444999837, "transactionIndex": 700 }
```

* **`slot` e `transactionIndex`** apontam para a última gravação na posição consultada ou antes dela. No exemplo acima, uma consulta ao slot 445.000.000 retornou o estado gravado pela última vez pela transação no índice 700 do slot 444.999.837.
* **`transactionIndex: null`** significa que a gravação ocorreu fora de uma transação, como no caso de recompensas de época.
* **`slot: 444959999` com `transactionIndex: null`** significa que a conta não mudou desde o início da cobertura do histórico. Isso não significa que a conta foi gravada nesse slot.

## O que significa um valor null

`value` é `null` quando a conta não existia na posição consultada. Ela ainda não havia sido criada ou já havia sido encerrada.

* **Uma resposta `null` não contém `lastUpdatedAt`**, portanto ela não informa quando a conta foi criada ou encerrada. Para encontrar essas transações, use [`getTransactionsForAddress`](https://www.helius.dev/docs/pt-BR/rpc/gettransactionsforaddress).
* **Um endereço que nunca existiu** também retorna `null`, não um erro.
* **Um slot anterior à cobertura do histórico** retorna o erro `-32018` para todos os endereços, independentemente de a conta ter existido ou não.

## Percorra o histórico da conta em ordem reversa

Use `lastUpdatedAt` como cursor para listar todos os estados que uma conta já teve, começando pelo mais recente. Após cada leitura, consulte a posição imediatamente anterior à gravação recebida:

| `lastUpdatedAt` recebido | Próxima consulta |
| - | - |
| `{ "slot": S, "transactionIndex": N }`, em que N é maior que 0 | `{ "slot": S, "transactionIndex": N - 1 }` |
| `{ "slot": S, "transactionIndex": 0 }` | `{ "slot": S - 1 }` |
| `{ "slot": S, "transactionIndex": null }` | `{ "slot": S - 1 }` |

Pare quando `value` for `null`. Isso significa que a gravação que você acabou de ultrapassar criou a conta. Pare também quando `lastUpdatedAt.slot` chegar a 444.959.999, o início da cobertura do histórico.

```typescript theme={"system"}
const url = `https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`;
const COVERAGE_START_SLOT = 444959999;

type Position = { slot?: number; transactionIndex?: number };

async function getAccountHistory(address: string, start: Position = {}, maxStates = 100) {
  const states = [];
  let position = start;

  while (states.length < maxStates) {
    const response = await fetch(url, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "1",
        method: "getHistoricalAccountInfo",
        params: [address, position, { encoding: "base64" }],
      }),
    });
    const { result, error } = await response.json();
    if (error) throw new Error(`${error.code}: ${error.message}`);

    const account = result.value;
    if (!account) break; // The account didn't exist before this write

    states.push(account);
    const { slot, transactionIndex } = account.lastUpdatedAt;
    if (slot <= COVERAGE_START_SLOT) break; // Reached the start of history coverage

    // Step to the position just before this write
    position = transactionIndex ? { slot, transactionIndex: transactionIndex - 1 } : { slot: slot - 1 };
  }

  return states; // Newest first
}
```

* **Contas que estão encerradas atualmente** retornam `null` no slot mais recente. Passe uma posição `start` de quando a conta ainda existia.
* **Gravações não relacionadas a transações** avançam para o slot anterior. Se a mesma conta também tiver sido gravada por uma transação anterior nesse slot, o percurso ignorará esse estado.
* **Para avançar no tempo**, liste as transações da conta da mais antiga para a mais recente com [`getTransactionsForAddress`](https://www.helius.dev/docs/pt-BR/rpc/gettransactionsforaddress) e `sortOrder: "asc"`. Depois, leia o estado nos valores `slot` e `transactionIndex` de cada transação.

## Contexto da resposta

`context.slot` em cada resposta é o slot mais recente que a Helius havia indexado quando processou a solicitação. Ele não é o slot que você consultou. Use o `slot` da sua solicitação ou `lastUpdatedAt` para interpretar os dados recebidos.

## Paginação consistente

`getHistoricalTokenAccountsByOwner` retorna os resultados uma página por vez. Cada resposta inclui `value.accounts` e `value.paginationKey`.

* **Passe `paginationKey` novamente** no objeto de configuração para buscar a próxima página.
* **Pare somente quando `paginationKey` for `null`.** Uma página pode ter poucos resultados ou estar vazia e ainda assim haver mais resultados depois dela.
* **Fixe `slot` em todas as páginas.** Se você omitir `slot`, cada página lerá o slot indexado mais recente, e suas páginas poderão vir de momentos diferentes.
* **Defina `limit`** entre 1 e 5.000. O padrão é 5.000.

## Codificações e dados analisados

* **As codificações compatíveis** são `base64` (o padrão), `base64+zstd` e `jsonParsed`. `base58` e `binary` não são compatíveis.
* **Contas de tokens `jsonParsed`** usam as casas decimais do mint na posição consultada. Assim, os valores permanecem corretos mesmo que o mint tenha sido alterado desde então. Se o mint não puder ser lido nessa posição, a conta usará base64 como alternativa.
* **`dataSlice`** funciona da mesma forma que em `getAccountInfo`.

## Commitment

`commitment` aceita `finalized` (o padrão) e `confirmed`. `processed` não é compatível. Um `slot` mais recente do que o permitido pelo commitment solicitado retorna o erro `-32004`.

## Erros

| Código | Significado | O que fazer |
| - | - | - |
| `-32018` | O slot é anterior ao início da cobertura do histórico | Consulte o slot 444.959.999 ou posterior |
| `-32004` | O slot é mais recente do que o permitido pelo commitment solicitado | Use `confirmed` ou consulte um slot anterior |
| `-32602` | Parâmetros inválidos | Verifique a mensagem de erro referente ao campo específico |
| `-32601` | Método não encontrado | Chame seu endpoint de mainnet da Helius ou do Gatekeeper. Os métodos de contas históricas não estão disponíveis na devnet |

## Perguntas frequentes

### Como obtenho o estado de uma conta da Solana em um slot específico?

Chame `getHistoricalAccountInfo` com o endereço e `{ "slot": S }`. Ele retorna a conta como ela estava no final do slot S, no mesmo formato de `getAccountInfo`.

### Posso ler uma conta entre duas transações no mesmo slot?

Sim. Adicione `transactionIndex` à consulta para obter o estado da conta imediatamente após a execução dessa transação. Consulte [Leia o estado antes e depois de uma transação](#leia-o-estado-antes-e-depois-de-uma-transação).

### Até onde posso retroceder em uma consulta?

O histórico começa no slot 444.959.999, em 7 de setembro de 2026. Slots anteriores retornam o erro `-32018`.

### Quais planos incluem os métodos de contas históricas?

Planos Business e superiores. As chamadas custam 0 créditos durante o período beta; os preços estão sujeitos a alterações. Os métodos estão disponíveis somente na mainnet.

### Quais são os limites de taxa?

`getHistoricalAccountInfo` permite 100 solicitações por segundo, e `getHistoricalTokenAccountsByOwner` permite 10 solicitações por segundo. Ambos os limites são separados do limite de taxa de RPC do seu plano. Consulte [Disponibilidade e preços](#disponibilidade-e-preços).

### Como obtenho todos os estados anteriores de uma conta?

Retroceda de uma gravação para a anterior usando `lastUpdatedAt`. Consulte [Percorra o histórico da conta em ordem reversa](#percorra-o-histórico-da-conta-em-ordem-reversa).

### Preciso de um novo SDK?

Não. Esses são métodos JSON-RPC, portanto qualquer cliente HTTP funciona. As bibliotecas cliente padrão da Solana não os incluem. Por isso, envie a solicitação diretamente, como nos exemplos acima.

## Próximas etapas

> [card] [getHistoricalAccountInfo](https://www.helius.dev/docs/pt-BR/api-reference/rpc/http/gethistoricalaccountinfo.md)
>
> Leia uma única conta em um slot ou transação anterior

> [card] [getHistoricalTokenAccountsByOwner](https://www.helius.dev/docs/pt-BR/api-reference/rpc/http/gethistoricaltokenaccountsbyowner.md)
>
> Liste as contas de tokens de uma carteira em um slot anterior

> [card] [getTransactionsForAddress](https://www.helius.dev/docs/pt-BR/rpc/gettransactionsforaddress.md)
>
> Encontre o slot e o transactionIndex das transações que você quer inspecionar

> [card] [Historical data overview](https://www.helius.dev/docs/pt-BR/rpc/historical-data.md)
>
> Histórico de transações, transferências e outros métodos de arquivamento


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