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

# Получение минтов токенов Pump.fun с помощью Parsed Events

> Просматривайте историю адреса Solana постранично с помощью Helius Parsed Events и извлекайте инструкции создания Pump.fun — минт токена, создателя, название, символ и URI.

В этом руководстве показано, как получить **все токены, развернутые кошельком на Pump.fun**. Оно постранично просматривает разобранную историю кошелька и извлекает две инструкции, которые Pump.fun использует для запуска токена, пока история не закончится.

Это исторический аналог руководства по Parsed Streams [Отслеживание минтов Pump.fun](/docs/ru/parsed-streams/guides/track-pumpfun-mints): та же программа, те же названия инструкций и те же декодированные поля, но данные запрашиваются по требованию, а не передаются в реальном времени.

<Steps>
  <Step title="Look Up the Program">
    Pump.fun запускает токены с помощью одной из двух инструкций в зависимости от версии: `create` и `create_v2`. Parsed Events декодирует инструкции с помощью того же каталога IDL, который использует Parsed Streams. Поэтому перед сопоставлением подтвердите точные декодированные названия и роли аккаунтов с помощью метода [`describeProgram`](/docs/ru/parsed-streams/quickstart#обнаружение):

    ```json Request theme={"system"}
    { "jsonrpc": "2.0", "id": 1, "method": "describeProgram", "params": [{ "program": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" }] }
    ```

    Проверьте список `instructions` в ответе на наличие `create` и `create_v2`, а список `roles` — на наличие нужного аккаунта. Обычно это новый адрес **минта**, а также либо роль аккаунта `creator`, либо поле `creator` в `args`. Структура двух версий инструкции может различаться, поэтому приведенный ниже код проверяет и аргумент, и несколько названий ролей, а не полагается на один вариант.
  </Step>

  <Step title="Build the Request">
    Получайте историю кошелька создателя постранично:

    ```json theme={"system"}
    {
      "address": "<CREATOR_WALLET>",
      "limit": 100,
      "sortOrder": "desc",
      "commitment": "confirmed"
    }
    ```

    Важно заранее учитывать три отличия от потокового фильтра:

    * `address` всегда обязателен: сканирование всей программы не поддерживается, поэтому вы получаете развертывания одного кошелька, а не все развертывания на Pump.fun. Для непрерывного потока используйте [Parsed Streams](/docs/ru/parsed-streams/guides/track-pumpfun-mints).
    * В запросе нет серверного фильтра инструкций. История возвращает все, с чем взаимодействовал адрес, а инструкции Pump.fun вы извлекаете на стороне клиента на следующем шаге.
    * Переключателя `includeFailed` нет. История возвращает как успешные, так и неуспешные транзакции, поэтому проверяйте `parsed.transactionStatus` на стороне клиента: неуспешное развертывание не создает активный минт.
  </Step>

  <Step title="Page Through History">
    Каждый результат содержит **все** инструкции транзакции. Просканируйте `parsed.instructions` на совпадения с `create`/`create_v2` и продолжайте передавать `paginationToken`, пока это значение не исчезнет:

    ```javascript pumpfun-mint-history.js theme={"system"}
    const API_KEY = process.env.HELIUS_API_KEY;

    if (!API_KEY) {
      console.error("Missing HELIUS_API_KEY.");
      process.exit(1);
    }

    const URL = `https://mainnet.helius-rpc.com/v1/parsed-events/transaction-history?api-key=${API_KEY}`;
    const PUMP_PROGRAM = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P";
    const CREATE_INSTRUCTIONS = ["create", "create_v2"];
    const CREATOR = process.argv[2];

    if (!CREATOR) {
      console.error("Usage: node pumpfun-mint-history.js <CREATOR_WALLET>");
      process.exit(1);
    }

    async function fetchPage(paginationToken) {
      const body = {
        address: CREATOR,
        limit: 100,
        sortOrder: "desc",
        commitment: "confirmed",
      };
      if (paginationToken) body.paginationToken = paginationToken;

      const response = await fetch(URL, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(body),
      });
      if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${await response.text()}`);
      }
      return response.json();
    }

    async function main() {
      let paginationToken;
      let deployCount = 0;

      do {
        const page = await fetchPage(paginationToken);

        for (const result of page.data) {
          if (result.parserStatus !== "OK") continue;
          // Failed deploys never produce a live mint.
          if (result.parsed.transactionStatus !== "OK") continue;

          for (const ix of result.parsed.instructions) {
            if (ix.programId !== PUMP_PROGRAM) continue;
            if (!CREATE_INSTRUCTIONS.includes(ix.instructionName)) continue;
            deployCount += 1;
            handleDeploy(result, ix, deployCount);
          }
        }

        paginationToken = page.paginationToken;
      } while (paginationToken);

      console.log(`${deployCount} pump deploys found for ${CREATOR}`);
    }

    main();
    ```
  </Step>

  <Step title="Extract Each Deploy">
    Извлеките минт, создателя и метаданные из декодированной инструкции так же, как это делает потоковый обработчик:

    ```javascript theme={"system"}
    // Pull an account pubkey out of a decoded instruction by its role name.
    function accountByRole(decoded, role) {
      return decoded?.accounts?.find((a) => a.name === role)?.pubkey ?? null;
    }

    function handleDeploy(result, ix, deployCount) {
      const args = ix.decoded?.args ?? {};
      const mint = accountByRole(ix.decoded, "mint");
      const creator =
        args.creator ??
        accountByRole(ix.decoded, "creator") ??
        accountByRole(ix.decoded, "user");

      console.log(`pump deploy #${deployCount} (${ix.instructionName})`);
      console.log(`    mint:    ${mint}`);
      console.log(`    creator: ${creator}`);
      console.log(`    name:    ${args.name ?? "?"}`);
      console.log(`    symbol:  ${args.symbol ?? "?"}`);
      console.log(`    uri:     ${args.uri ?? "?"}`);
      console.log(`    slot=${result.parsed.slot} sig=${result.signature}`);
    }
    ```

    Прежде чем доверять `args` и `accounts`, убедитесь, что присутствует `ix.decoded`. Иначе нераспознанная сборка программы Pump.fun отобразится как `mint: null`, и для работы останутся только `rawData` и `rawAccounts`.
  </Step>
</Steps>

## Дальнейшие действия

<CardGroup cols={2}>
  <Card title="Track Pump.fun Mints" icon="rocket" href="/docs/ru/parsed-streams/guides/track-pumpfun-mints">
    Версия для работы в реальном времени: устойчивый к переподключениям обработчик, который регистрирует каждое новое развертывание по мере его появления.
  </Card>
</CardGroup>


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