> ## Documentation Index
> Fetch the complete documentation index at: https://docs.solanatracker.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 兑换代币

> 通过 Raptor DEX 聚合器与 Solana Tracker Swap API 在 Solana 上获取报价、构建兑换交易、流式获取实时报价并发送已签名交易。

Raptor 是 Solana Tracker 的 DEX 聚合器和兑换 API。DEX 聚合器会检查多个去中心化交易所并为您的兑换找到路径。流程是:请求报价、根据该报价构建兑换交易、在客户端签名,然后将已签名交易提交到 Raptor 的发送器。

<Info>
  **HTTP 基础 URL:** `https://raptor-beta.solanatracker.io`\
  **WebSocket 基础 URL:** `wss://raptor-beta.solanatracker.io`\
  Raptor 当前处于公开测试阶段。
</Info>

## 支持的路由

Raptor 支持跨多个场所和池类型路由,包括 Raydium、Meteora、Orca Whirlpool、Pump.fun、Pumpswap、MoonIt、Boopfun、FluxBeam、PancakeSwap V3 等。

如需将路由限制在受支持场所的子集,请使用 `dexes`。

***

## 1. 获取报价

使用[获取兑换报价](/cn/raptor/http/get-swap-quote)获取最佳路径。Raptor 期望:

* `inputMint`
* `outputMint`
* `amount`(最小单位,即无小数的区块链整数金额)
* 可选 `slippageBps`(基点,`50` 表示 0.5%)
* 可选路由控制,如 `dexes`、`pools` 和 `maxHops`

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://raptor-beta.solanatracker.io/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=50"
  ```

  ```javascript JavaScript theme={null}
  const params = new URLSearchParams({
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: "100000000",
    slippageBps: "50"
  });

  const quote = await fetch(
    `https://raptor-beta.solanatracker.io/quote?${params}`
  ).then(r => r.json());

  console.log(`Amount in: ${quote.amountIn}`);
  console.log(`Expected out: ${quote.amountOut}`);
  console.log(`Min out: ${quote.minAmountOut}`);
  console.log(`Price impact: ${(quote.priceImpact * 100).toFixed(4)}%`);
  console.log(`Route steps: ${quote.routePlan.length}`);

  for (const step of quote.routePlan) {
    console.log(`${step.dex} via ${step.pool}`);
  }
  ```

  ```python Python theme={null}
  import requests

  quote = requests.get(
      "https://raptor-beta.solanatracker.io/quote",
      params={
          "inputMint": "So11111111111111111111111111111111111111112",
          "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
          "amount": 100000000,
          "slippageBps": "50"
      }
  ).json()

  print("Expected out:", quote["amountOut"])
  print("Min out:", quote["minAmountOut"])
  print("Route count:", len(quote["routePlan"]))
  ```
</CodeGroup>

### 限制路径

```bash theme={null}
curl "https://raptor-beta.solanatracker.io/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=dynamic&dexes=raydium,meteora,pumpfun&maxHops=2"
```

***

## 2. 构建兑换交易

使用[构建兑换交易](/cn/raptor/http/build-swap-transaction)创建序列化交易。

请求体包含:

* `userPublicKey`
* 来自 `/quote` 的 `quoteResponse`
* 可选交易调优,如 `priorityFee`、`txVersion`、`computeUnitLimit`、`tipLamports` 以及平台费字段

<CodeGroup>
  ```javascript JavaScript theme={null}
  const quote = await fetch(
    "https://raptor-beta.solanatracker.io/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=50"
  ).then(r => r.json());

  const swap = await fetch("https://raptor-beta.solanatracker.io/swap", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      userPublicKey: "YOUR_WALLET_ADDRESS",
      wrapUnwrapSol: true,
      txVersion: "v0",
      priorityFee: "medium",
      maxPriorityFee: 1000000,
      quoteResponse: quote
    })
  }).then(r => r.json());

  console.log(`Swap tx: ${swap.swapTransaction}`);
  console.log(`Last valid block height: ${swap.lastValidBlockHeight}`);
  console.log(`Priority fee: ${swap.prioritizationFeeLamports}`);
  ```

  ```bash cURL theme={null}
  curl -X POST "https://raptor-beta.solanatracker.io/swap" \
    -H "Content-Type: application/json" \
    -d '{
      "userPublicKey": "YOUR_WALLET_ADDRESS",
      "wrapUnwrapSol": true,
      "txVersion": "v0",
      "priorityFee": "medium",
      "quoteResponse": {
        "inputMint": "So11111111111111111111111111111111111111112",
        "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "amountIn": "100000000",
        "amountOut": "14321000",
        "minAmountOut": "14249400",
        "feeAmount": "25000",
        "priceImpact": 0.0008,
        "slippageBps": 50,
        "routePlan": [],
        "contextSlot": 314159265,
        "timeTaken": 0.012
      }
    }'
  ```
</CodeGroup>

### 交易控制

| 字段                                                     | 用途                                               |
| ------------------------------------------------------ | ------------------------------------------------ |
| `txVersion`                                            | `legacy` 或 `v0`                                  |
| `priorityFee`                                          | 优先级,例如 `medium`、`high`、`veryHigh`,或精确的微 lamports |
| `maxPriorityFee`                                       | 限制动态优先费                                          |
| `computeUnitPriceMicroLamports`                        | 优先费:直接覆盖计算单元价格                                   |
| `computeUnitLimit`                                     | 覆盖 CU 限制                                         |
| `tipAccount` / `tipLamports`                           | 添加可选 SOL 小费                                      |
| `feeAccount` / `feeBps` / `feeFromInput` / `chargeBps` | 平台费控制                                            |

***

## 3. 一次请求完成报价和构建

如果您希望使用单一请求而不是分开的 `/quote` 和 `/swap` 调用,请使用[一次请求中的报价与兑换](/cn/raptor/http/quote-and-swap-in-one-request)。

```javascript theme={null}
const result = await fetch("https://raptor-beta.solanatracker.io/quote-and-swap", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    userPublicKey: "YOUR_WALLET_ADDRESS",
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: 100000000,
    slippageBps: "dynamic",
    txVersion: "v0",
    priorityFee: "high",
    maxHops: 2,
    dexes: "raydium,meteora,whirlpool"
  })
}).then(r => r.json());

console.log(result.quote.amountOut);
console.log(result.swapTransaction);
```

***

## 4. 客户端签名

Raptor 以 base64 返回 `swapTransaction`。在钱包中签名,然后发送已签名的 base64 交易。

```javascript theme={null}
import { VersionedTransaction } from "@solana/web3.js";

const txBytes = Uint8Array.from(atob(swap.swapTransaction), c => c.charCodeAt(0));
const tx = VersionedTransaction.deserialize(txBytes);

const signed = await wallet.signTransaction(tx);
const signedBase64 = btoa(String.fromCharCode(...signed.serialize()));
```

***

## 5. 发送已签名的交易

通过 [raptor/transactions](/cn/raptor/transactions) 的 `POST /send-transaction` 发送已签名的交易。

```javascript theme={null}
const sendResult = await fetch("https://raptor-beta.solanatracker.io/send-transaction", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ transaction: signedBase64 })
}).then(r => r.json());

console.log(`Signature: ${sendResult.signature}`);
console.log(`Accepted: ${sendResult.success}`);
```

Raptor 通过 Yellowstone Jet TPU 发送,并在后台重试,直到交易确认或过期。

### 追踪状态

```javascript theme={null}
const status = await fetch(
  `https://raptor-beta.solanatracker.io/transaction/${sendResult.signature}`
).then(r => r.json());

console.log(`Status: ${status.status}`);
console.log(`Latency: ${status.latency_ms}ms`);
console.log(`Slot: ${status.slot}`);
```

有效状态为 `pending`、`confirmed`、`failed` 和 `expired`。

***

## 6. 仅构建指令

如果您希望获取没有交易包装的指令,请使用[构建兑换指令](/cn/raptor/http/build-swap-instructions)。

```javascript theme={null}
const instructions = await fetch("https://raptor-beta.solanatracker.io/swap-instructions", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    userPublicKey: "YOUR_WALLET_ADDRESS",
    quoteResponse: quote,
    txVersion: "v0"
  })
}).then(r => r.json());

console.log(instructions.swapInstruction.programId);
console.log(instructions.addressLookupTableAddresses);
```

***

## 7. 流式实时报价

使用 Raptor WebSocket `/stream` 端点接收报价更新。

```javascript theme={null}
const ws = new WebSocket("wss://raptor-beta.solanatracker.io/stream");

ws.onopen = () => {
  ws.send(JSON.stringify({
    type: "subscribe",
    id: "sol-usdc-quote",
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: 100000000,
    slippageBps: "50",
    maxHops: 2,
    dexes: "raydium,meteora,whirlpool"
  }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  if (msg.type === "subscribed") {
    console.log(`Subscribed: ${msg.id}`);
  }

  if (msg.type === "quote") {
    console.log(`Quote update: ${msg.data.amountOut}`);
  }
};
```

***

## 8. 流式准备签名的兑换交易

如需实时报价更新加上预构建好的最新交易,请使用 `/stream/swap`。

此流需要 `userPublicKey`,因为 Raptor 会为该钱包构建交易。

```javascript theme={null}
const ws = new WebSocket("wss://raptor-beta.solanatracker.io/stream/swap");

ws.onopen = () => {
  ws.send(JSON.stringify({
    type: "subscribe",
    id: "sol-usdc-swap",
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: 100000000,
    userPublicKey: "YOUR_WALLET_ADDRESS",
    slippageBps: "50",
    txVersion: "v0",
    priorityFee: "medium",
    wrapUnwrapSol: true,
    maxHops: 2
  }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  if (msg.type === "swap") {
    console.log(`Updated quote: ${msg.quote.amountOut}`);
    console.log(`Swap tx: ${msg.swapTransaction}`);
    console.log(`Last valid block height: ${msg.lastValidBlockHeight}`);
  }
};
```

`/stream/swap` 在 10 个 slot 没有更新后会重发最新交易,以帮助避免交易过期。

***

## 端到端流程

1. 用 `inputMint`、`outputMint`、`amount` 和可选路由控制调用 `/quote`。
2. 将返回的 `quoteResponse` 与 `userPublicKey` 一起传入 `/swap`。
3. 在钱包中签名返回的 `swapTransaction`。
4. 将已签名的 base64 交易提交到 `/send-transaction`。
5. 轮询 `/transaction/{signature}` 获取状态。

如果希望减少往返次数,请使用 `/quote-and-swap` 代替分开的 `/quote` 和 `/swap` 调用。

<CardGroup cols={2}>
  <Card title="Raptor 概览" href="/cn/raptor/overview">
    完整端点参考、支持的 DEX、路由控制和 WebSocket 细节。
  </Card>

  <Card title="Raptor 交易" href="/cn/raptor/transactions">
    通过 Raptor 发送已签名的交易并追踪确认状态。
  </Card>
</CardGroup>
