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

# Cách sử dụng getTokenAccountBalance

> Tìm hiểu các trường hợp sử dụng, ví dụ mã, tham số yêu cầu, cấu trúc phản hồi và mẹo cho getTokenAccountBalance.

Phương thức RPC [`getTokenAccountBalance`](https://www.helius.dev/docs/api-reference/rpc/http/gettokenaccountbalance) trả về số dư token của một tài khoản SPL Token cụ thể. Phương thức này rất cần thiết cho các ứng dụng cần hiển thị hoặc xác minh số lượng của một token cụ thể do tài khoản token nắm giữ.

## Các trường hợp sử dụng phổ biến

* **Hiển thị số dư token của người dùng:** Cho người dùng biết họ sở hữu bao nhiêu token cụ thể trong ví (các tài khoản token liên kết).
* **Xác minh token khả dụng:** Kiểm tra xem tài khoản token có đủ số dư trước khi thực hiện chuyển token hoặc thao tác khác hay không.
* **Theo dõi danh mục đầu tư:** Tổng hợp số dư token của người dùng trên nhiều tài khoản token khác nhau.
* **Tương tác với hợp đồng thông minh:** Hợp đồng thông minh có thể truy vấn số dư token như một phần trong logic của chúng (mặc dù các chương trình on-chain thường truy cập trực tiếp dữ liệu này từ thông tin tài khoản).

## Tham số yêu cầu

1. **Khóa công khai của tài khoản token** (chuỗi, bắt buộc): Khóa công khai được mã hóa base-58 của tài khoản SPL Token mà bạn muốn truy vấn.
2. **Đối tượng cấu hình** (đối tượng, không bắt buộc): Một đối tượng không bắt buộc có thể chứa trường sau:
   * **`commitment`** (chuỗi, không bắt buộc): Chỉ định [mức cam kết](https://www.helius.dev/blog/solana-commitment-levels) cho truy vấn. Nếu bỏ qua, hệ thống sẽ sử dụng mức cam kết mặc định của nút RPC (thường là `finalized`).

## Cấu trúc phản hồi

Trường `result` trong phản hồi JSON-RPC chứa một đối tượng có trường `context` và trường `value`. Đối tượng `value` chứa thông tin số dư:

* **`amount`** (chuỗi): Số dư thô của tài khoản token ở dạng chuỗi. Đây là một số nguyên biểu thị đơn vị nhỏ nhất của token (ví dụ: nếu token có 6 chữ số thập phân thì giá trị "1000000" tương ứng với 1 token).
* **`decimals`** (u8): Số chữ số thập phân được xác định cho loại token này (bởi mint của token).
* **`uiAmount`** (số | null): Số dư được định dạng dưới dạng số dấu phẩy động, có tính đến `decimals`. Trong một số trường hợp, trường này có thể là `null` hoặc không còn được khuyến nghị sử dụng và được thay thế bằng `uiAmountString`.
* **`uiAmountString`** (chuỗi): Số dư được định dạng dưới dạng chuỗi, có tính đến `decimals`. Định dạng này thường được ưu tiên khi hiển thị để tránh sai số tiềm ẩn của số dấu phẩy động.

**Phản hồi mẫu:**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "context": {
      "slot": 183457201
    },
    "value": {
      "amount": "500000000",
      "decimals": 9,
      "uiAmount": 0.5,
      "uiAmountString": "0.5"
    }
  },
  "id": 1
}
```

## Ví dụ mã

<CodeGroup>
  ```bash cURL theme={"system"}
  # Basic Request (replace <TOKEN_ACCOUNT_PUBKEY>):
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountBalance",
      "params": [
        "<TOKEN_ACCOUNT_PUBKEY>"
      ]
    }' \
    <YOUR_RPC_URL>

  # Request with commitment (replace <TOKEN_ACCOUNT_PUBKEY>):
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountBalance",
      "params": [
        "<TOKEN_ACCOUNT_PUBKEY>",
        {
          "commitment": "confirmed"
        }
      ]
    }' \
    <YOUR_RPC_URL>
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function checkTokenBalance(tokenAccountPublicKey) {
    // Replace with your RPC endpoint
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    
    try {
      const tokenAccountPubKey = new PublicKey(tokenAccountPublicKey);
      const balance = await connection.getTokenAccountBalance(tokenAccountPubKey);

      if (!balance.value) {
          console.log(`Could not find token account: ${tokenAccountPublicKey}`);
          return;
      }

      console.log(`Token Account: ${tokenAccountPublicKey}`);
      console.log(`Raw Amount: ${balance.value.amount}`);
      console.log(`Decimals: ${balance.value.decimals}`);
      console.log(`UI Amount (string): ${balance.value.uiAmountString}`);
      // console.log(JSON.stringify(balance, null, 2)); // For full response details

    } catch (error) {
      console.error(`Error fetching token account balance for ${tokenAccountPublicKey}:`, error);
    }
  }

  // Replace with an actual SPL Token Account Public Key
  const exampleTokenAccount = 'HHisAGTT6ADDd52jY1g65Akn3N2f4jSdQS2rTiyDEw5c'; // Example: An account holding some USDC on mainnet
  checkTokenBalance(exampleTokenAccount);

  // Example for a token account that might not exist or have 0 balance
  // const nonExistentAccount = '11111111111111111111111111111111'; 
  // checkTokenBalance(nonExistentAccount);
  ```
</CodeGroup>

## Mẹo dành cho nhà phát triển

* **Tài khoản token, tài khoản mint và tài khoản chủ sở hữu:** Hãy đảm bảo bạn cung cấp khóa công khai của *tài khoản SPL Token*, không phải *địa chỉ mint* của token hoặc *địa chỉ ví của chủ sở hữu*. Thông thường, bạn có thể lấy các tài khoản token của một chủ sở hữu bằng `getTokenAccountsByOwner`.
* **Số chữ số thập phân:** Luôn sử dụng trường `decimals` để diễn giải chính xác `amount`. Khi hiển thị, `uiAmountString` thường an toàn hơn `uiAmount` vì tránh được các vấn đề về độ chính xác của số dấu phẩy động.
* **Tài khoản không tồn tại:** Nếu khóa công khai được cung cấp không tương ứng với một tài khoản token hiện có, hành vi có thể khác đôi chút tùy theo nhà cung cấp RPC hoặc thư viện. Tuy nhiên, `value` trong phản hồi thường sẽ là `null` hoặc hệ thống sẽ báo lỗi. Ví dụ JavaScript có một bước kiểm tra cơ bản cho `balance.value`.
* **Mức cam kết:** Việc sử dụng các mức cam kết khác nhau có thể ảnh hưởng đến tốc độ bạn thấy các thay đổi về số dư, đặc biệt là với các giao dịch mới diễn ra. `finalized` an toàn nhất nhưng có độ trễ cao nhất.

Hướng dẫn này giúp bạn truy xuất và diễn giải chính xác số dư SPL Token bằng phương thức `getTokenAccountBalance`.

## Các phương thức liên quan

<CardGroup cols={2}>
  <Card title="getTokenAccountsByOwner" href="/docs/vi/api-reference/rpc/http/gettokenaccountsbyowner">
    Lấy tất cả tài khoản token của một chủ sở hữu
  </Card>

  <Card title="getTokenSupply" href="/docs/vi/api-reference/rpc/http/gettokensupply">
    Lấy tổng nguồn cung của một mint token
  </Card>
</CardGroup>
