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

# Tìm nạp các token mint Pump.fun bằng Sự kiện đã phân tích

> Phân trang qua lịch sử của một địa chỉ Solana bằng Helius Parsed Events và trích xuất các lệnh create của Pump.fun — địa chỉ mint của token, người tạo, tên, ký hiệu và URI.

Hướng dẫn này tìm nạp **mọi token mà một ví đã triển khai trên Pump.fun**. Hướng dẫn phân trang qua lịch sử đã phân tích của ví và lọc ra hai lệnh mà Pump.fun dùng để phát hành token, cho đến khi duyệt hết lịch sử.

Đây là phiên bản lịch sử tương ứng với hướng dẫn Parsed Streams [Theo dõi các mint Pump.fun](/docs/vi/parsed-streams/guides/track-pumpfun-mints): cùng chương trình, cùng tên lệnh và cùng các trường đã giải mã — được tìm nạp theo yêu cầu thay vì được đẩy theo thời gian thực.

<Steps>
  <Step title="Look Up the Program">
    Pump.fun phát hành token thông qua hai lệnh tùy theo phiên bản: `create` và `create_v2`. Parsed Events giải mã các lệnh thông qua cùng danh mục IDL mà Parsed Streams sử dụng, vì vậy hãy xác nhận chính xác tên đã giải mã và vai trò tài khoản bằng phương thức [`describeProgram`](/docs/vi/parsed-streams/quickstart#khám-phá) trước khi đối chiếu:

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

    Kiểm tra danh sách `instructions` trong phản hồi để tìm `create` và `create_v2`, đồng thời kiểm tra danh sách `roles` để tìm tài khoản cần dùng — thường là địa chỉ **mint** mới và một vai trò tài khoản `creator` hoặc một trường `creator` trong `args`. Hai phiên bản lệnh không nhất thiết có cùng cấu trúc, vì vậy mã bên dưới kiểm tra cả một đối số và một số tên vai trò thay vì giả định chỉ một cấu trúc.
  </Step>

  <Step title="Build the Request">
    Tìm nạp lịch sử của ví người tạo theo từng trang:

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

    Có ba điểm khác biệt so với bộ lọc luồng mà bạn nên biết trước:

    * `address` luôn là trường bắt buộc — hệ thống không hỗ trợ quét toàn bộ chương trình, vì vậy bạn tìm nạp các lần triển khai của một ví chứ không phải mọi lần triển khai trên Pump.fun. Để nhận toàn bộ luồng dữ liệu, hãy dùng [Parsed Streams](/docs/vi/parsed-streams/guides/track-pumpfun-mints).
    * Yêu cầu không có bộ lọc lệnh phía máy chủ. Lịch sử trả về mọi nội dung mà địa chỉ đã tương tác, sau đó bạn lọc các lệnh Pump.fun ở phía máy khách trong bước tiếp theo.
    * Không có tùy chọn `includeFailed`. Lịch sử trả về cả giao dịch thành công lẫn thất bại, vì vậy hãy kiểm tra `parsed.transactionStatus` ở phía máy khách — một lần triển khai thất bại sẽ không bao giờ tạo ra mint hoạt động.
  </Step>

  <Step title="Page Through History">
    Mỗi kết quả chứa **mọi** lệnh của giao dịch. Quét `parsed.instructions` để tìm các kết quả khớp với `create`/`create_v2` và tiếp tục truyền lại `paginationToken` cho đến khi trường này không còn xuất hiện:

    ```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">
    Lấy mint, người tạo và siêu dữ liệu từ lệnh đã giải mã, giống hệt cách trình lắng nghe luồng thực hiện:

    ```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}`);
    }
    ```

    Hãy kiểm tra `ix.decoded` có tồn tại trước khi tin cậy `args` và `accounts` — nếu không, một bản dựng không được nhận dạng của chương trình Pump.fun sẽ xuất hiện dưới dạng `mint: null`, khi đó chỉ có `rawData` và `rawAccounts` để xử lý.
  </Step>
</Steps>

## Các bước tiếp theo

<CardGroup cols={2}>
  <Card title="Track Pump.fun Mints" icon="rocket" href="/docs/vi/parsed-streams/guides/track-pumpfun-mints">
    Phiên bản thời gian thực: một trình lắng nghe an toàn khi kết nối lại, ghi nhật ký mọi lần triển khai mới ngay khi xuất hiện.
  </Card>
</CardGroup>
