> ## 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 kiếm tài sản Solana: Tìm NFT, token và tài sản nén

> Sử dụng endpoint searchAssets để tìm NFT, tài sản nén và token có thể thay thế trên Solana, với các tính năng lọc, sắp xếp và phân trang nâng cao.

## Tổng quan

`searchAssets` là phương thức đọc linh hoạt nhất trong DAS API. Phương thức này trả về các tài sản khớp với tổ hợp bộ lọc — chủ sở hữu, nhóm bộ sưu tập, loại token và thuộc tính — trong một lệnh gọi được phân trang. Hãy sử dụng phương thức này bất cứ khi nào bạn cần nhiều hơn một tài sản hoặc danh sách đơn giản theo chủ sở hữu.

`tokenType` là tùy chọn. Khi bỏ qua, `searchAssets` chỉ trả về NFT thông thường và NFT nén — không có token có thể thay thế. Để bao gồm token có thể thay thế, hãy đặt `tokenType` (ví dụ: `"fungible"` hoặc `"all"`). Các giá trị được chấp nhận là `fungible`, `nonFungible`, `regularNft`, `compressedNft` và `all`.

## Khi nào nên sử dụng

Sử dụng `searchAssets` khi bạn cần:

* Lọc tài sản của ví để chỉ lấy token có thể thay thế hoặc chỉ NFT
* Liệt kê các tài sản mà một ví sở hữu trong một bộ sưu tập cụ thể
* Tìm hàng loạt NFT nén
* Xây dựng tính năng cuộn vô hạn trên các tập kết quả lớn bằng phân trang con trỏ
* Lọc tài sản MPL Core theo trạng thái tác nhân hoặc bên ký

Với tài sản đơn lẻ, hãy sử dụng [`getAsset`](/docs/vi/api-reference/das/getasset); với danh sách ví đơn giản, hãy sử dụng [`getAssetsByOwner`](/docs/vi/api-reference/das/getassetsbyowner).

<Card title="API Reference" horizontal icon="code" href="/docs/vi/api-reference/das/searchassets">
  Xem tài liệu chi tiết về searchAssets
</Card>

## Bắt đầu nhanh

```typescript theme={"system"}
// Replace YOUR_API_KEY with your Helius API key
const url = `https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY`;

async function searchAssets(params) {
  const body = {
    jsonrpc: "2.0",
    id: "search-assets-example",
    method: "searchAssets",
    params,
  };
  const res = await fetch(url, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
  if (!res.ok) {
    throw new Error(`${res.status} ${res.statusText}`);
  }
  const { result } = await res.json();
  return result;
}

// Example: fetch first 50 compressed NFTs in a wallet
searchAssets({
  ownerAddress: "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
  tokenType: "compressedNft",
  limit: 50,
}).then(console.log);
```

## Chọn tokenType

`tokenType` là tùy chọn và chỉ định **loại tài sản nào** xuất hiện trong phản hồi. Khi bỏ qua, `searchAssets` chỉ trả về NFT thông thường và NFT nén — hãy đặt `tokenType` để bao gồm token có thể thay thế.

<ParamField body="tokenType" type="string">
  Các giá trị được chấp nhận: `fungible`, `nonFungible`, `regularNft`, `compressedNft`, `all`. Khi bỏ qua, mặc định trả về NFT thông thường và NFT nén.
</ParamField>

| tokenType       | Kết quả nhận được                | Trường hợp sử dụng điển hình            |
| --------------- | -------------------------------- | --------------------------------------- |
| `fungible`      | Chỉ token SPL và Token-2022      | Số dư ví, kiểm soát truy cập bằng token |
| `nonFungible`   | Tất cả NFT (nén và thông thường) | Tổng quan danh mục                      |
| `regularNft`    | NFT cũ và pNFT (không nén)       | Danh sách trên thị trường               |
| `compressedNft` | Chỉ cNFT                         | Đúc hàng loạt với chi phí cực thấp      |
| `all`           | Mọi loại tài sản (token và NFT)  | Tìm kiếm toàn diện                      |

## Phân trang và sắp xếp

Ví Solana có thể sở hữu hàng nghìn tài sản, vì vậy việc phân trang hiệu quả rất quan trọng:

* **Trang / giới hạn** — kiểu phân trang truyền thống (`page` bắt đầu từ **1**). Phù hợp với chế độ xem tĩnh.
* **Con trỏ** — truyền các giá trị `before` hoặc `after` từ phản hồi trước để cuộn vô hạn nhanh chóng.

```json5 sortBy theme={"system"}
"sortBy": {
  "sortBy": "created",      // created | recent_action | updated | none
  "sortDirection": "desc"   // asc | desc
}
```

Để tìm hiểu đầy đủ các chiến lược trang/giới hạn và con trỏ, bao gồm truy vấn song song theo tập khóa, hãy xem [hướng dẫn Phân trang](/docs/vi/das/pagination).

## Tùy chọn hiển thị

Các cờ này **thêm siêu dữ liệu**; chúng không bao giờ thay đổi những tài sản được trả về.

| Cờ                       | Tác dụng                               |
| ------------------------ | -------------------------------------- |
| `showNativeBalance`      | Bao gồm số dư SOL của ví               |
| `showCollectionMetadata` | Thêm dữ liệu JSON cấp bộ sưu tập       |
| `showGrandTotal`         | Trả về tổng số kết quả khớp (chậm hơn) |

```json5 options theme={"system"}
"options": {
  "showNativeBalance": true,
  "showCollectionMetadata": true,
  "showGrandTotal": true
}
```

## Tác nhân MPL Core, bên ký tài sản và nhóm MIP-11

Tài sản MPL Core có thể cung cấp siêu dữ liệu về **danh tính tác nhân** và **bên ký tài sản**, đồng thời tài sản hoặc bộ sưu tập có thể bao gồm **plugin `groups`** (MIP-11) mô tả tư cách thành viên nhóm. Các trường tùy chọn tương tự xuất hiện trên mọi phương thức DAS trả về tài sản (`getAsset`, `getAssetBatch`, `getAssetsByOwner`, `getAssetsByGroup`, `getAssetsByCreator`, `getAssetsByAuthority` và từng mục trong `searchAssets`).

Sử dụng `searchAssets` để lọc theo trạng thái hoặc địa chỉ của tác nhân:

| Tham số       | Kiểu    | Mục đích                                     |
| ------------- | ------- | -------------------------------------------- |
| `isAgent`     | boolean | Chỉ các tài sản có Danh tính tác nhân        |
| `agentToken`  | string  | Khớp địa chỉ đúc token của tác nhân (base58) |
| `assetSigner` | string  | Khớp PDA của bên ký tài sản (base58)         |

Bạn cũng có thể đặt `interface` thành `MplCoreAsset`, `MplCoreCollection` hoặc `MplCoreGroup` để tìm kiếm dành riêng cho MPL Core.

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": "1",
  "method": "searchAssets",
  "params": {
    "ownerAddress": "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
    "tokenType": "all",
    "isAgent": true,
    "page": 1,
    "limit": 10
  }
}
```

Các trường phản hồi `is_agent`, `agent_token` và `asset_signer` sẽ **bị bỏ qua khi không áp dụng** (ví dụ: `is_agent` bị bỏ qua khi có giá trị false). Xem [tài liệu tham chiếu API searchAssets](/docs/vi/api-reference/das/searchassets) để biết đầy đủ các lược đồ.

## Ví dụ

Ví dụ đầu tiên hiển thị đầy đủ trình bao bọc `fetch`. Các ví dụ còn lại tuân theo cùng một mẫu và được thu gọn — hãy mở rộng để xem phần thân yêu cầu.

### Tìm tất cả token có thể thay thế trong một ví

```typescript theme={"system"}
const url = `https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY`

const searchAssets = async () => {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: 'my-id',
      method: 'searchAssets',
      params: {
        ownerAddress: '86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY',
        tokenType: 'fungible',
      },
    }),
  });
  const { result } = await response.json();
  console.log("Search Assets: ", result);
};
searchAssets();
```

<Accordion title="Search for fungible tokens with native balance and token info">
  ```typescript theme={"system"}
  const url = `https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY`

  const searchAssetsTokenInfo = async () => {
      const response = await fetch(url, {
          method: 'POST',
          headers: {
              'Content-Type': 'application/json',
          },
          body: JSON.stringify({
              jsonrpc: '2.0',
              id: 'my-id',
              method: 'searchAssets',
              params: {
                  ownerAddress: '86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY',
                  tokenType: 'fungible',
                  options: {
                      showNativeBalance: true,
                  },
              },
          }),
      });

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

      result.items.forEach(item => {
        console.log(item.token_info);
      });

      console.log("Native Balance: ", result.nativeBalance);
  };

  searchAssetsTokenInfo();
  ```
</Accordion>

<Accordion title="Search for Drip NFTs owned by vibhu.sol">
  ```typescript theme={"system"}
  const url = `https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY`

  const searchAssetsDrip = async () => {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'searchAssets',
        params: {
          ownerAddress: 'BAVjpySHMMGDpq3whU7qaqCCRE8ksCeGwxa53Qv2i8jS',
          grouping: ["collection", "DRiP2Pn2K6fuMLKQmt5rZWyHiUZ6WK3GChEySUpHSS4x"],
          page: 1,
          limit: 1000
        },
      }),
    });
    const { result } = await response.json();
    console.log("Drip Haus Assets: ", result);
  };
  searchAssetsDrip();
  ```
</Accordion>

<Accordion title="Search for compressed assets in a wallet">
  ```typescript theme={"system"}
  const url = `https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY`

  const searchAssetsCompressed = async () => {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 'my-id',
        method: 'searchAssets',
        params: {
          ownerAddress: '2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha',
          compressed: true,
        },
      }),
    });
    const { result } = await response.json();
    console.log("Search Assets: ", result);
  };
  searchAssetsCompressed();
  ```
</Accordion>

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

<CardGroup cols={3}>
  <Card title="Pagination" icon="list" href="/docs/vi/das/pagination">
    Phân trang theo trang và theo tập khóa cho các tập kết quả lớn.
  </Card>

  <Card title="Fungible Token Extension" icon="coins" href="/docs/vi/das/fungible-token-extension">
    Cách tokenType, số dư và giá xuất hiện trong kết quả.
  </Card>

  <Card title="searchAssets reference" icon="code" href="/docs/vi/api-reference/das/searchassets">
    Lược đồ đầy đủ của yêu cầu và phản hồi.
  </Card>
</CardGroup>
