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

# 如何获取 Solana SPL 代币：完整 API 指南

> 使用 Helius 检索和查询 Solana SPL 代币数据：余额、代币账户、供应、持有者和同质化代币扩展，包含代码示例。

## 概述

本指南介绍如何读取 Solana 上的同质化代币：账户余额、根据所有者或铸币的代币账户、总供应量、最大持有者以及 DAS 同质化代币扩展。Helius 提供标准的 Solana RPC 代币方法和添加元数据及美元价格的 DAS 方法。

对于 NFT、压缩 NFT、版本和证明，请参阅[获取资产指南](/docs/zh/das/get-nfts)。本页面重点介绍同质化（SPL 和 Token-2022）代币。

## 何时使用

在以下情况下使用本页面的方法：

* 读取单个代币账户的余额
* 列出钱包持有的所有代币账户
* 查找持有特定铸币的所有账户
* 检查代币的总供应量或最大持有者
* 获取代币元数据和美元价格以及余额

## 代币账户余额

使用标准 RPC 获取特定代币账户的余额：

```typescript theme={"system"}
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getTokenAccountBalance',
    params: [
      '3emsAVdmGKERbHjmGfQ6oZ1e35dkf5iYcS6U4CPKFVaa'
    ]
  })
});
const data = await response.json();
console.log(data);
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/rpc/http/gettokenaccountbalance">
  getTokenAccountBalance
</Card>

## 根据所有者的代币账户

列出钱包拥有的所有代币账户：

```typescript theme={"system"}
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getTokenAccountsByOwner',
    params: [
      '86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY',
      {
        programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'
      },
      {
        encoding: 'jsonParsed'
      }
    ]
  })
});
const data = await response.json();
console.log(data);
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/rpc/http/gettokenaccountsbyowner">
  getTokenAccountsByOwner
</Card>

## 根据铸币的代币账户

列出持有特定代币的所有账户：

```typescript theme={"system"}
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getTokenAccountsByOwner',
    params: [
      'CEXq1uy9y15PL2Wb4vDQwQfcJakBGjaAjeuR2nKLj8dk',
      {
        mint: "8wXtPeU6557ETkp9WHFY1n1EcU6NxDvbAggHGsMYiHsB"
      },
      {
        encoding: 'jsonParsed'
      }
    ]
  })
});
const data = await response.json();
console.log(data);
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/rpc/http/gettokenaccountsbyowner">
  getTokenAccountsByOwner
</Card>

要查找跨所有所有者（不仅限于一个所有者）持有铸币的每个账户，请使用下面描述的 DAS `getTokenAccounts` 方法。

## 代币供应

检查代币的总供应量：

```typescript theme={"system"}
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getTokenSupply',
    params: [
      'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
    ]
  })
});
const data = await response.json();
console.log(data);
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/rpc/http/gettokensupply">
  getTokenSupply
</Card>

## 最大的代币持有者

识别持有代币的最大账户：

```typescript theme={"system"}
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getTokenLargestAccounts',
    params: [
      'he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A'
    ]
  })
});
const data = await response.json();
console.log(data);
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/rpc/http/gettokenlargestaccounts">
  getTokenLargestAccounts
</Card>

返回最多 20 个铸币的最大账户：

```json theme={"system"}
{
  "context": { "slot": 0 },
  "value": [
    { "address": "...", "amount": "1000000000000", "decimals": 9, "uiAmount": 1000.0, "uiAmountString": "1000" }
  ]
}
```

## 使用 DAS API 的代币账户

DAS `getTokenAccounts` 方法通过铸币或所有者返回代币账户，包括余额，以单个分页调用的方式返回。与 `getTokenAccountsByOwner` 不同，您可以仅通过 `mint` 查询，以列出所有持有代币的账户。

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

const getTokenAccounts = async (params) => {
  const response = await fetch(url, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      jsonrpc: "2.0",
      id: "my-request-id",
      method: "getTokenAccounts",
      params: params,
    }),
  });

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

// Example: Get all accounts holding a specific token
getTokenAccounts({
  mint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
  page: 1,
  limit: 100
});
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/das/gettokenaccounts">
  getTokenAccounts
</Card>

分页；每个条目包括账户、铸币、所有者和余额：

```json theme={"system"}
{
  "total": 100,
  "limit": 100,
  "page": 1,
  "token_accounts": [
    { "address": "...", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "owner": "...", "amount": 12345678 }
  ]
}
```

## 使用 DAS API 获取代币元数据和价格

要获取代币元数据和美元价格，调用启用 `showFungible` 的 DAS `getAsset` 方法。经过验证的代币价格在 `token_info.price_info` 下返回。

<Note>
  `getAsset` 的价格数据缓存长达 600 秒，因此可能会滞后 10 分钟。
</Note>

```typescript theme={"system"}
const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY", {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getAsset',
    params: {
      id: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263', // Bonk
      options: {
        showFungible: true
      }
    }
  })
});
const { result } = await response.json();
console.log(result.token_info.price_info);
```

<Card title="API 参考" horizontal icon="code" href="/docs/zh/api-reference/das/getasset">
  getAsset
</Card>

响应在 `token_info` 下返回供应、小数和价格：

```json theme={"system"}
{
  "token_info": {
    "symbol": "Bonk",
    "supply": 8881594973561640000,
    "decimals": 5,
    "token_program": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "price_info": {
      "price_per_token": 0.0000192271,
      "currency": "USDC"
    }
  }
}
```

### 计算市值

将价格乘以小数调整后的供应量：

```typescript theme={"system"}
const { price_per_token } = result.token_info.price_info;
const { supply, decimals } = result.token_info;
const marketCap = (supply / Math.pow(10, decimals)) * price_per_token;
```

要在一次调用中列出钱包中的每一个可替代代币（含余额和价格），请使用 `getAssetsByOwner` 或 `searchAssets` 和 `tokenType: "fungible"`。查看[可替代代币扩展](/docs/zh/das/fungible-token-extension)，了解 `tokenType`、余额、Token-2022 扩展和价格数据在响应中的显示方式。

## 最佳实践

* 对返回大量结果集的方法使用分页。请参阅[分页指南](/docs/zh/das/pagination)。
* 在需要元数据或美元价格时，优先使用 DAS 方法（`getAsset`、`getAssetsByOwner`、`getTokenAccounts`）；对于原始链上余额和供应，使用标准 RPC 方法。
* 使用 try/catch 块和重试机制优雅地处理错误。
* 在适当的情况下缓存响应以减少 API 调用。

## 下一步

<CardGroup cols={3}>
  <Card title="可替代代币扩展" icon="coins" href="/docs/zh/das/fungible-token-extension">
    DAS如何返回可替代代币、Token-2022扩展和价格。
  </Card>

  <Card title="获取资产（NFTs）" icon="image" href="/docs/zh/das/get-nfts">
    检索NFT、压缩NFT、版本和证明。
  </Card>

  <Card title="DAS API参考" icon="code" href="/docs/zh/api-reference/das">
    每个DAS方法的完整架构。
  </Card>
</CardGroup>
